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:
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