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

Android在调用super.onCreate()之前停止onCreate()中的活动,android,android-fragments,android-activity,resume,Android,Android Fragments,Android Activity,Resume,我正在创建一个应用程序,该应用程序具有带有片段的导航抽屉活动。每次应用程序冷启动时,我都会执行一些初始化代码,在其中加载以下内容: 用户会话(如果用户已登录或未登录) 注册改装服务 从服务器获取一些数据以继续启动应用程序 这是我的应用程序在冷启动时的流程: 启动MainActivity并验证用户会话 如果会话有效,则打开核心活动 如果没有,那么我们打开LoginActivity 当应用程序在一些不活动后被带到前台时,Android会尝试重新启动当前活动。这意味着将绕过我的初始化代码,并执

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

  • 用户会话(如果用户已登录或未登录)
  • 注册改装服务
  • 从服务器获取一些数据以继续启动应用程序
这是我的应用程序在冷启动时的流程:

  • 启动MainActivity并验证用户会话
  • 如果会话有效,则打开核心活动
  • 如果没有,那么我们打开LoginActivity
当应用程序在一些不活动后被带到前台时,Android会尝试重新启动当前活动。这意味着将绕过我的初始化代码,并执行
CoreActivity.onCreate()

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

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);
}
在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;
}
verifyContextSet()
中,我正在进行一些检查,以确保应用程序已正确加载。如果用户会话未正确加载

我的问题:

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;
}
如果将应用程序置于前端,则执行
CoreActivity.onCreate()
,并且
verifyContextSet()
返回false。在这种情况下,我想取消创建CoreActivity并再次打开MainActivity

super.onCreate()
之前执行
verifyContextSet()
时,会出现以下异常:

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

我试图先执行
super.onCreate()
,但随后首先创建活动中的
片段。这意味着在执行my
verifyContextSet()
之前,将重新创建my
片段

因此,如果我在调用
super.onCreate()
之前尝试
cancel()
/
finish()
onCreate()。如果我首先执行
super.onCreate()
,那么
片段
将被初始化,这在
verifyContextSet()
返回
false
时是不允许的

我想做以下工作:

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

    • 我认为代码应该是这样的

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

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

      将检查/验证代码放入
      应用程序的子类中

      public class MyApp extends Application {
      //in your oncreate create sessions etc.
      
      现在,无论
      MainActivity
      是否重新启动,您都已验证


      注意:
      Application
      class'
      onCreate()
      是在任何实体之前首先运行的。

      您可以使用ViewModel和Observer。基本上,剩下的
      onCreate code
      只有在操作员触发时才会执行

      
      onResume {
      
          // THIS WILL TRIGGER THE OBSERVER
          viewModel._needVerification.value = true
      
      }
      
      onCreate {
      
          super.onCreate()
      
          ... CREATE VIEWMODEL
      
          // THIS NEEDED TO HANDLE RECREATED ACTIVITY CAUSE BY SCREEN ORIENTATION ETC
          viewModel._verificationFinished.value = false
      
          viewModel.needVerification.observe(this, Observer{
      
              if (it == true) {
      
                  verifyContextSet(final Context context) {
      
                      if (isContextSet) {
      
                          if (viewModel.verificationFinished.value != true) {
      
                              ... DO REMAINING ONCREATE CODE 
      
                              viewModel._verificationFinished.value = true
      
                          }
      
                      } else {
      
                          Start MainActivity
      
                      }
      
                  }
      
              }
      
        })
      
      }
      

      你需要做的是让你的onCreate像这样

      super.onCreate();
      if(<activity is not valid>) {
         startAnotherActivity()
         finish()
         return;
      }
      
      super.onCreate();
      if(){
      startAnotherActivity()
      完成()
      返回;
      }
      

      这将确保除onDestroy(即onResume、onPause、onStop、onStart)外,不会调用任何其他活动生命周期方法。

      而不是仅从
      onCreate返回
      ,您需要先完成活动,以停止要触发的其他初始化回调

      
      onResume {
      
          // THIS WILL TRIGGER THE OBSERVER
          viewModel._needVerification.value = true
      
      }
      
      onCreate {
      
          super.onCreate()
      
          ... CREATE VIEWMODEL
      
          // THIS NEEDED TO HANDLE RECREATED ACTIVITY CAUSE BY SCREEN ORIENTATION ETC
          viewModel._verificationFinished.value = false
      
          viewModel.needVerification.observe(this, Observer{
      
              if (it == true) {
      
                  verifyContextSet(final Context context) {
      
                      if (isContextSet) {
      
                          if (viewModel.verificationFinished.value != true) {
      
                              ... DO REMAINING ONCREATE CODE 
      
                              viewModel._verificationFinished.value = true
      
                          }
      
                      } else {
      
                          Start MainActivity
      
                      }
      
                  }
      
              }
      
        })
      
      }
      
      只需更改此代码

      if (!CrmContext.getInstance().verifyContextSet(this)) {
          return;
      }
      
      对此

      if (!CrmContext.getInstance().verifyContextSet(this)) {
          finish();
          return;
      }
      

      当我这样做时,super.onCreate()会在我的
      verifyContextSet()
      完成之前尝试恢复/初始化片段executed@MikeM. 应用程序进入后台之前打开的上一个片段。我认为代码无关紧要,因为我想在加载片段之前进行检查。我已将检查移到Application.onCreate(),但我不能中断执行。它一直试图恢复以前的活动。我已经调整了我的问题,让事情变得更清楚。你有没有回避过这个问题?记不得了。已经有一段时间了。有人解决过这个问题吗?我认为这里的问题不是如何阻止活动恢复(已经概述),而是整个想法的架构不正确,OP现在正在与Android框架抗争,以适应这个要求。我尝试过这个,但它仍然继续启动先前打开的活动。如何防止上一个活动被重新启动?不,不,您不需要这些。我将“需要”改为“可以”。不建议在完成后不返回就完成。