安卓:如何获取前台应用程序的进程ID

7

首先请注意,这个问题与我在SO上发现的所有“android前台应用程序”问题都不同,请继续阅读 :-)

我正在尝试使用golang编写一个android应用程序(仅供自己使用),而不使用android-sdk或ndk(这是关键点)。 这很简单,只需使用golang编写一个http服务,将其编译为arm CPU,然后访问http://localhost即可运行我的应用程序。

出于我的应用程序目的,我需要知道当前正在运行的前台应用程序,以准确定义它:

  1. 前台应用程序是占据屏幕或具有任何“活动”的应用程序(请原谅我不是android开发人员)。

  2. 与前台应用程序相关联的任何内容(例如服务)都不是我感兴趣的。

  3. 如果手机被锁定/屏幕关闭,我希望该解决方案告诉我没有前台应用程序。

由于我不使用任何android,只是将手机视为LINUX机器,因此我希望该解决方案使用本地LINUX方法,例如检查/proc,或通过调用任何已安装的android命令行工具(包括通过这些命令行工具发送消息)来解决问题,但不要使用任何SDK / NDK的方式,以便我不必使用java或将这些东西合并到我的应用程序中。


“前台应用程序是占据屏幕的应用程序” - 根据您的定义,可能会有多个“前台应用程序”。“我希望解决方案使用本地Linux方式” - 在Android中,大多数事情都无法通过“本地Linux方式”完成。 - CommonsWare
@CommonsWare 好的,更准确地说,我想要一个占据整个屏幕的应用程序,而不是显示天气信息的小部件... 我甚至可以接受不太准确的解决方案,例如如果某个应用程序具有更高的优先级,则可以合理地“猜测”为前台应用程序,我可以接受任何不依赖于android-sdk的解决方案。 为了澄清我的目的,我正在编写一个杀死后台应用程序或任何未经我的同意启动的应用程序的应用程序。 - xrfang
1
“我想要一个占据整个屏幕的应用,而不是显示天气信息的小部件” - 我指的是多窗口功能(在Android 7.0及以上的所有手机和平板电脑上添加了此功能,以及在此之前某些制造商特定的解决方案)。“我想编写一个在后台运行的服务,可以杀死任何未经我的同意启动的应用程序,因此我只想避免在使用应用程序时被杀死” - 这是HTTP守护程序的奇怪用法。无论如何,除非您的设备旧、已root或两者都是,否则使用SDK实现这一点将会很困难,更不用说没有SDK的情况下了。 - CommonsWare
你有ADB访问权限吗?或者更好的是,有root权限吗?请记住,您实际上可以通过回环上的ADB-WiFi进行自我连接,因此,如果设备至少拥有Android 11,则可以在每次重启后仅需最小的用户交互即可完成。 - Hack5
另外,您介意生成一个ART子进程来作为Go应用程序的Java代码子进程运行吗? - Hack5
显示剩余4条评论
1个回答

0
从Android SDK 26(如果我记得正确)开始,应用程序在“每个应用一用户”的模式下执行,因此(例如)WhatsApp 在 UID=30 上运行,Telegram 在 UID=76 上运行。因此,执行“ps -A -o PID,USER,NAME”命令可以解析输出,然后杀死您不想要执行的所有进程。
36119 u30_a149     <WhatsApp_packagename>
36203 u76_a211     <Telegram_packagename>
37399 root         [kworker/1:2H]
37423 u0_a329      su
38069 root         sh

没有根权限,你想要实现的任何目标都是不可能的,因为没有超级用户权限,无法拒绝执行应用程序或杀死它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接