当Android设备中的任何应用程序启动时,是否可以获得通知

时间:2013-03-02 06:25:46

标签: android

我希望当我在设备中启动任何应用程序时,它应该通知我(以编程方式)。 是否可以在运行(启动)时获得任何应用程序的通知。

2 个答案:

答案 0 :(得分:3)

您可以按ActivityManager#getRunningAppProcesses获取当前正在运行的流程。但是,如果在没有让您的设备生根的情况下启动应用程序,则无法获得通知。

当Android启动一个新应用程序时,Zygote将分叉一个新进程:

static void Dalvik_dalvik_system_Zygote_forkAndSpecialize(const u4* args,
    JValue* pResult)
{
    pid_t pid;

    pid = forkAndSpecializeCommon(args, false);

    RETURN_INT(pid);
}

您可以修改和替换libdvm.so。

Another approach

任何动态链接的程序都会在启动时访问某些文件,例如动态链接器。这对于安全目的来说是无用的,因为它不会触发静态链接的程序,但可能仍然有意义:

#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设备,您将能够执行此操作。

答案 1 :(得分:2)

不,使用公共SDK无法实现这一点。

最好的情况是,你可以不断地为正确的前台进程轮询ActivityManager,并记录下来。但是,它不是最准确,最有效的方法。