我希望当我在设备中启动任何应用程序时它应该通知我(以编程方式)。运行(启动)时是否可以获得任何应用程序的通知。
问问题
695 次
2 回答
3
您可以通过ActivityManager#getRunningAppProcesses获取当前正在运行的进程。但是,如果您的设备没有植根,则绝对不可能在应用程序启动时收到通知。
当 Android 启动一个新应用程序时,Zygote 会 fork 一个新进程:
static void Dalvik_dalvik_system_Zygote_forkAndSpecialize(const u4* args,
JValue* pResult)
{
pid_t pid;
pid = forkAndSpecializeCommon(args, false);
RETURN_INT(pid);
}
您可以修改和替换 libdvm.so。
任何动态链接的程序都会在启动时访问某些文件,例如动态链接器。这对于安全目的是没有用的,因为它不会在静态链接的程序上触发,但可能仍然很有趣:
#include <stdio.h>
#include <sys/inotify.h>
#include <assert.h>
int main(int argc, char **argv) {
char buf[256];
struct inotify_event *event;
int fd, wd;
fd=inotify_init();
assert(fd > -1);
assert((wd=inotify_add_watch(fd, "/lib/ld-linux.so.2", IN_OPEN)) > 0);
printf("Watching for events, wd is %x\n", wd);
while (read(fd, buf, sizeof(buf))) {
event = (void *) buf;
printf("watch %d mask %x name(len %d)=\"%s\"\n",
event->wd, event->mask, event->len, event->name);
}
inotify_rm_watch(fd, wd);
return 0;
}
这需要 root 权限,因此使用 JNI 和 root 设备,您将能够做到这一点。
于 2013-03-02T07:42:27.053 回答
2
不,这实际上是不可能使用公共 SDK 的。
充其量,您可以不断地轮询ActivityManager以获取位于顶部的前台进程,并记录下来。但是,它不是最准确或最有效的方法。
于 2013-03-02T06:58:17.450 回答