Android Activity回收与操作超时处理

本文实例为大家分享了Android Activity回收与操作超时的处理,供大家参考,具体内容如下

1、Activity的回收

针对多个activity退出的处理

关键代码:

1)、新建活动管理类:

public class ActivityCollector { private static List<Activity> activityList = new ArrayList<Activity>(); public static void addActivity(Activity activity){ activityList.add(activity); } public static void removeActivity(Activity activity){ activityList.remove(activity); } public static void finishAllButLast(){ Activity activity = activityList.get(activityList.size()-1); removeActivity(activity); for (Activity activityItem: activityList){ if (!activityItem.isFinishing()){ activityItem.finish(); } } activityList.clear(); activityList.add(activity); } public static void finishAll(){ for (Activity activity: activityList){ if (!activity.isFinishing()){ activity.finish(); } } activityList.clear(); } }

2)、创建基类BaseActivity,并使所有的activity继承自该基类 。在创建时,添加到活动管理器,销毁时,从活动管理器中移除。

public class BaseActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityCollector.addActivity(this); } @Override protected void onDestroy() { super.onDestroy(); ActivityCollector.removeActivity(this); } }

如果需要销毁所有activity,只需调用finishAll()即可

2、操作超时处理

原理:

1)、在activity的stop函数中,根据app进程IMPORTANCE_FOREGROUND判断app在前台或后台
2)、在activity的onResume函数中,做超时检查。

关键代码:

