Android 在调用 super.OnCreate() 之前停止 onCreate() 中的 Activity

标签 android android-fragments android-activity resume

我正在创建一个具有带有 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/

相关文章:

android - 如何使用 GridView 适配器回收位图?

java - 日历代码在 Activity 中有效但在 fragment 中无效

java - Android线性布局背景透明度

android - 为什么 CalendarProvider 不允许写 ExtendedProperties?

javascript - 在旧浏览器中显示 Flexbox

android - SurfaceView相机预览: find camera preview size without stretch

android - 如何将 Robolectric、Maven、ActionBarSherlock(最好是 + IntelliJ)集成到 Android 项目中?

java - 无法启动Activity(包含 fragment 间通信)

android - 获取值以在 Android 应用程序中以不同语言显示 - 本地化

Android 从 Activity 堆栈弹出