【问题标题】:If a wakelock is acquired and my app crashes, what should I do?如果获取了唤醒锁并且我的应用程序崩溃了,我该怎么办?
【发布时间】:2012-08-16 23:51:56
【问题描述】:

当标志设置为 true 时,我的应用程序始终运行后台服务。如果是这种情况,即使应用程序关闭,此后台服务仍需要 CPU 时间。 如果我获得了唤醒锁(不是为了“屏幕开启”的目的,而是为了这个后台服务),然后应用程序崩溃或用户 FC 它,那么我无法释放这个唤醒锁。

预期的结果是什么?

Android 是否知道这一点并释放唤醒锁?

我应该如何处理这种情况?

【问题讨论】:

    标签: android process crash wakelock kill-process


    【解决方案1】:

    这类问题也可能发生在 Android 的其他方面。作为我个人遇到的一个例子,如果您不释放相机对象并且您的应用程序崩溃,那么相机将在用户重新启动之前不可用。您可以像这样处理这些类型的情况:

    // Store the default uncaughtexceptionhandler in a variable.
    private Thread.UncaughtExceptionHandler previousHandler = Thread.currentThread().getUncaughtExceptionHandler(originalExceptionHandler);
    
    
    @Override
    public void onCreate(Bundle bundle){
        Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler(){
    
            @Override
            public void uncaughtException(Thread thread, Throwable ex) {
                try{ 
                   // release your wakelock here.
                }
                catch(Exception e){ 
                   // log 
                }
                finally{
                   thread.setUncaughtExceptionHandler(previousHandler);
                   previousHandler.uncaughtException(thread, ex);
                   thread.setUncaughtExceptionHandler(previousHandler);
                };
            }
    
        }); 
    }
    

    您在这里所做的是在遇到异常时覆盖正常的崩溃行为,并让自己有时间在应用程序完全崩溃并且您没有希望恢复之前释放真正需要清理的任何问题点。

    【讨论】:

    • 好吧,你设置了“默认”而不是 setUncaughtExceptionHandler 来覆盖任何 Thread 的异常处理程序,对吧?但这不会影响其他应用程序的未捕获异常吗?我猜你正在设置默认的 exc。整个操作系统的处理程序...
    • 你能不能像@cesarmax 建议的那样只设置单个线程的UncaughtExceptionHandler
    • 你可以。我会修改答案。
    猜你喜欢
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    相关资源
    最近更新 更多