gpt4 book ai didi

android - 谁在调用/启动/停止我的 Android 应用程序?

转载 作者:行者123 更新时间:2023-11-29 18:15:13 25 4
gpt4 key购买 nike

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

这些是几个用例:

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

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

我需要确定地知道 - 谁(什么服务、接收者、 Intent 等)为什么调用我的应用程序。

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

最佳答案

正如@CommonsWare 已经提到的:

the better answer is to redesign your application such that you do not care why your code is being run.

但实际上您可以通过转储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);
}
}

不应将此代码用于您应用中的任何“逻辑”,但您可以将其用于调试和/或日志记录以获得关于Intent 由系统发送到您的应用以启动它。你应该尽早调用这个方法,在日志中你会看到这样的东西:

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 - 这是一条由系统发送到您的应用程序的消息。在这里您会看到不同的消息,这些消息应该让您大致了解您的应用程序的调用方。

关于android - 谁在调用/启动/停止我的 Android 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8562188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com