Lösen Sie das Problem, dass beim Empfang der Sendung ACTION_PACKAGE_REPLACED auch REMOVED und ADDED empfangen werden

Wiederkehr des Problems

Bei einem kürzlich durchgeführten Projekt ist ein Problem aufgetreten: Wenn die Software überschrieben und installiert wird, sendet das System nacheinander die folgenden Broadcasts: Fügen Sie hier eine Bildbeschreibung ein
Woher wissen wir also, dass die ADDED- und REMOVED-Broadcasts von REPLACED gesendete Aktionen sind?

Lösung

intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)

Damit kann festgestellt werden, ob Installation und Deinstallation aus Installationsbenachrichtigungen stammen. Der Code ist beigefügt:

public class AppReceiver extends BroadcastReceiver {
    
    

    private AppReceiverListener mAppReceiverListener;

    public interface AppReceiverListener {
    
    
        void added(String pageName);

        void remove(String pageName);

        void replaced(String pageName);
    }

    public void setAppReceiverListener(AppReceiverListener appReceiverListener) {
    
    
        mAppReceiverListener = appReceiverListener;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
    
    
        String action = intent.getAction();

        if (Intent.ACTION_PACKAGE_ADDED.equals(action) && mAppReceiverListener != null
                && !intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
    
    

            String pageName = intent.getData().getSchemeSpecificPart();
            mAppReceiverListener.added(pageName);
            Log.e("AppReceiver", ": ACTION_PACKAGE_ADDED 软件已安装");

        } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action) && mAppReceiverListener != null
                && !intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
    
    

            String pageName = intent.getData().getSchemeSpecificPart();
            mAppReceiverListener.remove(pageName);
            Log.e("AppReceiver", ": ACTION_PACKAGE_REMOVED 软件已卸载");

        } else if (Intent.ACTION_PACKAGE_REPLACED.equals(action) && mAppReceiverListener != null) {
    
    

            String pageName = intent.getData().getSchemeSpecificPart();
            mAppReceiverListener.replaced(pageName);
            Log.e("AppReceiver", ": ACTION_PACKAGE_REPLACED 软件已覆盖");

        }
    }
}

Die Idee stammt von:
Paketersetzungsprozess in Android

Supongo que te gusta

Origin blog.csdn.net/liuzhuo13396/article/details/119808278
Recomendado
Clasificación