今天在做Launcher项目时,需要显示所有app,并且点击调用,在调用时,遇到一个崩溃问题。在此做一记录。
问题:在本地写的一个demo应用,里面有一个bug,点击这个demo应用,应用崩溃。在launcher应用中也点击调用这个demo应用,demo应用崩溃后,我的launcher应用也跟着崩溃。但是异常日志报了一些其它的错误 ,我这里的错误是
Activity com.example.XXX .MainActivity has leaked IntentReceiver com.example.XXX.xxxView tha was originall registered here.Are you missing a call to unregisterReceiver()?
由于我的launcher程序中有用到Broadcast,所以我把所有注册Broadcast和unregisterReceiver的地方全部注释掉,但是问题依然没有解决,还是会导致我的launcher应用崩溃。所以继续查找原因后发现,在日志中,有两行黄色的日志,
PID:1696 , TID:4083 , Application : system_process Tag : ActivityManager
Text : Force finishing activity 1 com.example.demo/.MainActivity
PID:1696 , TID:4083 ,Application : system_process Tag : ActivityManager
Text : Force finishing activity 2 com.example.XXX/.MainActivity
PID:27009, TID:27009 ,Application : com.example.demo Tag :Process
Text : Sending signal. PID:27009 ,SIG:9
PID:1696 , TID:4083 ,Application : system_process Tag : ActivityManager
Text :Process com.example.vibrator (pid 27009) has died
原因是:
写代码中为了调试方便,我并没有在mainfest.xml中将属性设置为 launcher 中的android.intent.category.HOME
当demo程序崩溃后,由系统manager杀死了demo进程,同时,也将调用这个app的进程跟着杀死,导致我的lanucher崩溃。
由于我的程序是一个launcher程序,故我在mainfest.xml文件中将程序设置为launcher,再进行运行,这时,程序并没有退出。日志如下
PID:1696 , TID:4083 , Application : system_process Tag : ActivityManager
Text : Force finishing activity 1 com.example.demo/.MainActivity
这里只打印了一次,说明,系统并没有杀死我的launcher程序。
分析:当一个应用利用intent调用启动另一个进程的app时,如果这个app崩溃,系统会自动检测调用它的程序是不是一个launcher程序,如果是,那么就不将这个调用它的程序杀死,如果不是,则将调用者的进程也杀死。
对于跨进程通讯,这里不做分析,原因是 跨进程通讯是通过aidl调用Service接口来进行通讯,同时系统架构中设有程序保活功能。故即使调用另一个进程来通讯,即使它有bug,也不会造成本app跟着崩溃。(注:这里我也不懂,只是领导跟我这样解释的)