在调用super.OnCreate()

时间:2016-03-25 12:45:18

标签: android android-fragments android-activity resume

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

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

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

  • 启动 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);
}

在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()我正在做一些检查以确保应用已正确加载。如果用户会话未正确加载。

我的问题:

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

当我在verifyContextSet()之前执行super.onCreate()时,我会遇到此例外情况:

android.util.SuperNotCalledException: Activity {nl.realworks.crm/nl.realworks.crm.view.CoreActivity} did not call through to super.onCreate()
                                                                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2287)
                                                                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391)
                                                                at android.app.ActivityThread.access$800(ActivityThread.java:151)
                                                                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309)

我首先尝试执行super.onCreate(),然后首先创建活动中的Fragment。这意味着我的Fragment会在执行verifyContextSet()之前重新创建。{/ p>

所以,如果我在调用cancel()之前尝试finish() / onCreate() super.onCreate(),那么我会得到SuperNotCalledException。如果我先执行super.onCreate(),那么Fragment会被初始化,verifyContextSet()返回false时不允许{。}}。

我想做以下事情:

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

5 个答案:

答案 0 :(得分:1)

您需要做的是像这样使onCreate

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

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

答案 1 :(得分:0)

我认为代码看起来应该是那样的

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

}

super.onCreate(savedInstanceState)总是作为第一行。

答案 2 :(得分:0)

将您的检查/验证代码放在Application子类

public class MyApp extends Application {
//in your oncreate create sessions etc.

现在无论MainActivity是否重启,您都已经过验证。

注意:Application课程&#39; onCreate()是在任何身体之前跑的冷杉。

答案 3 :(得分:0)

您可以使用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

                }

            }

        }

  })

}

答案 4 :(得分:0)

您不仅需要先从onCreate返回,还需要先完成Activity以停止其他初始化回调的触发。

只需更改此代码

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

对此

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