我正在创建一个带有片段导航抽屉活动的应用。在应用程序的每个冷启动时,我正在执行一些初始化代码,我在其中加载以下内容:
这是我的应用程序在冷启动时的流程:
当某些不活动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 。答案 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;
}