如何通过运行时异常

时间:2015-07-24 20:25:21

标签: android alarm android-pendingintent runtimeexception

您好我想问一个我遇到的问题。

涉及:

活动生命周期,由未决意图触发的接收器(由警报生成)&运行时异常。

假设我得到了:

  • 注册了启动IntentService的BroadcastReceiver
  • 通过警报设置待处理的意图以调用BroadcastReceiver
  • 例如抛出运行时异常的Activity类代码的一部分(此处仅显示活动生命周期流和运行时异常中断的想法):

    @Override 
     protected void onCreate(Bundle savedInstanceState) {     
         super.onCreate(savedInstanceState); 
         if(true) { throw new RuntimeException("EXC"); 
     }
    
    @Override 
    protected void onStop() {
    
         // here we stop alarm or unregister receiver 
    }
    

我的观察:

  • 抛出异常后,正常的活动生命周期流被打破& ART正在重建“堆叠”
  • 在这种情况下警报无法取消!在设备重启之前仍然存在,因此会生成待处理的意图但是它的“启动条件”不符合正常的不间断流程
  • 无论运行时异常如何,BroadcastReceiver都保持活动状态(已注册),因此它会触发IntentService,异常生成非预期的空指针异常

问题:

  • 最好的方法是保证在抛出异常后取消注册接收器/停用孤立的未决意图(由警报产生?)以避免调用意图服务&产生进一步的异常,因为我提到android活动生命周期被中断所以它没有通过onPause / onStop方法,这通常用于取消注册接收器/停止警报/待定意图

我想到了什么想法(解决方案):

实现Thread.UncaughtExceptionHandler以取消注册接收器/停止警报???

编辑:

做了一些挖掘后:

  1. 有两种方法可以设置UncaughtExceptionHandler:

    • 首先应用于单个线程的“setUncaughtExceptionHandler”
    • 第二个“setDefaultUncaughtExceptionHandler”到VM中的所有线程。
  2. app框架已经提供了一个全局未捕获的异常处理程序。此处生成带有“AndroidRuntime”标记的异常跟踪,然后VM被终止:

    • 请参阅frameworks / base / core / java / com / android / internal / os / RuntimeInit.java。
  3. 首先是未捕获的例外

    • 由每个线程处理程序处理,
    • 然后是每线程组处理程序
    • 然后由全局处理程序。
  4. 当我在记忆中找到一些半死的东西时,我有两个选择:

    • 关闭VM,
    • 崩溃后停下来或者停下来,大概是通过使用“最终”块来确保一切都得到妥善处理。

    如果我指定全局,似乎很难管理,我将覆盖所有线程的应用程序框架的行为。

1 个答案:

答案 0 :(得分:0)

您应该尽可能强大地编码。这意味着在存在运行时异常的情况下,您不应该尝试清理,因为您永远不会填补所有空白。您需要做的是在以下位置添加健全性检查:

  • 您的IntentService - 它应该在启动时检查所有条件是否正确。
  • 您的BroadcastReceiver - 在调用onReceive()时,应检查所有条件是否正确。

如果您这样编码,则无需担心在所有错误情况下都能正确清理。