Android:本地代码可以从android系统获得广播意图吗?

最近我见过一个有趣的应用程序 – 照片奇迹。 当这个应用程序被卸载,它显示一个网页调查页面,要求卸载应用程序的原因。 现在,这是问题。 据我所知,应用程序已被删除后,系统广播ACTION_PAKAGE_REMOVED意图。 但是这个有趣的应用程序能够显示我的网页,虽然官方文档说: “正在安装的软件包没有收到这个意图。 无论如何,我可以find一个进程检查应用程序的某种状态。

现在是这个问题。 原生的应用程序能从android系统捕获广播的意图吗? 如果可能,请告诉我如何! 🙁

Solutions Collecting From Web of "Android:本地代码可以从android系统获得广播意图吗?"

我相信我已经知道他们是如何做到的。 这是难题的部分。

  1. 任何Android应用程序都可以通过调用Runtime.exec()函数来启动一个进程。

     Runtime.getRuntime().exec("chmod 755 '/data/data/my.app/files'/native_code"); 

    这行代码被执行后,会产生另一个进程。 这个进程和应用程序本身在同一个linux用户下运行。

  2. 当用户打开设置 – >应用程序 – >我的应用程序,然后按下“强制停止”button,主应用程序进程被终止托pipe本机程序 (见上文)的进程仍然运行 。 我个人认为这是一个安全问题,我将把它报告给AOSP。

  3. 这样的本地程序可以无限运行,什么都不做 – 只是睡觉。 但是在进入睡眠之前,它会注册一个终止信号处理程序,当系统将要终止程序时,它将被调用。

     int main(void) { signal(SIGTERM, termination_handler); while(1) { sleep(10); } } void termination_handler(int sig) { // handle termination signal here } 
  4. 现在你应该已经知道最后一块了,对吗? 我的本地termination_handler应该能够启动浏览器。 我没有在代码中尝试这个,但我认为这是可能的,因为我可以使用adb shell做如下

     adb shell am start -a android.intent.action.VIEW -d http://www.google.com 

现在回到海豚浏览器如何做的问题。 安装应用程序并至less启动一次。 一旦开始,它使用上述原则注册本机卸载监视器。 要查看它,请连接到设备并打开adb shell 。 然后调用ps来查看进程列表。 您将看到两个类似于以下的进程

  u0_a109 315 ... mobi.mgeek.TunnyBrowser u0_a109 371 ... /data/data/mobi.mgeek.TunnyBrowser/files/watch_server 

正如你可以看到它启动一个watch_server本地程序,这是它的apk文件的一部分。 现在打开海豚浏览器的App info页面,然后按"Force Stop" 。 切换回terminal并再次调用ps 。 你会看到没有mobi.mgeek.TunnyBrowser进程,但watch_server仍然运行。

顺便说一下,这种方法只能工作,如果监视器服务器一直运行。 为了确保它始终处于运行状态 ,这两个应用程序都需要“启动时运行”权限,他们在哪里启动监视器。

现在,当你卸载应用程序,Android停止属于这个应用程序的所有进程。 Watcher收到终止信号,并用预定义的URL打开浏览器,然后closures。

我可能在一些细节上看起来有些不同,但这个黑客背后的主要概念必须如上所述。

有可能是棘手的事情,像应用程序也有看守人服务。

您可以检查该应用程序使用的权限可能包含INSTALL和UNINSTALL权限。

怎么运行的:

  1. 而不是可能有2个应用程序包的单个应用程序。

  2. 因为当你安装它时,这个应用程序还安装了一些正在监视你的应用程序状态的服务

  3. 当您尝试卸载该应用程序时,会调用由该服务处理的系统广播,并检查您的包是否存在于已安装的应用程序中。

  4. 只要这个服务发现你的软件包不在列表中,它就会调用一个带有操作视图的意图,并用weburl来打开这个软件。