背景
允许应用程序要求用户回答决定卸载它们的原因可能对应用程序很有用。
问题
似乎Dolphin 网络浏览器应用程序(和“我的一切启动器”)以某种方式设法绕过它,现在每次卸载应用程序时它都会显示一个网页(在默认网络浏览器上)。
即使我使用 ADB 卸载也会发生这种情况。
作为用户,我真的很讨厌它,但它仍然很有趣,因为据我所知,应用程序无法获得卸载自身的意图。
问题
怎么会这样?他们是如何克服这一点的?
这是黑客吗?
允许应用程序要求用户回答决定卸载它们的原因可能对应用程序很有用。
似乎Dolphin 网络浏览器应用程序(和“我的一切启动器”)以某种方式设法绕过它,现在每次卸载应用程序时它都会显示一个网页(在默认网络浏览器上)。
即使我使用 ADB 卸载也会发生这种情况。
作为用户,我真的很讨厌它,但它仍然很有趣,因为据我所知,应用程序无法获得卸载自身的意图。
怎么会这样?他们是如何克服这一点的?
这是黑客吗?
也许应用程序有一个后台服务,当它自己的 onDestroy() 回调被触发时检查前台应用程序,如果前台应用程序是 android 包安装程序的卸载活动,它会为网页启动一个新的意图?
我的猜测是他们正在使用 ACTION_PACKAGE_REMOVED。
http://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_REMOVED
要么就是这样,要么是 Robin Hood 和 Frei Tuck 方法,每个人都在收听对方的广播事件。
只是一个猜测,但会调查它。
这可能是一个选项:应用程序如何检测到它将被卸载?
请尝试通过 ActivityManager 获取任务中的 top Activity,并检查是否为卸载 Activity。
核心代码:
ComponentName topActivity = mActivityManager.getRunningTasks(1).get(0).topActivity;
String packageName = topActivity.getPackageName();
String className = topActivity.getClassName();
Log.v(TAG, "packageName" + packageName);
Log.v(TAG, "className" + className);
if ("com.android.packageinstaller".equals(packageName)
&& "com.android.packageinstaller.UninstallerActivity".equals(className)) {
//Do anything you want here
}