【问题标题】:Start a service from Thread.UncaughtExceptionHandler?从 Thread.UncaughtExceptionHandler 启动服务?
【发布时间】:2012-11-30 19:53:03
【问题描述】:

我正在尝试设置this answer 中提到的全局异常处理服务。这种方法听起来很合乎逻辑,因为在崩溃后,我自定义的Thread.UncaughtExceptionHandler 中的代码可能无法成功执行,原因可能是应用程序可能未处于稳定状态,或者可能没有足够的时间在进程被操作系统杀死之前。

不幸的是,这种方法似乎不起作用,因为服务在同一个进程中启动,所以它也被杀死了。如何从处理程序的uncaughtException() 启动服务?我可以强制服务在完全独立的过程中启动吗?


我正在Application 中设置我的自定义默认(VM 级别)异常处理程序,如下所示:

public class MyApp extends Application {    
    @Override
    public void onCreate() {
        Thread.setDefaultUncaughtExceptionHandler(
            MyExceptionReporter.getInstance(this));
        ...

在我的自定义处理程序中,我将像这样启动服务:

final Intent i = new Intent(MyExceptionService.INTENT);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra(MyExceptionService.EXTRA_STACK_TRACE,
    Log.getStackTraceString(ex));
mContext.startService(i);

该服务在AndroidMaifest.xml 文件中声明,并从应用程序的其他地方正常启动。

【问题讨论】:

    标签: android exception process android-service crash-reports


    【解决方案1】:

    啊,我想通了。关键是将 android:process 添加到清单中,这会强制服务在单独的进程中启动。这可以防止在应用程序被终止时服务被终止。

    <service
        android:name="your.package.blah.blah.MyExceptionService"
        android:process=":exception" >
        <intent-filter>
            <action android:name="your.package.blah.blah.REPORT" />
        </intent-filter>
        </service>
    

    【讨论】:

    • 你先生刚刚救了我的命
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多