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
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()
,但随后首先创建活动中的片段。这意味着在执行myverifyContextSet()
之前,将重新创建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框架抗争,以适应这个要求。我尝试过这个,但它仍然继续启动先前打开的活动。如何防止上一个活动被重新启动?不,不,您不需要这些。我将“需要”改为“可以”。不建议在完成后不返回就完成。