聆听并回应ANR?

有什么方法可以在您的应用程序触发ANR(应用程序无响应)时得到通知? 类似于默认的exception处理程序?

在预期“你会用它做什么”的答案,只是日志。 不“做”任何事情。

Solutions Collecting From Web of "聆听并回应ANR?"

不。与您的进程虚拟机中发生的exception情况不同,ANR由系统监视程序在虚拟机之外生成。 Google提供有关触发器和回避的信息

我一直在想这个。 你可以做以下事情,虽然它相当沉重。 ANR写出一个线程文件到一个通常可读的目录:

/data/anr/traces.txt

您可以在不同的进程中有一个服务,定期轮询该文件。 如果date发生变化,并且您的应用位于顶部,那么您可能有ANR事件。

不过,我并不十分确定这个文件的格式。

由于系统看门狗不警告应用程序,应用程序本身可以拥有自己的看门狗。 步骤很简单,只需启动一个线程,循环执行以下操作:

  1. 安排小代码尽快在UI线程上运行。
  2. 等待X秒(你决定)。
  3. 查看代码是否已经运行:如果已经运行,请返回到1
  4. 如果代码没有运行,则意味着UI线程已被阻塞至lessX秒,并引发UI线程堆栈跟踪exception

我已经写了一个小型的图书馆,这个图书馆和ACRA一起使用。

我希望它有帮助;)

您可以使用监听日志的服务(最好是前台服务),并且如果有日志显示ANR,则处理它。

这里是导致ANR的一个应用程序的小样本:

... findViewById(R.id.button).setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { try { Thread.sleep(10000); } catch(final InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); ... 

这里是我从logcat获得的日志,当我得到了ANR:

 08-03 13:02:37.746: E/ActivityManager(158): ANR in com.example.anr (com.example.anr/.MainActivity) 08-03 13:02:37.746: E/ActivityManager(158): Reason: keyDispatchingTimedOut 08-03 13:02:37.746: E/ActivityManager(158): Load: 6.19 / 2.37 / 0.86 08-03 13:02:37.746: E/ActivityManager(158): CPU usage from 5598ms to 0ms ago: 08-03 13:02:37.746: E/ActivityManager(158): 2.6% 158/system_server: 2.5% user + 0.1% kernel / faults: 86 minor 08-03 13:02:37.746: E/ActivityManager(158): 0.5% 298/com.android.phone: 0.3% user + 0.1% kernel / faults: 15 minor 08-03 13:02:37.746: E/ActivityManager(158): 0% 35/rild: 0% user + 0% kernel 08-03 13:02:37.746: E/ActivityManager(158): 4.6% TOTAL: 3.9% user + 0.6% kernel 08-03 13:02:37.746: E/ActivityManager(158): CPU usage from 2029ms to 2654ms later: 08-03 13:02:37.746: E/ActivityManager(158): 11% 158/system_server: 4.8% user + 6.4% kernel / faults: 2 minor 08-03 13:02:37.746: E/ActivityManager(158): 11% 192/InputDispatcher: 4.8% user + 6.4% kernel 08-03 13:02:37.746: E/ActivityManager(158): 1.6% 163/Compiler: 1.6% user + 0% kernel 08-03 13:02:37.746: E/ActivityManager(158): 1.6% 193/InputReader: 0% user + 1.6% kernel 08-03 13:02:37.746: E/ActivityManager(158): 18% TOTAL: 9.3% user + 9.3% kernel 

所以,是的,我认为这是可能的。