app都有自己的更新逻辑,可以看到很多应用安装完之后会提示已删除安装包,或者卸载应用后删除缓存,所以知道何时被安装,何时被卸载很重要。
实现对应用安装卸载的监听
<receiver android:name=".InstallReceiver">
<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”>package参数必须填写,否则接收不到信息。
public class InstallReceiver extends BroadcastReceiver {
//downLoadFilePath 可以从SP中获取。
public static String downLoadFilePath = "";
@Override
public void onReceive(Context context, Intent intent) {
//接收安装广播
try {
//应用安装:第一次安装应用无法收到
if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED) || intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED) || intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)) {
String packageName = intent.getDataString();
LogUtil.d("InstallReceiver:packageName: "+packageName);
if (packageName != null && packageName.equals("package:"+UpdateUtil.getPackageName(context)) ){
File file = new File(downLoadFilePath);
if (file.exists()){
file.delete();
}
}
}else if(intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)){
//应用卸载:
// 应用被卸载时发出,正在被卸载的应用自身不会收到
// public static final String ACTION_PACKAGE_FULLY_REMOVED = "android.intent.action.PACKAGE_FULLY_REMOVED";
// 应用被完全卸载时发出(数据被删除)
}else if(intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)){
// 应用的新版本替代旧版本被安装
// public static final String ACTION_MY_PACKAGE_REPLACED = "android.intent.action.MY_PACKAGE_REPLACED";
// 应用的新版本替代旧版本被安装,只发给被更新的应用自己
// public static final String ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED";
// 应用被改变,譬如某些组件被disable/enable
}
} catch (Exception e) {
e.printStackTrace();
}
}
获取参数:
String packageName = intent.getDataString();
获取到的packageName 前边添加了"package: ",所以使用时需要注意。
注意:
广播接收者收到关于应用的广播,而这个广播是系统发出的,This is a protected intent that can only be sent by the system. 在以上Action中源码有注释。