Android 卸载程序包(应用程序)时获取其版本名
当用户在设备上卸载应用程序时,我有以下广播接收器来捕获事件,从技术上讲,我收到了行动的意图: 上述接收器工作正常,只是当它试图用Android 卸载程序包(应用程序)时获取其版本名,android,android-layout,android-intent,android-emulator,android-package-managers,Android,Android Layout,Android Intent,Android Emulator,Android Package Managers,当用户在设备上卸载应用程序时,我有以下广播接收器来捕获事件,从技术上讲,我收到了行动的意图: 上述接收器工作正常,只是当它试图用packageInfo.versionName提取卸载应用程序(软件包)的版本名时,NameNotFoundException正在上升 我得到的packageName是“com.XXX.YYY”,这正是我正在卸载的应用程序的包名。但是为什么我不能用上面的代码获得版本名呢 (顺便问一下,上面的接收器是在应用程序卸载开始时触发的,是不是因为系统在开始卸载之前已经删除了元数据
packageInfo.versionName
提取卸载应用程序(软件包)的版本名时,NameNotFoundException正在上升
我得到的packageName
是“com.XXX.YYY”,这正是我正在卸载的应用程序的包名。但是为什么我不能用上面的代码获得版本名呢
(顺便问一下,上面的接收器是在应用程序卸载开始时触发的,是不是因为系统在开始卸载之前已经删除了元数据?)
但是为什么我不能用上面的代码获得版本名呢
您会注意到操作名称(action\u PACKAGE\u REMOVED
)是过去时。动作名称不是action\u PACKAGE\u REMOVING
,action\u PACKAGE\u将在未来被删除
,或者action\u PACKAGE\u USER\u想要删除这个我们现在随时都要做的包
也使用过去时:
已从设备中删除现有应用程序包
因此,如果正在卸载应用程序,则在发送此广播时,该应用程序在设备上不存在,因此将无法通过PackageManager
获取正在卸载的应用程序的软件包名称:
Uri uri = intent.getData();
String pkg = uri != null ? uri.getSchemeSpecificPart() : null;
System.out.println("Pakcge Removed: " + pkg);
您可以使用此广播机:
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>
文档中说“已有的应用程序包已从设备中删除”。这可能就是NameNotFoundException上升的原因。请告诉我您是如何捕获卸载事件的。我需要它,但我是否可以收到其他广播意图,我知道应用程序将被卸载,以便我仍然可以访问包版本名?或任何解决方法?@Mellon:“但是否有其他广播意图……”——与卸载无关。“或任何解决方案?”——因为我不知道真正的业务问题是什么,所以我不能建议解决方案。尝试确定设备上不再存在的应用程序的版本名有什么意义?
<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>