我正在创建一个具有带有 fragment 的抽屉导航 Activity 的应用程序。在应用程序的每次冷启动时,我都会执行一些初始化代码,在其中加载以下内容:
- 用户 session (无论用户是否登录)
- 注册改造服务
- 从服务器获取一些数据以继续启动应用。
这是我的应用程序冷启动时的流程:
- 启动MainActivity并验证用户 session 。
- 如果 session 有效,那么我们将打开CoreActivity。
- 如果没有,那么我们打开LoginActivity。
当应用程序在一段不活动状态后被带到前台时,Android 会尝试重新启动当前的 Activity。这意味着我的初始化代码被绕过,并且执行了 CoreActivity.onCreate()。
我的所有 Activity (MainActivity 除外)都扩展了以下 super Activity :
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()
中,我正在进行一些检查以确保应用程序已正确加载。如果用户 session 未正确加载。
我的问题:
如果应用程序被置于前端,则执行 CoreActivity.onCreate() 并返回 false。在本例中,我想取消 CoreActivity 的创建并再次打开 MainActivity。
当我在 super.onCreate()
之前执行 verifyContextSet()
时,我会收到此异常:
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()
,但随后首先创建了 Activity 内的Fragment
。这意味着我的 Fragment
在执行 verifyContextSet()
之前重新创建。
所以,如果我尝试在 super.onCreate() 之前
已被调用,然后我收到 cancel()
/finish()
onCreate()
SuperNotCalledException
。如果我先执行 super.onCreate()
,那么 Fragment
就会被初始化,当 verifyContextSet()
返回 false< 时这是不允许的
.
我想要执行以下操作:
- 将应用置于前台
- 检查应用是否已初始化
- 如果没有,则
finish()
当前 Activity,然后重新启动应用以打开 MainActivity。
最佳答案
将检查/验证代码放入 Application
子类中
public class MyApp extends Application {
//in your oncreate create sessions etc.
现在无论 MainActivity
是否重新启动,您都已经验证过了。
注意:Application
类的 onCreate()
是在任何主体之前首先运行的。
关于Android 在调用 super.OnCreate() 之前停止 onCreate() 中的 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36220209/