2011-12-19 104 views
1

有没有办法知道谁是应用程序调用者?谁在调用/启动/停止我的Android应用程序?

这些是几个用例案例:

  • 我有一个应用程序,它的一个小部件。应用程序未运行。一旦我添加/删除小部件,系统调用应用程序运行(调用Application.onCreate()等)。所以我需要知道,这不是一个按下图标来运行应用程序的用户,但是这是一个需要更新小部件的系统。
  • 当内存不足时,系统会杀死应用程序,然后在有足够内存时再将其恢复。问题与上面相同。
  • 更多类似案例...

,我可以管理的唯一情况是BootUpReceiver是从BroadcastReceiver延长。只有在这种情况下,我确信应用程序由“启动时启动”功能运行。

我需要确定 - 谁(服务,接收者,意图等)为什么要调用我的应用程序。

有没有办法知道调用者来源或调用者ID或有关服务或任何其他谁调用我的应用程序运行的信息?

+0

请尝试更改您的问题 – 2011-12-19 14:00:26

+0

我是否正确理解您的情况:您已描述可能导致应用程序运行的场景,并且您希望在运行时知道触发启动的事件你的申请? – appas 2011-12-19 15:17:17

+0

是的,绝对正确。 – 2011-12-19 15:28:50

回答

2

正如@CommonsWare已经提到:

更好的答案是重新设计你的应用程序,你不关心为什么你的代码正在运行。

但实际上你可以得到为什么你的应用程序被称为倾销的信息查询一个总体思路。您可以使用下面的代码来做到这一点:

public static void dumpMainLooper(Context context) { 
    Looper looper = context.getMainLooper(); 
    try { 
     looper.dump(new Printer() { 
      @Override 
      public void println(String s) { 
       Log.d(LOG_TAG, "- " + s); 
      } 
     }, "AppMainLooperDump"); 
    } catch (Throwable th) { 
     Log.d(LOG_TAG, "App Main Looper error", th); 
    } 
} 

不应使用此代码对你的应用程序的任何“逻辑”,但你可以用它来完成调试和/或记录得到一个总体思路约由Intent由系统发送到您的应用程序来启动它。你应该尽可能早地调用此方法,并在日志中,你会看到这样的事情:

Looper{41ff0388} 
mRun=true 
mThread=Thread[main,5,main] 
[email protected] 
    Message 0: { what=100 when=-438ms obj=ActivityRecord{41ff43e0 [email protected] {com.your.package/com.your.package.MainActivity}} } 
    Message 1: { what=132 when=+9s911ms } 
(Total messages: 2) 

消息ñ - 这是这是由系统发送到您的应用程序一个消息。在这里你会看到不同的消息,这个消息应该给你一个关于你的应用程序调用者的一般想法。

1

我需要知道确切的 - 谁(服务,为什么等)调用应用程序。

为什么?你有详细的情景说明,但没有理由。

有没有办法知道调用者来源或调用者ID或关于服务或任何其他谁调用我的应用程序运行的信息?

不是。主要的例外是,如果你有一个绑定到客户端的服务,并且客户端在你的Binder上调用一个方法,你的Binder可以找到调用它的进程的UID。此外,您可以在某些地方找到调用者是否拥有某种权限。

但更好的答案是让您重新设计您的应用程序,使您不必关心为什么您的代码正在运行。

+1

“为什么?你对场景有详尽的解释,但没有理由。” - 是的,对于这些情况(以及其他一些情况),我在启动时有一些检查点,但我认为这不是一个正确的方法。我只是不希望应用程序由一些意外情况(例如更新小部件或任何其他Android)运行,因为在这种情况下,应用程序开始连接到网络并执行其意外的逻辑。 – 2011-12-20 11:14:56

相关问题