父Activity启动Intent后,如何终止子类Activity后续代码执行?
我明白你遇到的棘手问题了——虽然基类里已经启动MainActivity并finish当前Activity,但子类onCreate()中super.onCreate()之后的代码还是会继续执行,导致没布局时调用findViewById这类操作直接崩溃。这是因为return只是终止了基类的onCreate方法,子类的方法执行流程还在继续走。
这里有两种可行的解决方案,你可以根据项目情况选择:
方案1:用自定义异常中断子类执行(无需修改子类代码)
这种方法的核心是在基类完成跳转和finish后,抛出一个自定义的RuntimeException,直接中断子类onCreate的执行流程。因为Activity已经被finish,系统不会弹出崩溃提示,只会静默终止当前Activity的生命周期,完全不影响用户体验。
修改你的BaseActivity代码:
public abstract class BaseActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { if(MainActivity.instance == null){ Intent i= new Intent(this, MainActivity.class); startActivity(i); this.finish(); // 抛出异常直接中断子类后续代码执行 throw new SkipOnCreateExecutionException(); }else{ setContentView(getLayoutRes()); } } // 自定义异常,仅用于中断执行,无需额外处理 private static class SkipOnCreateExecutionException extends RuntimeException { public SkipOnCreateExecutionException() { super("Skipping remaining onCreate logic since activity is finishing"); } } protected abstract int getLayoutRes(); }
这样子类MapActivity的super.onCreate()执行到抛出异常时,后续的1000行代码就不会再执行了,完美避免崩溃问题。
方案2:添加标记位让子类主动跳过(更优雅,需修改子类)
如果不想用异常的“黑魔法”,可以在基类中设置一个标记位,让子类在super.onCreate()之后主动判断是否需要跳过后续代码,这种方式逻辑更清晰。
首先修改BaseActivity:
public abstract class BaseActivity extends AppCompatActivity { private boolean mShouldSkipOnCreate; protected void onCreate(Bundle savedInstanceState) { mShouldSkipOnCreate = false; if(MainActivity.instance == null){ Intent i= new Intent(this, MainActivity.class); startActivity(i); this.finish(); mShouldSkipOnCreate = true; return; }else{ setContentView(getLayoutRes()); } } // 提供给子类的判断方法 protected boolean shouldSkipOnCreate() { return mShouldSkipOnCreate; } protected abstract int getLayoutRes(); }
然后修改子类MapActivity:
public class MapActivity extends BaseActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 先判断是否需要跳过后续逻辑 if (shouldSkipOnCreate()) { return; } //1000 line of code } @Override protected int getLayoutRes() { return R.layout.activity_map; } }
这种方式需要所有子类都添加这一行判断逻辑,但胜在直观易懂,没有异常带来的隐式行为。
额外小提示
另外提一句:用MainActivity.instance来判断进程是否存活的方式,虽然能解决大部分场景,但不是100%可靠(比如某些极端情况下静态变量可能被系统意外回收)。如果想要更严谨的检测,可以结合Intent的FLAG_ACTIVITY_CLEAR_TOP或者在Application类中监听进程状态,但这属于额外优化了,先解决你当前的崩溃问题优先。
内容的提问来源于stack exchange,提问作者dev90

