关于安全退出已创建多个Activity的应用

最初看到这个问题,是在一道面试题上。
不同与其他面试题,我觉得这道题很具有实际意义。所以先实际操作下,解决这个问题。
在此,我也啰嗦一下,大概说说解决这个问题的几种方案:

1,借助系统的API
首先,2.2以前和2.2以后采用的方法是不同的。但都是针对系统级别的东西进行操作。从进程和包的角度来达到此效果。
所以需要添加授权,但是遗憾的是,这些方法涉及底层,而且在我们的应用中是起不到效果的。
这个方案被我排除了。

2,抛出异常,Force Close
这个我觉得很不靠谱。这确实能一下子退出应用。
但是,其一:不能保证所有的Activity都被finish;其二:Force Close的窗口,这个是很糟糕的,当然可以重写一些方法,使不弹出这个窗口。
这个方案也被我排除了。

3,递归退出
使用startActivityForResult打开新的Activity,并加上标识。
在onActivityResult中进行处理,递归关闭。
这个方式我不是很清楚其具体做法,感觉有些复杂。

4,发送特定广播
这个办法是我最赞同的,但是实际操作起来确遇到了问题。
首先看onReceive(Context context, Intent intent)方法,
可以通过context取得ActivityManager,之后取得当前运行的task的信息,看起来离成功不远了。
Activity是被组织在task中的,获得了task信息,那是不是就可以取得其中的Activity实例?
先看看代码:

//通过context获取系统服务,得到ActivityManager
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
//获取当前运行中的TaskInfo
//获取的是一个List集合,也就是说当前系统中的task有多个,在我测试代码中有2个
//关于该方法的参数,我从源码看了下,是指返回集合的最大可能条目数,实际返回数可能
//小于这个数目,取决于用户启动了几个task
List<ActivityManager.RunningTaskInfo> tasks = manager.getRunningTasks(10);

包含task信息的是一个ActivityManager的静态内部类,RunningTaskInfo。
不过从中能取得的信息有限:

//task栈底的Activity
ComponentName baseActivity = task.baseActivity;
//task栈顶的Activity
ComponentName topActivity = task.topActivity;

这就有两个问题,
其一,无法取得task中的每一个Activity
其二,不能取得Activity的实例
我的研究到此止步,希望有达人能为我解惑。

5,记录每一个创建的Activity,这也是我最后采用的方法。
为入口Activity添加一个静态的List<Activity>,
之后,每一个Activiity的onCreate方法中,将自身加入这个List,
当程序退出时,遍历这个List,执行finish方法

for (Activity act : MainActivity.tasks) {
if(!act.isFinishing()){
act.finish();
}
}
MainActivity.tasks = null;

测试了一下,能达到效果。
但是还是有一点担心,这就是Activity成员变量的生命周期问题,
当该成员变量的生命周期大于Activity的生命周期,就有可能造成内存泄露。
不知这样的解决方案有没有这个问题。请高手指教。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值