Android 監聽APK安裝和卸載使用靜態註冊廣播無效怎麼辦

問題原因

Android 高版本在AndroidManifest.xml文件中靜態註冊廣播接收失效的原因是官方對耗電量的優化,避免APP濫用廣播。
除了少部分的廣播仍支持靜態註冊(如開機廣播),其餘的都會出現失效的情況。

解決方案

使用動態註冊廣播
MainActivity

import android.content.IntentFilter;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private AppStateReceiver appStateReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


    }

    @Override
    public void onStart(){
        super.onStart();
        appStateReceiver = new AppStateReceiver();
        IntentFilter filter = new IntentFilter();

        filter.addAction("android.intent.action.PACKAGE_ADDED");
        filter.addAction("android.intent.action.PACKAGE_REMOVED");
        filter.addDataScheme("package");

        this.registerReceiver(appStateReceiver, filter);
    }

    @Override
    public void onDestroy(){
        if(appStateReceiver != null) {
            this.unregisterReceiver(appStateReceiver);
        }
        super.onDestroy();
    }
}

AppStateReceiver

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class AppStateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if("android.intent.action.PACKAGE_INSTALL".equals(action)){
            String packageName = intent.getDataString();

            System.out.println("安裝了 :" + packageName);
        }else if("android.intent.action.PACKAGE_REMOVED".equals(action)){
            String packageName = intent.getDataString();
            System.out.println("卸載了 :" + packageName);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章