被后台杀死后,Android应用如何重新走闪屏逻辑
2018-01-05 17:28
489 查看
Android应用运行在后台的时候,经常被系统的LowMemoryKiller杀掉,当用户再次点击icon或者从最近的任务列表启动的时候,进程会被重建,并且恢复被杀之前的现场。什么意思呢?假如APP在被杀之前的Activity堆栈是这样的,A
知道恢复流程之后,如何处理呢?其实很简单,直接吊起闪屏页就可以了,不过这里有一点要注意的是,在启动闪屏页面的时候,必须要设置其IntentFlag:Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK,这样做的理由是为了清理之前的场景,不然之前的ActivityRecord栈仍然保留在ActivityManagerService中,具体实现如下,放在BaseActivity中就可以:
如果不设置会怎么样呢?举个例子,最常见的就是闪屏之后跳转主界面,主界面经常有router逻辑,并且其启动模式一般都是singleTask,处理一些推送,所以其onCreate跟onNewIntent都有相应的处理,如果不设置,在闪屏结束后,在startActivity启动主界面的时候,其实是先走恢复逻辑,然后走singleTask的onNewIntent逻辑,也就是说,onNewIntent跟onCreate是会同时调用的,也可能就会引发重复处理的逻辑,因此最好清理干净。
进程存活,Activity存活
进程存活,但是没有Activity存活
进程不存在(无论是否被杀)
其实后面两种完全可以看做一种,这个时候,都是要先start MainActivity,然后让MainActivity在其OnCreate中通过startActivityForResult启动SplashActivity,SplashActivity返回后,在start TargetActivity。下面的讨论都是针对后面两种,需要做的有两件事
一是:检测出后面两种场景,并且在唤起主界面的时候需要添加Intent.FLAG_ACTIVITY_CLEAR_TASK清理之前的现场
二是:在MainActivity的路由系统中,针对这两种场景要,先跳转闪屏,闪屏回来后,再跳转推送页
如何判断呢,后面两种场景其实只需要判断是否有Activity存活即可,也就是查查APP的topActivity是否为null,注意不要去向AMS查询,而是在本地进程中查询,可以通过反射查询ActivityThread的mActivities,也可以根据自己维护的Activity堆栈来判断,判断没有存活Activity的前提下,就跳转主页面去路由
在MainActivity的路由中,需要准确区分是否是推送跳转进来的,如果不是推送跳转进来,就不需要什么特殊处理,如果是推送跳转进来一定会携带跳转scheme数据,根据是否携带数据做区分即可,看一下MainActivity的代码:
通过上面两部分的处理,基本能够满足APP“死亡”的情况下,先跳转闪屏的需求。
作者:看书的小蜗牛
原文链接:被后台杀死后,Android应用如何重新走闪屏逻辑
仅供参考,欢迎指正
从最近的任务列表唤起,不走恢复流程
首先,APP端必须知道当前Activity的启动是不是在走恢复流程,Activity有一个onCreate方法,在ActivityThread新建Activity之后,会回调该函数,如果是从后台杀死恢复来的,回调onCreate的时候会传递一个非空的Bundle savedInstanceState给当前Activity,只要判断这个非空就能知道是否是恢复流程。@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); }
知道恢复流程之后,如何处理呢?其实很简单,直接吊起闪屏页就可以了,不过这里有一点要注意的是,在启动闪屏页面的时候,必须要设置其IntentFlag:Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK,这样做的理由是为了清理之前的场景,不然之前的ActivityRecord栈仍然保留在ActivityManagerService中,具体实现如下,放在BaseActivity中就可以:
Intent intent = new Intent(this, SplashActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent);
如果不设置会怎么样呢?举个例子,最常见的就是闪屏之后跳转主界面,主界面经常有router逻辑,并且其启动模式一般都是singleTask,处理一些推送,所以其onCreate跟onNewIntent都有相应的处理,如果不设置,在闪屏结束后,在startActivity启动主界面的时候,其实是先走恢复逻辑,然后走singleTask的onNewIntent逻辑,也就是说,onNewIntent跟onCreate是会同时调用的,也可能就会引发重复处理的逻辑,因此最好清理干净。
从推送唤起被杀APP时,如何走闪屏逻辑
对于推送消息的处理,其路由器一般放在MainActivity,并且在onCreate跟onNewIntent都有添加,如果APP存活的情况,可以直接跳转目标页面,如果APP被杀,这个时候,希望先跳转主界面,再跳转目标页面,在效果上来看就是,用户先看到目标页面,点击返回的时候再看到主界面,如果加上闪屏,希望达到的效果是先看到闪屏、点击返回看到目标页,再点击返回看到主页面。如果简单划分一下推送场景,可以看做一下三种进程存活,Activity存活
进程存活,但是没有Activity存活
进程不存在(无论是否被杀)
其实后面两种完全可以看做一种,这个时候,都是要先start MainActivity,然后让MainActivity在其OnCreate中通过startActivityForResult启动SplashActivity,SplashActivity返回后,在start TargetActivity。下面的讨论都是针对后面两种,需要做的有两件事
一是:检测出后面两种场景,并且在唤起主界面的时候需要添加Intent.FLAG_ACTIVITY_CLEAR_TASK清理之前的现场
二是:在MainActivity的路由系统中,针对这两种场景要,先跳转闪屏,闪屏回来后,再跳转推送页
如何判断呢,后面两种场景其实只需要判断是否有Activity存活即可,也就是查查APP的topActivity是否为null,注意不要去向AMS查询,而是在本地进程中查询,可以通过反射查询ActivityThread的mActivities,也可以根据自己维护的Activity堆栈来判断,判断没有存活Activity的前提下,就跳转主页面去路由
Intent intent = new Intent(this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.setDate(跳转的Uri scheme) startActivity(intent);
在MainActivity的路由中,需要准确区分是否是推送跳转进来的,如果不是推送跳转进来,就不需要什么特殊处理,如果是推送跳转进来一定会携带跳转scheme数据,根据是否携带数据做区分即可,看一下MainActivity的代码:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Uri uri= getIntent().getData(); <!--只有在intent被设置了跳转数据的时候才去跳转,一般是推送就来,如果冷启动,是没有数据的--> if(uri!=null){ SplashActivity.startActivityForResult(this,JUMP_TO_TARGET) } } <!--Intent.FLAG_ACTIVITY_CLEAR_TASK保证了onNewIntent被调用的时候,进程一定是正常活着的--> @Override protected void onNewIntent(Intent intent) { Uri uri= intent.getData(); intent.setData(null); router(uri); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode==JUMP_TO_TARGET && requestCode == RESULT_OK){ router(getIntent().getData()); getIntent().setData(null); } } private void router(Uri uri) { }
通过上面两部分的处理,基本能够满足APP“死亡”的情况下,先跳转闪屏的需求。
作者:看书的小蜗牛
原文链接:被后台杀死后,Android应用如何重新走闪屏逻辑
仅供参考,欢迎指正
相关文章推荐
- Android中如何杀死后台应用而不自启动
- android如何做到类似于微信那样后台服务不会被杀死?
- 如何把android后台应用调到前台
- 如何实现Android应用的启动画面(闪屏)?
- 如何反编译android应用并重新打包
- Android App如何判断应用是否在前台还是处于后台
- android如何做到类似于微信那样后台服务不会被杀死?
- Android中如何像 360 一样优雅的杀死后台服务而不启动
- 在android 5.0以上,如何判断当前应用是在前台还是后台
- 让一个Android应用一直运行在后台,不容易被杀死
- Android中如何像 360 一样优雅的杀死后台Service而不启动
- 在android 5.0以上,如何判断当前应用是在前台还是后台
- Android下如何杀死后台进程
- Android模拟内存紧张,应用被杀死如何模拟应用程序被杀掉? 更新:Daniel Lew指出,最简单的方法是在DDMS中点击”Stop Porcess”杀掉你的程序,在你调试程序的时候可以这样做。
- 【已解决】Android 如何让应用在后台运行
- Android 根据包名杀死应用后台进程
- Android中如何像 360 一样优雅的杀死后台Service而不启动
- 在android 5.0以上,如何判断当前应用是在前台还是后台
- Android中如何像 360 一样优雅的杀死后台服务而不启动
- Android 应用home键,来电或者其他方式进入后台运行,再次进入程序需要重新登录问题