Android APP存活检测方式
作者:devyok 发布时间:2023-10-14 10:02:41
稍微深入了解过Android的开发者都知道,Android中每个APP的中的所有组件的生命周期状态都是由ActivityManagerService(简称:AMS)进程来维护的,所以当某个APP被kill或意外crash时,AMS进程会第一时间维护APP的组件。
我们今天不会看AMS进程维护APP的流程,只看AMS是通过什么手段第一时间得到的通知,我们是否能够将这种手段应用到我们的APP中,在多进程环境下,通过这种手段进程间互相监控起到一个守护的作用。
我们知道一个APP对应唯一一个ActivityThread,这也是一个APP的真正的入口,当ActivityThread#main执行时,就会附着到AMS进程,后续就由AMS进程维护APP的状态。那么关键点就在attach上。
见以下代码:ActivityManagerService#attachApplicationLocked()
private final boolean attachApplicationLocked(IApplicationThread thread,
int pid) {
...
final String processName = app.processName;
try {
AppDeathRecipient adr = new AppDeathRecipient(
app, pid, thread);
<span style="background-color: rgb(255, 255, 51);"><strong>thread.asBinder().linkToDeath(adr, 0);</strong></span>
app.deathRecipient = adr;
} catch (RemoteException e) {
app.resetPackageList(mProcessStats);
startProcessLocked(app, "link fail", processName);
return false;
}
...
return true;
}
上面被高亮显示的这行代码,就是关键点。 使用的是IBinder#linkToDeath来完成的。linkToDeath方法的第一个参数接收一个android.os.IBinder.DeathRecipient的接口实现,用来接收app death的通知。
当然也可以通过IBinder#unlinkToDeath来取消监听。
感兴趣的同学,可以进入源码查看详细的注释,这里就不在贴注释。 源码中DeathRecipient的实现是AppDeathRecipient来完成的, 这个处理中主要是AMS来清理当前APP进程对应的组件资源。
通过上面的了解,在我们的APP中要使用以上手段,多个进程之间要起到守护对方的作用,可能就需要得到对方的IBinder对象。
获取IBinder对象的方法,参考如下:
1.通过Context#bindService,在onServiceConnected上接收IBinder对象;
2.通过创建android.os.Messenger对象,然后通过intent将此对象传递给对方进程;
3.直接new Binder重写onTransact,然后通过intent将此Binder对象传递给对方进程;
来源:https://blog.csdn.net/degwei/article/details/51475642


猜你喜欢
- 1. 原理每一个线程对应一个消息队列MessageQueue,实现线程之间的通信,可通过Handler对象将数据装进Message中,再将消
- 本文实例为大家分享了java后台批量下载文件并压缩成zip下载的具体代码,供大家参考,具体内容如下因项目需要,将服务器上的图片文件压缩打包z
- 之前的文章向大家介绍了几个项目中常用的实用功能,那么在这篇文中,我将向大家介绍如何获取Android手机中已经安装的手机应用程序,好了,废话
- 先给大家展示下关于仿支付宝钱包首页中带有分割线的gridview,俗称九宫格 的效果图,怎么样是不是和你想象的一样啊。在你的预料之中就继续访
- 题目给定count=0;让5个线程并发累加到1000;思路创建一个类MyRunnable,实现Runnable(继承Thread类也可)定义
- /*同步函数当函数中的代码全部放在了同步代码块中,那么这个函数就是同步函数*///同步函数的锁是this锁,this是一个引用,this指向
- 本来准备在ListView的每个Item的布局上设置一个隐藏的Button,当滑动的时候显示。但是因为每次只要存在一个Button,发现每个
- 原理UI设计的时候一般会按照一个固定的尺寸进行设计,如 360 x 690 ,实际设备分辨率可能是 Google Pixel: 1080 x
- 将DataGrid中上面这个表头变成下面的两行表头,你会怎么实现?很巧妙地截断和补充td tr来实现来源:http://www.cnsend
- 场景:最新的leakCanary2.8.1:debugImplementation 'com.squareup.leakcanary
- 双保险线程,每次启动2个相同的线程,互相检测,避免线程死锁造成影响。两个线程都运行,但只有一个线程执行业务,但都会检测对方的时间戳 如果时间
- 本文介绍在使用C#开发WinForm窗体程序时,如何设置窗体的大小不能被改变。我们在开发一个窗体(WinForm)程序时,所有的控件都部署在
- 背景系统: SpringBoot开发的Web应用;ORM: JPA(Hibernate)接口功能简述: 根据实体类ID到数据库中查询实体信息
- 前言前面几篇文章已经为 Input 系统的分析打好了基础,现在是时候进行更深入的分析了。通常,手机是不带键盘的,但是手机上仍然有按键,就是我
- 本文实例为大家分享了ToolBar的使用方法,供大家参考,具体内容如下ToolBar时应用的标准工具栏;用来替代ActionBar;使用To
- spring和mybatis整合整合思路需要spring通过单例方式管理SqlSessionFactory。spring和mybatis整合
- 将字母全部转换为大写或小写,在C#编程中是一个非常常见的功能。在开发过程中,经常需要验证用户登录,用户在输入用户名时可能不区分大小写,如果我
- 话说为了防止 * ,业内有不成文规定,手机公司在做camera时,点击拍照和录像键的时候,必须要有提示音。因此,google也就非常人性化的将
- 引言 在多线程中,为了使线程安全,我们经常会使用synchronized和Lock进行代码同步和加锁,但是具体两者有什么区别,什
- 本文实例讲述了WinFrom中label背景透明的实现方法,在应用程序开发中有着不错的实用价值。分享给大家供大家参考。具体实现方法如下:使用