监听应用的安装、卸载及更新
Android的系统没有孤立的应用,一个完全与手机上其它应用毫无关系的应用很少(比如:计算器)。得益于Android应用生态圈的建设:阿里系的APP、头条系的APP等都会相互之间通过DeepLink、ContentProvider、Intent等进行关联互动。
一旦有关联就需有变数,比如手机上安装应用A,功能依赖应用B,现在B被卸载了,A需要知道。当B被重新安装上,A需要及时更新状态。当然在功能逻辑实现上可以通过判断应用是否安装、功能所依赖的应用版本是否支持等条件进行限制。
1、机制
应用安装、卸载、更新后系统会发送一条广播,分别如下:
//安装
public static final String ACTION_PACKAGE_ADDED = "android.intent.action.PACKAGE_ADDED";
//卸载
public static final String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
//覆盖安装
public static final String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED";2、监听
注册BroadcastReceiver监听上面的广播即可。广播接收器的具体用法及注意事项见《BroadcastReceiver:广播的使用》。
BroadcastReceiver receiver = new Receiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.intent.action.PACKAGE_ADDED");
intentFilter.addAction("android.intent.action.PACKAGE_REMOVED");
intentFilter.addAction("android.intent.action.PACKAGE_REPLACED");
//获取包名
intentFilter.addDataScheme("package");
registerReceiver(receiver, intentFilter);在接收到应用发生变化时收到广播,在onReceiver()方法中获取应用信息:
@Override
public void onReceive(Context context, Intent intent) {
//只是演示,并不严谨
String packageName = intent.getDataString();
if (TextUtils.equals(Intent.ACTION_PACKAGE_ADDED, intent.getAction())) {
Log.d(TAG, "监听到应用安装:" + packageName);
}
if (TextUtils.equals(Intent.ACTION_PACKAGE_REMOVED, intent.getAction())) {
Log.d(TAG, "监听到应用卸载:" + packageName);
}
if (TextUtils.equals(Intent.ACTION_PACKAGE_REPLACED, intent.getAction())) {
Log.d(TAG, "监听到应用更新:" + packageName);
}
}getDataString()获取到的string数据格式为:
package:包名
注意:覆盖安装,我这里测试用的是-r命令:先卸载原来的,在安装新的apk,最后发送一条更新完成的广播。
adb install -r test.apk

