【问题标题】:How does Dolphin web browser get notified when it's being uninstalled?Dolphin 网络浏览器在卸载时如何收到通知?
【发布时间】:2013-08-28 17:11:42
【问题描述】:

背景

允许应用程序要求用户回答决定卸载它们的原因可能很有用。

问题

似乎Dolphin web browser 应用程序(和“everything me launcher”)设法绕过它,现在每次卸载应用程序时它都会显示一个网页(在默认网络浏览器上)。

即使我使用 ADB 卸载也会发生这种情况。

作为用户,我真的很讨厌它,但它仍然很有趣,因为据我所知,应用程序无法获得卸载自身的意图。

问题

怎么可能?他们是如何克服这一点的?

这是黑客行为吗?

【问题讨论】:

  • 海豚是否使用设备管理员?
  • @PankajKumar 没有。它没有显示任何特殊的对话框。它似乎也没有检查正在运行的应用程序的权限,即使它有从日志中读取的权限,它也无法正常工作,因为我已经在 4.1.2 设备上对其进行了测试......
  • 那么我认为这是一个非常有趣的问题..
  • 这可能是我认为鲜为人知的解决方案。实际上,同一个应用程序会阻止用户清除应用程序数据并显示自己的屏幕,当我在一个应用程序上工作时,我正在寻找那个解决方案并找到了那个。所以我认为解决方案必须存在(没有任何黑客)......
  • @NitZRobotKoder 不,我什么都没找到。不过,知道他们是如何做到的还是很有趣的。

标签: android android-intent uninstallation


【解决方案1】:

也许应用程序有一个后台服务,当它自己的 onDestroy() 回调被触发时检查前台应用程序,如果前台应用程序是 android 包安装程序的卸载活动,它会为网页启动一个新的意图?

【讨论】:

  • 可能是,可能服务的流程与应用的流程不同。
  • 您可以在您的应用程序中拥有任何类型的服务,但即使它在单独的进程中运行,它也会与应用程序一起卸载。服务不是您可以单独安装/卸载的应用程序。我猜 ATM 应用程序正在被卸载,它的任何服务都会立即被杀死。所以它不会以这种方式工作。
  • 我认为服务和其他应用程序进程被回调和截止日期正确杀死,所以,如果应用程序正在共享存储(SD卡,闪存介质......)中写入,文件不会被损坏。
  • 也许吧。也有人说,也许他们用 NDK 来解决这个问题。
【解决方案2】:

我猜他们正在使用 ACTION_PACKAGE_REMOVED。 http://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_REMOVED 要么是这样,要么是 Robin Hood 和 Frei Tuck 方法,其中每个人都在收听对方的广播事件。
只是一个猜测,但会调查它。
这可能是一个选项:How can an app detect that it's going to be uninstalled?

【讨论】:

  • 不,被卸载的应用无法接收此意图。甚至文档都这么说:“正在安装的包没有收到这个 Intent。”
  • 发布后,我发现一个网站说这在 4.4 上不起作用但是,有 2 个程序仍然是合理的?!我以前做过,程序X寻找Y,Y寻找X,如果其中任何一个停止,另一个重新启动。
  • 应用不能(也不应该)强制用户安装另一个应用。它可以获得卸载另一个应用程序的事件,但这不是我在这里问的问题。你能告诉我你说的网站吗?
  • 嗯...各个网站的信息相互矛盾,让我在Eclipse上做一些测试,然后我会发布结果。
  • 我已经尝试过这个意图,如果这是您要问的 - 文档是正确的:它不会被发送到正在卸载的应用程序......
【解决方案3】:

请尝试通过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
}

【讨论】:

  • 我不认为他们是这样做的,因为即使使用 root 卸载也会触发它。我想知道为什么我现在在 Android 5.1 上看不到这种行为。难道他们已经停止了这种行为?
猜你喜欢
  • 2018-08-13
  • 2016-02-14
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
相关资源
最近更新 更多