此文章为了验证Android 8.0 安装,卸载和更新一个应用时广播的接受状态, 主要是更新一个应用时都会接收到那些广播, 先接收到那些广播, 下面就以一个简单的例子来验证这些:
public class PackageInstallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//接收安装广播
if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
String packageName = intent.getData().getSchemeSpecificPart();
Log.e("cjl","install app packageName = "+packageName);
}
//接收卸载广播
if (intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)) {
String packageName = intent.getData().getSchemeSpecificPart();
Log.e("cjl","uninstall app packageName = "+packageName);
boolean isReplace = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
Log.e("cjl","isReplace = "+isReplace);
}
//接收升级更新广播
if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
String packageName = intent.getData().getSchemeSpecificPart();
Log.e("cjl","upgrade app packageName = "+packageName);
}
}
public IntentFilter getIntentFilter() {
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");
return intentFilter;
}
public void register(Context context) {
context.registerReceiver(this, getIntentFilter());
}
public void unregister(Context context) {
context.unregisterReceiver(this);
}
}
新建一个广播接收器, 监听安装, 卸载和更新的广播, Android 在 8.0 之后禁止使用静态注册的方式去注册这些广播, 只能动态注册, 下面是代码:
public class MainActivity extends AppCompatActivity {
private PackageInstallReceiver mReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mReceiver = new PackageInstallReceiver();
mReceiver.register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
mReceiver.unregister(this);
}
}
结果如截图所示:
安装流程
只收到安装广播
卸载广播
只收到卸载广播
更新流程:
更新的时候先收到卸载的广播, 然后收到安装的广播, 最后收到更新的广播