我有以下广播接收器来捕获用户在设备上卸载应用程序时的事件,从技术上讲,我收到了行动ACTION_PACKAGE_REMOVED的意图:
public class appUninstallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent)
{
if (intent != null) {
if (intent.getAction().equals(intent.ACTION_PACKAGE_REMOVED)) {
try {
String packageName = intent.getData().toString();
//Logcat shows the packageName is "com.XXX.YYY"
Log.v("debug",packageName);
PackageManager packageManager = context.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0);
//Got NameNotFoundException
Log.v("debug",packageInfo.versionName);
}catch(NameNotFoundException e){
e.printStackTrace();
}
}
}
}
}
上述接收器运行良好,但当它尝试使用packageInfo.versionName
提取卸载应用程序(包)的版本名称时, NameNotFoundException 正在上升。
我得到的packageName
是“com.XXX.YYY”,这正是我正在卸载的应用程序的包名。但是为什么我无法使用上面的代码获取版本名称?
(顺便说一下,当app卸载开始时会触发上面的接收器,是因为系统在开始卸载之前已经删除了元数据吗?)
答案 0 :(得分:3)
但是为什么我无法使用上面的代码获取版本名称?
您会注意到操作名称(ACTION_PACKAGE_REMOVED
)过去时。操作名称不是ACTION_PACKAGE_REMOVING
,ACTION_PACKAGE_WILL_BE_REMOVED_IN_THE_FUTURE
或ACTION_PACKAGE_USER_WANTS_TO_REMOVE_THIS_PACKAGE_WHICH_WE_WILL_DO_ANY_MINUTE_NOW
。
The documentation也使用过去时:
现有的应用程序包已从设备中删除。
因此,如果正在卸载应用程序,则在发送此广播时设备上不存在该应用程序,因此无法通过PackageManager
使用该应用程序。
答案 1 :(得分:-1)
尝试使用此代码获取正在卸载的应用程序包名称:
Uri uri = intent.getData();
String pkg = uri != null ? uri.getSchemeSpecificPart() : null;
System.out.println("Pakcge Removed: " + pkg);
答案 2 :(得分:-1)
你可以使用这个广播公司:
public class UninstallHelper extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Uri uri = intent.getData();
String packageName = uri != null ? uri.getSchemeSpecificPart() : null;
Bundle b = intent.getExtras();
int uid = b.getInt(Intent.EXTRA_UID);
boolean replacing = b.getBoolean(Intent.EXTRA_REPLACING);
Toast.makeText(context, "Package removed: " + packageName + " " + uid + "; replacing: " + replacing, Toast.LENGTH_LONG).show();
}
}
然后在清单中:
<receiver android:name="braadcasters.UninstallHelper">
<intent-filter android:priority="999">
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<action android:name="android.intent.action.UID_REMOVED" />
<data android:scheme="package"/>
</intent-filter>
</receiver>