android - 程序崩溃后取消警报

标签 android

我有一个后台服务,它设置重复警报,执行其任务并自行停止。然后,当闹钟唤醒时,它会再次启动服务。如果程序崩溃,警报仍然存在并唤醒警报广播接收器。有什么方法可以取消崩溃时的警报 - 我想我也许可以取消任何捕获的异常的警报,但其他原因呢?

或者当警报广播接收器被触发时,有什么方法可以判断设置它的程序是否崩溃了?

最佳答案

Activity 生命周期可以通过使用onDestroy()中的isFinishing()函数来检测“意外”终止的干净结束。打回来。您可以将其添加到应用程序中的每个 Activity 中:

protected void onDestroy () {
    boolean crashedOnLastClose = false;

    if (!isFinishing()) {
        // The application is being destroyed by the O/S
        crashedOnLastClose = true;

        // Store the result somewhere for the BroadcastReceiver to check later
        SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean("crashedOnLastClose", crashedOnLastClose);
        editor.commit();
    }
}

然后在您的 BroadcastReceiver 中,从 SharedPreferences 框架(或您决定存储它的任何位置)拉回结果,如果值为 true,则取消操作:

public class MyAlarmReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
        SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
        boolean crashedOnLastClose = settings.getBoolean("crashedOnLastClose", false);

        if (!crashedOnLastClose) {
            // No crash on last run, handle the alarm
            // ...
        }
    }
}

记住在下次启动时将其重置回 false!像这样的事情应该做:

protected void onCreate (Bundle savedInstanceState) {
    // Make sure this always resets to FALSE on launch
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putBoolean("crashedOnLastClose", false);
    editor.commit();
}

这应该捕获您的崩溃事件;但请记住,它还会检测您的应用程序强制关闭的其他时间 - 例如设备上的内存是否不足。要区分这些类型的事件,您需要检查系统状态以及 isFinishing()。

编辑 - 服务

您的服务有一个单独的生命周期,您必须将其视为一个单独的应用程序。正如您所注意到的,这里没有“isFinishing()”,但服务实际上非常简单,因为它们只是由您的代码干净地终止,您可以很容易地捕获它们。

在您的服务中,添加一个新的 bool 值(可能称为“isFinishing”),并在服务完成时将其设置为 true。然后也重写 onDestroy() 并添加类似于我为您的 Activity 描述的检查:

protected void onDestroy () {       
    // Store the result somewhere for the BroadcastReceiver to check later
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putBoolean("crashedOnLastClose", !isFinishing);
    editor.commit();
}

然后,广播接收器将使用我们之前添加的相同代码来检测服务或 Activity 是否崩溃。

关于android - 程序崩溃后取消警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6818333/

相关文章:

java - 使用按钮的 onClickListener 更改 textview 上的文本

android - 在 Fragment 中使用 volley 从 JSON 中获取数据

android - 共享我的 Android 应用程序的 apk 有什么危害吗?

android - 更改 libGDX 游戏的包标识符

java - ACTION_UP 不起作用,但 ACTION_DOWN 工作正常

android - 在 AutoCompleteTextView 中进行选择时崩溃

android - 如何在 Dialog Android 中添加移动进度微调器

android - 如何从 Xamarin 编写 firebase ServerValue.Timestamp

android - 在Titanium中,如何在指定位置添加 View

Android:暂停录音机并恢复