监听应用的安装、卸载及更新

QuibblerQuibbler 2020-07-05 约 5 分钟 2088 次阅读

监听应用的安装、卸载及更新

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

相关推荐