Android在调用super.OnCreate()之前停止onCreate()中的活动

com*_*ghz 8 resume android android-fragments android-activity

我正在创建一个带有片段的导航抽屉活动的应用程序。在应用程序每次冷启动时,我都会执行一些初始化代码,并在其中加载以下内容:

  • 用户会话(如果用户已登录)
  • 注册改造服务
  • 从服务器获取一些数据以继续启动应用程序。

这是冷启动时我的应用程序的流程:

  • 启动MainActivity并验证用户会话。
  • 如果会话有效,则我们打开CoreActivity
  • 如果没有,那么我们打开LoginActivity

在某些非活动状态下将应用程序置于前台后,Android会尝试重新启动当前的活动。这意味着我的初始化代码被绕过并被CoreActivity.onCreate()执行。

我的所有活动(MainActivity除外)都在扩展以下超级活动:

public abstract class MasterActivity extends AppCompatActivity {

@Override
protected final void onCreate(Bundle savedInstanceState) {
    this.supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    if (!CrmContext.getInstance().verifyContextSet(this)) {
        return;
    }
    super.onCreate(savedInstanceState);
    onCreateAfterContext(savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud)

在CrmContext中:

public boolean verifyContextSet(final Context context) {
    boolean isContextSet = applicationContext != null;
    if (isContextSet) {
        return true;
    }
    Intent intent = new Intent(context, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    context.startActivity(intent);
    return false;
}
Run Code Online (Sandbox Code Playgroud)

verifyContextSet()我做一些检查,以确保应用程序已正确加载。如果用户会话未正确加载。

我的问题:

如果该应用程序位于最前面,则将CoreActivity.onCreate()执行并verifyContextSet()返回false。在这种情况下,我想取消CoreActivity的创建,然后再次打开MainActivity

当我做verifyContextSet()before时super.onCreate(),我得到了这个异常:

android.util.SuperNotCalledException:活动{nl.realworks.crm / nl.realworks.crm.view.CoreActivity}并未通过android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2287)上的super.onCreate()进行调用android.app.ActivityThread.access $ 800(ActivityThread.java:151)上的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391)android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1309)

我尝试先执行super.onCreate(),但随后Fragment先创建活动内部。这意味着我Fragment将在verifyContextSet()执行之前重新创建。

所以,如果我尝试cancel()/ finish()onCreate()之前super.onCreate()已被调用,然后我得到了SuperNotCalledException。如果我执行super.onCreate()第一个,然后Fragment初始化这是不允许的,当verifyContextSet()收益false

我要执行以下操作:

  • 将应用程序带到前台
  • 检查应用程序是否已初始化
  • 如果不是,则finish()当前活动,然后重新启动应用程序以打开MainActivity

Jac*_*per 0

我认为代码应该是这样的

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Your code

}
Run Code Online (Sandbox Code Playgroud)

super.onCreate(savedInstanceState) 始终作为第一行。

  • 当我这样做时, super.onCreate() 会在执行“verifyContextSet()”之前尝试恢复/初始化片段 (2认同)