关于监听Android中Apk的卸载安装的广播主要分两种来讲,主要分为Android8.0之前的和Android8.0之后的版本,主要是还是因为Android8.0性特性引起的;
第一种:
Android 8.0之前的老系统版本,直接注册静态广播接受者即可实现;
新建广播接受者PackageInstalledReceiver:
public class PackageInstalledReceiver extends BroadcastReceiver {
private static final String TAG = "PackageInstalledReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.e(TAG, "APK动态广播!");
if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
String packageName = intent.getDataString();
Log.e(TAG, packageName + "安装成功");
} else if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
String packageName = intent.getData().getSchemeSpecificPart();
Log.e(TAG, packageName + "替换成功");
} else if (intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)) {
String packageName = intent.getData().getSchemeSpecificPart();
Log.e(TAG, packageName + "卸载成功");
}
}
}
在AndroidManifest.xml 添加
<receiver
android:name=".PackageInstalledReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
注意:一定要添加这个标签和属性值:<data android:scheme="package" /> //直接复制添加即可,不要改天任何参数;
第二种:
Android 8.0之后的版本,需要动态注册广播接收器,不能再清单文件中静态注册了;
例如:在Activity中oncreate方法中添加register();
private void register() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
intentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
intentFilter.addDataScheme("package");
registerReceiver(new PackageInstalledReceiver(), intentFilter);
}
为了防止内存泄漏,动态注册广播别忘了注销注册的广播;
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
不同的操作发送不同的广播如下:
新安装
安装新APP发送的广播:android.intent.action.PACKAGE_ADDED
升级
覆盖安装APP发送的广播:
android.intent.action.PACKAGE_REMOVED //先卸载
android.intent.action.PACKAGE_ADDED //在安装
android.intent.action.PACKAGE_REPLACED //替换完成
卸载
卸载APP发送的广播:android.intent.action.PACKAGE_REMOVED