【问题标题】:Who is calling/starting/stoping my Android app?谁在呼叫/启动/停止我的 Android 应用程序?
【发布时间】:2011-12-19 13:41:10
【问题描述】:

有没有办法知道谁是应用程序调用者?

这些是几个用例:

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

我可以管理的唯一情况是BootUpReceiver,它是从BroadcastReceiver 扩展而来的。只有在这种情况下,我才能确定应用程序是由“启动时启动”功能运行的。

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

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

【问题讨论】:

  • 请尝试改写您的问题
  • 我是否理解正确:您所描述的场景可能会导致应用程序运行,并且您希望在运行时知道触发应用程序启动的事件?
  • 是的,完全正确。
  • 在您确定的案例中,您从 getCallingActivity() 中得到了什么?

标签: android android-intent android-widget android-service


【解决方案1】:

正如@CommonsWare 已经提到的:

更好的答案是重新设计您的应用程序,这样您就不必关心为什么要运行您的代码。

但实际上,您可以通过转储MainLooper 的消息查询来大致了解为什么调用您的应用程序。您可以使用以下代码来执行此操作:

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);
    }
}

您不应该将此代码用于应用程序中的任何“逻辑”,但您可以将其用于调试和/或日志记录,以大致了解系统发送的 Intents到您的应用程序以启动它。你应该尽早调用这个方法,在日志中你会看到这样的内容:

Looper{41ff0388}
mRun=true
mThread=Thread[main,5,main]
mQueue=android.os.MessageQueue@41ff03a8
  Message 0: { what=100 when=-438ms obj=ActivityRecord{41ff43e0 token=android.os.BinderProxy@41ff3b78 {com.your.package/com.your.package.MainActivity}} }
  Message 1: { what=132 when=+9s911ms }
(Total messages: 2)

Message N - 这是系统向您的应用发送的消息。在这里,您将看到不同的消息,这些消息应该让您大致了解应用的调用者。

【讨论】:

    【解决方案2】:

    我需要确定 - 谁(什么服务、为什么等)在调用应用程序。

    为什么?您对场景有详尽的解释,但没有理由。

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

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

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

    【讨论】:

    • “为什么?你对场景有详尽的解释,但没有理由。” - 是的,对于这些情况(和其他一些情况),我在启动时有一些检查点,但我认为这不是正确的方法。我只是不希望应用程序在某些意外情况下运行(例如更新小部件或任何其他 Android 具有),因为在这种情况下应用程序开始连接到网络并执行意外的逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多