以编程方式处理 Android 应用删除
Handle Android App removing programmatically
我正在尝试处理应用程序删除。
我的 AndroidManifest.xml
看起来像这样:
<uses-permission android:name="android.permission.GET_TASKS"/>
<receiver android:name=".receivers.UninstallIntentReceiver">
<intent-filter android:priority="0">
<action android:name="android.intent.action.QUERY_PACKAGE_RESTART" />
<data android:scheme="package" />
</intent-filter>
</receiver>
UninstallIntentReceiver.java
public class UninstallIntentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// fetching package names from extras
LogUtils.i("HK_LOG " + this.getClass().getSimpleName(), "onReceive");
String[] packageNames = intent.getStringArrayExtra("android.intent.extra.PACKAGES");
if(packageNames!=null){
for(String packageName: packageNames){
if(packageName!=null && packageName.equals("com.betconstruct.sportsbookModule")){
// User has selected our application under the Manage Apps settings
// now initiating background thread to watch for activity
new UninstallActivity(context).start();
}
}
}
}
}
当应用程序停止时,onReceive()
方法被调用,但是当应用程序处于 运行 时,onReceive()
方法没有被调用。
在这种情况下 onReceive()
被称为:
但在这种情况下 onReceive()
是 而不是 :
如果我点击关闭按钮(来自设置,我用箭头显示的图片),之后 onReceive()
方法被调用。
我觉得我一定要请教如何处理这个动作,解决这个问题。
任何类型的建议都会对我有所帮助。谢谢。
I am trying to handle app removing.
我不确定 android.intent.action.QUERY_PACKAGE_RESTART
是否是您需要的意图。
来自javadocs:
Ask system services if there is any reason to restart the given package. The data contains the name of the package.
这看起来像是系统服务所需的操作,它甚至没有文档。另请注意 @hide
注释,这意味着此操作未公开给 public API,您不应该依赖它。
您感兴趣的实际操作应该是android.intent.action.PACKAGE_REMOVED
。
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package"/>
</intent-filter>
</receiver>
如果我理解你的问题是正确的,那么你正试图在同一个应用程序中处理删除应用程序的操作,这意味着你希望 Sportsbook 应用程序中 BroadcastReceiver
的 onReceive()
方法是用户删除 Sportsbook 应用程序后立即触发。这是不可能的,因为当用户卸载您的应用程序时,您所有的应用程序数据、apk、类 都将被删除,因此不再存在该接收器。
如果您尝试检测从另一个应用程序中删除应用程序(假设您有 2 个应用程序,并且您想要跟踪用户是否删除了您的其中一个应用程序),那么这是有道理的,onReceive()
将按预期调用。
我正在尝试处理应用程序删除。
我的 AndroidManifest.xml
看起来像这样:
<uses-permission android:name="android.permission.GET_TASKS"/>
<receiver android:name=".receivers.UninstallIntentReceiver">
<intent-filter android:priority="0">
<action android:name="android.intent.action.QUERY_PACKAGE_RESTART" />
<data android:scheme="package" />
</intent-filter>
</receiver>
UninstallIntentReceiver.java
public class UninstallIntentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// fetching package names from extras
LogUtils.i("HK_LOG " + this.getClass().getSimpleName(), "onReceive");
String[] packageNames = intent.getStringArrayExtra("android.intent.extra.PACKAGES");
if(packageNames!=null){
for(String packageName: packageNames){
if(packageName!=null && packageName.equals("com.betconstruct.sportsbookModule")){
// User has selected our application under the Manage Apps settings
// now initiating background thread to watch for activity
new UninstallActivity(context).start();
}
}
}
}
}
当应用程序停止时,onReceive()
方法被调用,但是当应用程序处于 运行 时,onReceive()
方法没有被调用。
在这种情况下 onReceive()
被称为:
但在这种情况下 onReceive()
是 而不是 :
如果我点击关闭按钮(来自设置,我用箭头显示的图片),之后 onReceive()
方法被调用。
我觉得我一定要请教如何处理这个动作,解决这个问题。
任何类型的建议都会对我有所帮助。谢谢。
I am trying to handle app removing.
我不确定 android.intent.action.QUERY_PACKAGE_RESTART
是否是您需要的意图。
来自javadocs:
Ask system services if there is any reason to restart the given package. The data contains the name of the package.
这看起来像是系统服务所需的操作,它甚至没有文档。另请注意 @hide
注释,这意味着此操作未公开给 public API,您不应该依赖它。
您感兴趣的实际操作应该是android.intent.action.PACKAGE_REMOVED
。
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package"/>
</intent-filter>
</receiver>
如果我理解你的问题是正确的,那么你正试图在同一个应用程序中处理删除应用程序的操作,这意味着你希望 Sportsbook 应用程序中 BroadcastReceiver
的 onReceive()
方法是用户删除 Sportsbook 应用程序后立即触发。这是不可能的,因为当用户卸载您的应用程序时,您所有的应用程序数据、apk、类 都将被删除,因此不再存在该接收器。
如果您尝试检测从另一个应用程序中删除应用程序(假设您有 2 个应用程序,并且您想要跟踪用户是否删除了您的其中一个应用程序),那么这是有道理的,onReceive()
将按预期调用。