Android APP存活检测方式
稍微深入了解过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对象传递给对方进程;
以上这篇Android APP存活检测方式就是小编分享给大家的全部内容了,希望能给大家一个参考。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Codeforces Round #628 (Div. 2) A~~D
- AtCoder Beginner Contest 160 A ~ E
- SwiftUI:创建底部导航栏 tabBar
- AtCoder Beginner Contest 168 C
- 关于 Executor 和 ExecutorService
- 【队伍训练】Codeforces Round #660 (Div. 2)
- 【队伍训练2】 AtCoder Beginner Contest 165
- C# 的sql server like 的参数
- sql server 字符串替换函数REPLACE
- sql server 更新两个表的某个字段
- HTML 引用Css样式的四种方式
- Java也可以像python般range出连续集合
- c# dev控件 gridcontrol 数据跟随鼠标滚轮滚动也可以编辑
- Apollo(阿波罗)配置中心Java客户端使用指南使用指南
- DevExpress.LookUpEdit控件实现自动搜索定位功能 兼使用方法(looUpEdit可编辑)