abstract public class TimeOutCheckActivity extends BaseActivity { private boolean isLeave = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); pref = getSharedPreferences(Constant.CONFIG_NAME, Context.MODE_PRIVATE); } /** * 回调函数,方便测试 * @return */ abstract protected String getTag(); ......省略号...... /*** * 当用户使程序恢复为前台显示时执行onResume()方法,在其中判断是否超时. */ @Override protected void onResume() { // Log.i("Back",getTag() + ",onResume,是否在前台:" + isOnForeground()); super.onResume(); if (isLeave) { isLeave = false; timeOutCheck(); } } @Override protected void onStop() { super.onStop(); if (!isOnForeground()){ if (!isLeave && isOpenALP()) { isLeave = true; saveStartTime(); } } } public void timeOutCheck() { long endtime = System.currentTimeMillis(); if (endtime - getStartTime() >= Constant.TIMEOUT_ALP * 1000) { Util.toast(this, "超时了,请重新验证"); String alp = pref.getString(Constant.ALP, null); if (alp == null || alp == "") { } else { Intent intent = new Intent(this, UnlockGesturePasswordActivity.class); intent.putExtra("pattern", alp); intent.putExtra("login",false); //手势验证,不进行登录验证 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); // 打开新的Activity startActivityForResult(intent, Constant.REQ_COMPARE_PATTERN_TIMEOUT_CHECK); } } } public void saveStartTime() { pref.edit().putLong(Constant.START_TIME, System.currentTimeMillis()).commit(); } public long getStartTime() { long startTime = 0; try { startTime = pref.getLong(Constant.START_TIME, 0); }catch (Exception e){ startTime = 0; } return startTime; } /** * 程序是否在前端运行,通过枚举运行的app实现。防止重复超时检测多次,保证只有一个activity进入超时检测 *当用户按home键时,程序进入后端运行,此时会返回false,其他情况引起activity的stop函数的调用,会返回true * @return */ public boolean isOnForeground() { ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); String packageName = getApplicationContext().getPackageName(); List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses(); if (appProcesses == null) return false; for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) { if (appProcess.processName.equals(packageName) && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { return true; } } return false; } }

补充说明:

可以根据importance的不同来判断前台或后台,RunningAppProcessInfo 里面的常量IMTANCE就是上面所说的前台后台,其实IMOPORTANCE是表示这个app进程的重要性,因为系统回收时候,会根据IMOPORTANCE来回收进程的。具体可以去看文档。

public static final int IMPORTANCE_BACKGROUND = 400//后台 public static final int IMPORTANCE_EMPTY = 500//空进程 public static final int IMPORTANCE_FOREGROUND = 100//在屏幕最前端、可获取到焦点 可理解为Activity生命周期的OnResume(); public static final int IMPORTANCE_SERVICE = 300//在服务中 public static final int IMPORTANCE_VISIBLE = 200//在屏幕前端、获取不到焦点可理解为Activity生命周期的OnStart();

时间: 2024-12-09 23:21:55

Android Activity回收与操作超时处理的相关文章

Android Activity回收与操作超时处理_Android

本文实例为大家分享了Android Activity回收与操作超时的处理,供大家参考,具体内容如下 1.Activity的回收 针对多个activity退出的处理 关键代码: 1).新建活动管理类: public class ActivityCollector { private static List<Activity> activityList = new ArrayList<Activity>(); public static void addActivity(Activit

求教android activity启动模式singleInstance

问题描述 求教android activity启动模式singleInstance 下面这个例子里,为什么第一个例子有2个task第二个有3个task ? 我觉得都是2个... 谢谢! 程序有三个ActivityD1D2D3,三个Activity可互相启动,其中D2为singleInstance模式.那么程序从D1开始运行,假设D1的taskId为200,那么从D1启动D2时,D2会新启动一个task,即D2与D1不在一个task中运行.假设D2的taskId为201,再从D2启动D3时,D3的

我的Android进阶之旅------&amp;gt;Android Activity的singleTask加载模式和onActivityResult方法之间的冲突

         今天调试一个bug的时候,情景如下:           一个Activity A,需要用startActivityForResult方法开启Activity B.Activity B的launch mode被设置为singleTask,那么在Activity B开启之后的瞬间(未等B返回任何result),Activity A中的onActivityResult方法就会被调用,并且收到一个RESULT_CANCEL的request code.          然后在Acti

android activity跳转

问题描述 android activity跳转 有A.B.C.D 四个Activity ,每个Activity 都有相同的一个导航菜单,原理跟网站导航一样能任意跳转至其他的Activity, 我用的是StarActivity(intent)方法.这样的话问题出现了,每次的都是重新打开Activity.我想要的效果是,如果要跳转的那个Activity是已经打开过了的就直接像显示它,而不是重新去打开,请问有什么好的解决方法吗?谢谢!!!!!!!! 解决方案 看以看看这个链接google androi

浅谈Android Activity与Service的交互方式_Android

实现更新下载进度的功能 1. 通过广播交互 Server端将目前的下载进度,通过广播的方式发送出来,Client端注册此广播的监听器,当获取到该广播后,将广播中当前的下载进度解析出来并更新到界面上. 优缺点分析: 通过广播的方式实现Activity与Service的交互操作简单且容易实现,可以胜任简单级的应用.但缺点也十分明显,发送广播受到系统制约.系统会优先发送系统级广播,在某些特定的情况下,我们自定义的广播可能会延迟.同时在广播接收器中不能处理长耗时操作,否则系统会出现ANR即应用程序无响应

详解Android Activity之间切换传递数据的方法_Android

前面照着android系统的裁剪图片的功能自己写了一个相似的工具.功能是大体上实现了,但留下了一个调用的问题:如何从我的程序调用这个裁剪工具,并且获得裁剪后的图片呢? 其实这个也很简单了,就是intent的基础用法. 先上个图(界面依旧没优化,难看就难看吧): 起始activity,打开图片选择窗口,随便选择一张图片 下面是跳转到裁剪界面 按下crop按钮,退出activity,回到原来界面,并显示裁剪后的图 流程就是这样,也算模拟了系统裁剪功能的整体过程.下面就是实现功能的关键代码和说明了.

Android Activity之间相互调用与传递参数的原理与用法分析_Android

本文实例讲述了Android Activity之间的相互调用与传递参数.分享给大家供大家参考,具体如下: Activity之间是如何调用的 在javaWeb程序中,jsp与jsp之间的调用是通过重定向完成的,而在Android中,Activity与Activity之间的切换是通过Intent来完成的. 所谓Intent,它是Android中非常重要的内置组件,他可以理解为"我要干一件什么事情".在Android中有3大组件:Activity,Service.Broadcast,他们之间

Android Activity与Service通信(不同进程之间)详解_Android

在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activity中启动后台Service,通过Intent来启动,Intent中我们可以传递数据给Service,而当我们Service执行某些操作之后想要更新UI线程,我们应该怎么做呢?接下来我就介绍三种方式来实现Service与Activity之间的通信问题 Activity与Service通信的方式有三

Android Activity生命周期详解_Android

Activity 的生命周期. 一.理解Activity Activity是Android程序的4大组件之一. Activity是Android程序的表示层.程序的每一个显示屏幕就是一个Activity. 学过WEB开发的同学,可以把Activity理解成网页中的一个JSP文件:或者你可以把它理解成一个Windows的窗口. 下面看一下Activity类的继承关系:    从这里可以看到Activity是Context类的子类,大家对此先有个印象.  二.理解Activity的生命周期 手机最重