本文主要是介绍如何让应用在清除内存时保持运行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近在写聊天软件。一个聊天软件需要做到在清除内存时仍能保持其应有的状态。
首先,我尝试在应用的Service中的onDestroy()进行重启应用,经过测试,发现被强制清除内存的应用不会调用Service的onDestroy,只会调用activity的onDestroy(),于是我决定在触发activity的onDestroy( )处发送广播给应用的静态广播接收器,然后让广播接收器进行处理。然而,我发现被强制停止的应用广播接收器将接收不到广播。通过查阅相关资料,被强制停止的应用是广播是无用的。
在android3.1以后的版本中,如果程序被强制停止后应用状态会被标记为STOPPED,此时应用无法收到其他应用的广播,要等到应用再开启一次,将STOPPED去掉以后才可以。除此之外还有一个解决方法如下:
解决办法:
在广播发发送方发送广播时需要设置Intent.FLAG_INCLUDE_STOPPED_PACKAGES
示例代码:
Intent intent = new Intent(); intent.setAction("com.leeliwei.test.receiver.action.test"); if (android.os.Build.VERSION.SDK_INT >= 12) {intent.setFlags(32);//3.1以后的版本需要设置Intent.FLAG_INCLUDE_STOPPED_PACKAGES } sendBroadcast(intent);
于是在广播中我添加了该flags,通过测试,发现广播接收器已经能接收到广播。接着我在广播中进行了相关的处理:
ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> list = activityManager.getRunningTasks(100);
for (RunningTaskInfo info : list)
{
if (info.topActivity.getPackageName().equals(MY_PKG_NAME)|| info.baseActivity.getPackageName().equals(MY_PKG_NAME))
{
isappRun=true;
}
}
if(!isappRun)
{
MyConstants.ISFORCESTOP=true;
Intent activityintent=new Intent(context, MainActivity.class);
activityintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(activityintent);
}
因为一个应用中有多个activity,可能会多次调用onDestroy并发送广播,所以广播需要过滤处理,只需要对当前应用被杀死的情况进行处理。
经过多次测试,发现在一定的情况下实现了app的重启。
可是,在大部分测试中,发现由于应用被杀死太快,以至于广播接收器未处理便已经被进程杀死。目前为止,我还没有找出很好的解决方法,希望大家一起探讨出解决方法,一起进步~··~
这篇关于如何让应用在清除内存时保持运行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!