我正在创建一个带有片段的导航抽屉活动应用程序。在每次冷启动应用程序时,我执行一些初始化代码,其中加载以下内容:
- 用户会话(如果用户已登录或未登录)
- 注册Retrofit服务
- 从服务器获取一些数据以继续启动应用程序。
这是我的应用程序在进行冷启动时的流程:
- 启动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。
当我在调用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()
,但是这意味着活动内部的Fragment
会首先被创建。这意味着我的Fragment
会在verifyContextSet()
被执行之前重新创建。
因此,如果我在调用super.onCreate()
之前尝试cancel()
/finish()
onCreate()
,那么我会得到SuperNotCalledException
。如果我先执行super.onCreate()
,则会初始化Fragment
,而这在verifyContextSet()
返回false
时是不允许的。
我想要做以下事情:
- 将应用程序置于前台
- 检查应用程序是否已初始化
- 如果没有,则
finish()
当前activity并重新启动应用程序以打开MainActivity。
super
是一种不好的方法。对我来说,这听起来像是你想要检查活动的启动模式。你可能想使用<activity android:launchMode= "singleInstance" />
。 - longionAttach()
回调中执行任何操作来解决了我的问题,因为当从进程死亡中恢复时,onAttach()
将从FragmentActivity
的onCreate()
中调用。 - Bhargav