ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Android Activity - 根 Activity 变化、APP 崩溃与自动重启

Android Activity - 根 Activity 变化、APP 崩溃与自动重启 根 Activity 变化1、问题引入从 SplashAvtivity 跳转到了 LoginAvtivity这种写法是不是可以让 LoginAvtivity 成为根 ActivitystartActivity(newIntent(SplashAvtivity.this,LoginActivity.class));finish();2、演示1ActivityStartActivity?xml version1.0 encodingutf-8?androidx.constraintlayout.widget.ConstraintLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.StartActivityButtonandroid:idid/btn_goandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text前进app:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent//androidx.constraintlayout.widget.ConstraintLayoutpublicclassStartActivityextendsAppCompatActivity{publicstaticfinalStringTAGStartActivity.class.getSimpleName();OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_start);test();}privatevoidtest(){Log.i(TAG,taskId: getTaskId());Log.i(TAG,intent: getIntent().toString());Log.i(TAG,isTaskRoot: isTaskRoot());ButtonbtnGofindViewById(R.id.btn_go);btnGo.setOnClickListener(v-{IntentintentnewIntent(this,FinishActivity.class);startActivity(intent);});}}FinishActivity?xml version1.0 encodingutf-8?androidx.constraintlayout.widget.ConstraintLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.FinishActivityButtonandroid:idid/btn_backandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text前进app:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent//androidx.constraintlayout.widget.ConstraintLayoutpublicclassFinishActivityextendsAppCompatActivity{publicstaticfinalStringTAGFinishActivity.class.getSimpleName();OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_finish);test();}privatevoidtest(){Log.i(TAG,taskId: getTaskId());Log.i(TAG,intent: getIntent().toString());Log.i(TAG,isTaskRoot: isTaskRoot());ButtonbtnBackfindViewById(R.id.btn_back);btnBack.setOnClickListener(v-finish());}}2Test应用启动打开 StartActivity输出结果如下StartActivity - taskId: 170 StartActivity - intent: Intent { actandroid.intent.action.MAIN cat[android.intent.category.LAUNCHER] flg0x10000000 cmpcom.my.activity/.StartActivity } StartActivity - isTaskRoot: true点击【前进】按钮跳转到 FinishActivity输出结果如下FinishActivity - taskId: 170 FinishActivity - intent: Intent { cmpcom.my.activity/.FinishActivity } FinishActivity - isTaskRoot: false3Change Test在 StartActivity 中进行如下修改Log.i(TAG,taskId: getTaskId());Log.i(TAG,intent: getIntent().toString());Log.i(TAG,isTaskRoot: isTaskRoot());ButtonbtnGofindViewById(R.id.btn_go);btnGo.setOnClickListener(v-{IntentintentnewIntent(this,FinishActivity.class);startActivity(intent);finish();});应用启动打开 StartActivity输出结果如下StartActivity - taskId: 171 StartActivity - intent: Intent { actandroid.intent.action.MAIN cat[android.intent.category.LAUNCHER] flg0x10000000 cmpcom.my.activity/.StartActivity } StartActivity - isTaskRoot: true点击【前进】按钮跳转到 FinishActivity输出结果如下FinishActivity - taskId: 171 FinishActivity - intent: Intent { cmpcom.my.activity/.FinishActivity } FinishActivity - isTaskRoot: true3、小结原 Activity 是根 Activity启动新 Activity 后立即调用 finish 方法新启动的 Activity 会继承原任务栈新 Activity 会成为新的根 Activity4、优化策略清空栈顶并设为根在 Intent 中添加FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK标志IntentintentnewIntent(SplashActivity.this,LoginActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);startActivity(intent);FLAG_ACTIVITY_CLEAR_TASK清除原任务栈中所有 ActivityFLAG_ACTIVITY_NEW_TASK在新任务中启动此时的 Activity 就是新栈的根5、补充学习getTaskId 方法用于返回当前 Activity 所在任务栈的唯一 IDgetIntent 方法用于返回启动当前 Activity 的 Intent 对象这个 Intent 对象包含了启动该 Activity 时的所有信息有 Action、Data、Category、Flags、Extras 等isTaskRoot 方法用于判断当前 Activity 是否是其所在任务栈的根 Activity即栈底第一个 ActivityAPP 崩溃与自动重启在 Application 中有如下处理Thread.setDefaultUncaughtExceptionHandler((t,e)-{Log.i(TAG,defaultUncaughtExceptionHandler: e.getMessage());...System.exit(1);});从 LoginActivity 跳转到了 MainActivity从 MainActivity 跳转到了 ComputeActivity在 ComputeActivity 中操作时报错了现象如下白屏了几秒后回到了 LoginActivityLog.i(TAG, defaultUncaughtExceptionHandler: e.getMessage()) 有 7 次打印 第 1 次打印是 ComputeActivity 的报错触发 后面的 6 次打印是 MainActivity 的报错触发因为 MainActivity 不支持直接启动需要从 LoginActivity 跳转 MainActivity也就是说ComputeActivity 报错APP 自动重启打开 MainActivity 但是MainActivity 报错APP 自动重启打开 MainActivity这样重复了多次 最后MainActivity 报错APP 自动重启打开 LoginActivity如果不调用 setDefaultUncaughtExceptionHandler 方法同样的情况现象如下白屏了几秒后回到了 LoginActivityComputeActivity 报错APP 自动重启打开 MainActivity MainActivity 报错APP 自动重启打开 LoginActivity修改了 setDefaultUncaughtExceptionHandler 方法同样的情况现象如下Thread.setDefaultUncaughtExceptionHandler((t,e)-{Log.i(TAG,defaultUncaughtExceptionHandler: e.getMessage());...IntentintentnewIntent(this,LoginActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);startActivity(intent);System.exit(1);});白屏后回到了 LoginActivityComputeActivity 报错APP 自动重启打开 LoginActivity
返回列表