【问题标题】:android: Handle Application Crash and start a particular Activityandroid:处理应用程序崩溃并启动特定的活动
【发布时间】:2015-01-07 22:39:35
【问题描述】:

我有一个应用程序,如果应用程序在特定活动中崩溃,它会在中间父活动之一处重新启动。

这对我来说是个问题,因为我输入的一些用户信息在崩溃时丢失了。

有什么方法可以强制应用在崩溃重启后从启动器屏幕启动?

谢谢。

【问题讨论】:

  • 您是否尝试从该特定活动中省略 android.intent.category.DEFAULT 类别?这可能仅在您不想以隐式意图启动 Activity 时才有效。
  • @DenisLoh 这无济于事。标准的 Android 行为是在崩溃之前的 Activity 处重新启动应用程序。这与清单设置无关,您无法更改此行为。
  • 修复您的应用程序,使其不会崩溃。在需要的地方捕获异常并做一些智能的事情。除了使您的代码更健壮之外,对于不健壮的代码没有解决方法。
  • @DavidWasser 你是对的。但是,您永远不会编写永远不会崩溃的应用程序。因此,如果确实需要,您也可以尝试自定义 UncaughtExceptionHandler 并从那里重新启动您的活动。这必须小心完成,因为该活动中的错误会导致无限循环。

标签: android android-intent android-activity


【解决方案1】:

建议的解决方案 1 -

在 manifest.xml 文件中将此标签 android:clearTaskOnLaunch="true" 添加到您应该始终启动的主要活动中。

它不起作用的可能原因

当应用程序崩溃时,它会抛出一个Exception,我们需要处理Exception,否则我们将无法获得预期的行为

建议的解决方案 2

尝试处理任何未捕获的异常并告诉系统该做什么。要实现这一点,请尝试以下步骤。

  1. 创建一个扩展ApplicationClass的类
  2. 在您的 Application 子类中处理 uncaughtException
  3. 在您的启动器Activity 中,调用您的Application 类。
  4. 捕获异常后,启动您的主要Activity(根据您的要求)。

代码示例

第 1 步和第 2 步

package com.casestudy.intentsandfilter;

import android.app.Application;
import android.content.Intent;

public class MyApplication extends Application
{
    @Override
    public void onCreate() {

        super.onCreate();

        Thread.setDefaultUncaughtExceptionHandler(
            new Thread.UncaughtExceptionHandler() {
                @Override
                public void uncaughtException (Thread thread, Throwable e) {
                    handleUncaughtException (thread, e);
                }
            });
    }

    private void handleUncaughtException (Thread thread, Throwable e) {

        // The following shows what I'd like, though it won't work like this.
        Intent intent = new Intent (getApplicationContext(),DrawView.class);
        startActivity(intent);

        // Add some code logic if needed based on your requirement
    }
}

第 3 步

public class MainActivity extends Activity {

    protected MyApplication app;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        // Get the application instance
        app = (MyApplication)getApplication();

        .............
    }
}

第 4 步

根据您的要求修改以下方法

private void handleUncaughtException (Thread thread, Throwable e) {

    // The following shows what I'd like, though it won't work like this.
    Intent intent = new Intent (getApplicationContext(), HomeActivity.class);
    startActivity(intent);

    // Add some code logic if needed based on your requirement
}

【讨论】:

  • 您不能在未捕获的前任内启动 Activity,因为您的主线程已停止!
【解决方案2】:

我会推荐使用诸如

之类的库

https://github.com/Ereza/CustomActivityOnCrash

由于库负责处理其他内容以及不同版本的 android。

【讨论】:

    【解决方案3】:

    首先,在您的AndroidManifest.xml 中创建并设置App 类和

    android:name=".App"
    android:clearTaskOnLaunch="true"
    

    然后把这段代码放到App类中

    public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
         Thread.setDefaultUncaughtExceptionHandler(
                new Thread.UncaughtExceptionHandler() {
                    @Override
                    public void uncaughtException(Thread thread, Throwable e) {
                        Log.d("AppCrash", "Error just lunched ");
                    }
                });
    }}
    

    调试日志截图:

    【讨论】:

      【解决方案4】:

      也许没有办法做到这一点,但您可以标记它,以便知道活动是通过用户操作启动还是在崩溃后才启动。

      即当您启动父活动时,将某些内容传递给 startActivity 意图。如果不存在,则它是在崩溃后启动的。

      【讨论】:

        【解决方案5】:

        我设法用intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 像这样开始我的主要活动:

        private void handleUncaughtException (Thread thread, Throwable e)
          {
            Intent intent = new Intent (getApplicationContext(), MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
          }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-24
          • 2019-06-02
          • 1970-01-01
          • 1970-01-01
          • 2020-10-19
          • 1970-01-01
          相关资源
          最近更新 更多