Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在我处理一个未捕获的异常后,如何阻止我的应用程序僵尸化?_Android_Exception Handling - Fatal编程技术网

Android 在我处理一个未捕获的异常后,如何阻止我的应用程序僵尸化?

Android 在我处理一个未捕获的异常后,如何阻止我的应用程序僵尸化?,android,exception-handling,Android,Exception Handling,我正在通过以下方式处理我的应用程序中出现的任何未捕获异常: Thread.setDefaultUncaughtExceptionHandler(this); 这是我的启动程序活动,实现了UncaughtExceptionListener。我处理异常并将其发送到日志服务器,但是,我的应用程序并没有结束。它只是像僵尸一样运行,直到按下home或back按钮。处理异常后,如何终止进程 编辑 下面是一个测试和工作活动,它抛出一个未捕获的异常,该异常将被(线程)捕获并处理。一旦记录了异常,toast将永

我正在通过以下方式处理我的应用程序中出现的任何未捕获异常:

Thread.setDefaultUncaughtExceptionHandler(this);
这是我的启动程序活动,实现了UncaughtExceptionListener。我处理异常并将其发送到日志服务器,但是,我的应用程序并没有结束。它只是像僵尸一样运行,直到按下home或back按钮。处理异常后,如何终止进程

编辑
下面是一个测试和工作活动,它抛出一个未捕获的异常,该异常将被(线程)捕获并处理。一旦记录了异常,toast将永远不会被发布,并且进程将变成僵尸

class TestActivity extends Activity implements UncaughtExceptionListener {

    @Override public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        Thread.setDefaultUncaughtExceptionHandler(this);
        throw new RuntimeException("I'm a destuctive booger.");

        setContentView(R.layout.activity_test);
    }

    @Override public void uncaughtException(Thread thread, Throwable toss) {
        Log.e(TAG, "An uncaught exception has been recieved.", toss);
        Toast.makeText(this, "Big Error", Toast.LENGTH_LONG).show();
    }
}

不确定是否有更温和的方法处理此问题,但您可以尝试:

import android.os.Process;

Process.killProcess(Process.myPid());

我对您的示例代码进行了一些测试,发现
finish()
将在
uncaughtException()
中工作。它是无声的,因此不会向用户提供任何反馈,而且,与您一样,我无法调用
Toast
或任何其他可视消息框,即使使用
getApplicationContext()

发送任何反馈的唯一方法是使用
NotificationManager
上下文发送状态栏
通知

我没有花太多时间在它上面,但不幸的是,这似乎意味着当用户单击通知本身时,必须提供一个
pendingent
。如果为
pendingent
设置的
Activity
会生成未处理的异常,则使用相同的
Activity
执行此操作显然会有无限循环的风险


但是,可以创建一个不同的基本
活动
,可能会打开一个对话框主题来解释崩溃。

在处理程序方法中调用
finish()
。您可能还想提供一个弹出对话框来通知用户。@MisterSquonk,不行,我的上下文被清空了。我最初让它烤出一条严重的错误消息,但烤面包不会产生错误。然后我试了一个广播接收器,但也没用。对不起,我不明白。您说
是您的启动器
活动
,因此如果处理程序方法是
活动
的一部分,为了处理它,您必须有一个“正在运行的”
活动
Activity
Context
的一个间接子类,这一事实(用面向对象的术语)意味着
Activity
Context
@MisterSquonk。在这里,我用一个仍然正确显示我的问题的示例更新了我的问题。嗯
finish()
确实有效,但我想到的提醒用户的最好方法是使用
NotificationManager
使用
getApplicationContext()
上下文发送状态栏
通知。不幸的是,这意味着当用户单击通知本身时,必须提供一个
pendingent
。对不起,我找不到其他工作了。