【问题标题】:Display Dialog after uncaught exception未捕获异常后显示对话框
【发布时间】:2017-07-22 16:09:22
【问题描述】:

在使用 unCaughtExceptionHandler 发生未捕获的异常后,我尝试以隐式意图启动活动。 Intent 应该在已崩溃的同一应用程序中将 Activity 作为 Dialog 启动。这对应于该线程中列出的示例:

Need to handle uncaught exception and send log file

我在自己的处理程序结束时调用原始的 unCaughtExceptionHandler,如下所示:

public class ThisApplication extends Application
{
    Thread.UncaughtExceptionHandler originalUncaughtExceptionHandler;

    @Override
    public void onCreate ()
    {
        originalUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();

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

    public void handleUncaughtException (Thread thread, Throwable e)
    {
        e.printStackTrace();

        Intent intent = new Intent ();
        intent.setAction ("de.mydomain.myapp.action.PROCESS_LOG");

        intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);

        if (intent.resolveActivity(getPackageManager()) == null) {
            Log.d("ThisApplication","No receiver");
        } else {
            Log.d("ThisApplication", "Intent start");
            startActivity(intent);
        }

        originalUncaughtExceptionHandler.uncaughtException(thread, e);
    }
}

结果是,出现异常后会显示标准对话框,上面写着“不幸的是,App xxx 已关闭”。在那个对话框的后面,在后台,我可以看到我的对话框应该以这个意图“PROCESS_LOG”开始。所以显然是启动了,但问题是,在标准对话框关闭后,我的自定义对话框也关闭了。如果我添加

android:launchMode="singleInstance"

在对话框活动的清单中,对话框也被隐藏了,但是当从最近的应用程序菜单中选择应用程序时,它可以再次被激活。这在我看来好像对话框没有完全独立于以前的应用程序进程/任务启动。

谁能说我做错了什么?

这是对话活动的清单部分:

<activity
    android:name=".ProcessLogActivity"
    android:windowSoftInputMode="stateHidden"
    android:theme="@style/ProcessLogActivity"
    android:process=":report_process"
    >
    <intent-filter>
        <action android:name="de.mydomain.myapp.action.PROCESS_LOG" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

对应的样式:

<style name="ProcessLogActivity" parent="@style/Theme.AppCompat.Light.Dialog">
</style>

这是 Dialog Activity 类:

public class ProcessLogActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature (Window.FEATURE_NO_TITLE);
        setFinishOnTouchOutside (false);
        Log.d("ThisApplication", "Intent received");
        setContentView(R.layout.activity_process_log);
    }
}

【问题讨论】:

  • 插入 ACRA 可能会更好。如果不出意外,请查看 ACRA 的实施并确定他们如何处理它。在未处理的异常期间执行此类操作很难正确处理,因为环境可能相当混乱(例如,OutOfMemoryError 是触发崩溃的原因)。
  • 感谢您的提示。我去ACRA看看。尽管如此,我真的很感兴趣为什么它不起作用,因为在另一个线程中,每个人似乎都让它运行了。但是,我用自己抛出的 Exception 对其进行了测试,所以一开始只是一个简单的“空”RuntimeException 来测试这个场景。
  • 您知道 ACRA 是否可以显示自定义对话框(片段)或显示为对话框的活动以显示报告数据并提供其他一些功能,例如保存报告?也许使用实现自己的报告发送器的集成功能?或者此时无法再显示任何其他自己的片段/对话/活动?
  • 感谢您提供此链接。我尝试使用带有内置对话功能的 ACRA,但我无法让它工作。但是显示“吐司”的内置功能有效!所以这就是为什么我问自己问题在哪里显示对话框。我使用以下@ReportCrashed 注释:

标签: android android-intent dialog uncaughtexceptionhandler


【解决方案1】:

问题是 - 至少在 ACRA-Dialog 的情况下 - 它无法正常工作,因为应用程序是使用 android studio 的内置功能进行调试的。因此,您必须在没有 android studio IDE 支持的情况下在 android 测试系统(在调试设备上)上启动应用程序。当您这样做并引发异常时,ACRA-Dialog 会按原样显示。

【讨论】:

    【解决方案2】:

    要发布完整的消息(评论太短),这里是完整的类和配置:

    我尝试使用具有内置对话功能的 ACRA,但无法正常工作。但是显示“吐司”的内置功能有效!所以这就是为什么我问自己问题在哪里显示对话框。我使用以下@ReportCrashed Annotation 进行测试:

    @ReportsCrashes(
        formUri = "http://yourserver.com/yourscript",
        mode = ReportingInteractionMode.NOTIFICATION,
        resDialogText = R.string.app_name,
        resNotifTickerText = R.string.app_name,
        resNotifTitle = R.string.app_name,
        resNotifText = R.string.app_name
    )
    

    在我自己的应用程序类中,我使用以下初始化:

    public class ThisApplication extends Application {
        @Override
        protected void attachBaseContext(Context base) {
            super.attachBaseContext(base);
    
            final ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(this);
            configurationBuilder.setBuildConfigClass(BuildConfig.class);
    
            final ACRAConfiguration config;
            try {
                config = configurationBuilder.build();
                ACRA.init(this, config);
            } catch (ACRAConfigurationException e) {
                e.printStackTrace();
            }
        }
    }
    

    我的应用使用两种不同的构建风格和两种构建类型“调试”和“发布”。

    当我抛出一个未处理的异常时,应用程序会关闭,并且有时只会在很短的时间内(不到半秒)显示一个对话框,然后整个应用程序会在没有任何对话框的情况下关闭。

    有什么想法吗?...

    编辑: 上面的注释是带有通知的尝试,它也不起作用。通知也只显示很短的时间,然后立即消失。对话框注解是:

    @ReportsCrashes(
        formUri = "http://yourserver.com/yourscript",
        mode = ReportingInteractionMode.DIALOG,
        resDialogText = R.string.app_name
    )
    

    这具有上述效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 2013-10-20
      • 2012-07-05
      相关资源
      最近更新 更多