首先,我以这种方式实现了BaseActivity.
public class BaseActivity extends AppCompatActivity { @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @OverrIDe public voID uncaughtException(Thread paramThread,Throwable paramThrowable) { Log.e("CRASH_REPORT","Activity crashed!"); System.exit(0); } }); }}
通过扩展BaseActivity,任何未捕获的异常最终都会被处理程序捕获. System.exit(0)将终止属于该应用程序的VM.
现在,我使用此层次结构创建了2个活动(均扩展了BaseActivity).
ParentActivity -> subactivity
在ParentActivity中,我只有一个按钮,点击后会启动subactivity(代码省略).
在subactivity.onCreate(…)中,我故意注入一个异常来触发uncaughtException(…).
public class subactivity extends BaseActivity { @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int crash = 1 / 0; }}
执行subactivity时,会触发uncaughtException(…)并停止应用程序(显然没有熟知的app停止对话框).
我想知道的是,是否可以终止触发的Activity(在这种情况下是subactivity),app是否会回滚(排序)到之前的状态(ParentActivity)?
任何建议表示赞赏.谢谢.
解决方法 经过一些研究,我相信没有办法返回上一个Activity,因为主要线程已经停止,因此触发了uncaughtException(…).在这里,我将列出我对“对策”这个问题的看法.
1.在不同的过程中声明每个活动(不推荐)
在清单文件中,在每个活动标记下添加androID:process = dedicated_process_name.这样做会使每个Activity在自己的进程中运行,从而确保1个进程的崩溃不会影响另一个进程.但不建议这样做.
<activity androID:name=".ParentActivity" androID:process="::parent_process" />
2.强制停止应用程序(System.exit(代码))并提供回调,其中每个Activity都可以定义自己的处理.
使用onCrashed(…)回调创建BaseActivity.
public class BaseActivity extends AppCompatActivity { @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @OverrIDe public voID uncaughtException(Thread paramThread,"Activity crashed!"); onCrashed(thread,throwable); System.exit(0); } }); } protected voID onCrashed(Thread thread,Throwable throwable) { // space for rent }}
从BaseActivity扩展的所有Activity都可以决定他们在崩溃时想要做什么.一个例子是安排再次启动应用程序.
public class subactivity extends BaseActivity @OverrIDe protected voID onCrashed(Thread thread,Throwable throwable) { Intent i = new Intent(this,ParentActivity.class); PendingIntent pi = PendingIntent.getActivity(this,i,0); AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); am.set(AlarmManager.RTC,System.currentTimeMillis() + 100,pi); }
或者,我们可以选择在应用程序级别实现uncaughtException(…),Application将决定下一步该做什么. (例如,重启当前活动)
总结以上是内存溢出为你收集整理的android – 如果发生UncaughtExceptionHandler,如何退出(仅)当前活动?全部内容,希望文章能够帮你解决android – 如果发生UncaughtExceptionHandler,如何退出(仅)当前活动?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)