强制启动SplashActivity onRestart另一项活动

时间:2016-08-05 14:58:31

标签: android

我有一个SplashActivity,可以创建自定义CommerceObjects的ArrayList。此列表将用于应用程序的其余部分,用于不同的活动和片段。问题是,有时,当应用程序被停顿然后重新启动时,对象列表显示为未初始化。解决方案是检查ArrayList是否为null,如果为null,则强制SplashActivity再次启动并重新生成ArrayList。我尝试在其余的活动中使用onRestart方法执行此操作,但根本不工作。

例如,如果ArrayList(在SplashActivity中创建)为null,这就是我在MainActivity中检查的方式。

public class MainActivity extends AppCompatActivity {
    ...

    @Override
    protected void onRestart() {
        // If the full list of commerces is null or is empty, launch the SplashActivity.
        // Here check if the ArrayList of CommerceObjects is null
        if (SplashActivity._commerces == null || SplashActivity._commerces.size() == 0) {
            Intent mIntent = new Intent(MainActivity.this, SplashActivity.class);
            startActivity(mIntent);
            this.finish();
        }

        super.onRestart();
    }

    ...
}

因此,要检查的数组列表是" _commerces "。它在SplashActivity 中将标记为公共静态。我需要检查是否为空,不管堆栈前面当前有什么片段或活动。

我失踪了什么?

1 个答案:

答案 0 :(得分:1)

<强>更新

我建议您使用onStart()。 如果App进程被Android操作系统杀死,则不会调用onRestart()https://developer.android.com/reference/android/app/Activity.html

<强> ORIGINAL

静态变量将由Android OS初始化 见:static variable null when returning to the app

所以我建议你避免使用静态变量。 创建Application类并在Application实例中保存CommerceObjects。

以下代码说明。

制作您的应用类:

public class App extends Application {

    private CommerceObjects mCommerces;

    public void setCommerces(CommerceObjects commerces) {
        mCommerces = commerces;
    }

    public CommerceObjects getCommerces() {
        return mCommerces;
    }

    public static App get(Context context) {
        return (App) context.getApplicationContext();
    }
}

在AndroidManifest.xml中设置应用程序名称:

<application
        ...
        android:name=".App">

    ...

</application>

在您的SplashActivity中初始化商店:

public class SplashActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        initializeCommerces();
    }

    private void initializeCommerces() {
        //do initialize tasks
        ...
        CommerceObjects commerces = ...;

        //set CommerceObjects to App
        App.get(this).setCommerces(commerces);

        //start other Activity. ex) MainActivity
    }
}

在花药活动中使用商业:

public class MainActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //use CommerceObjects
        CommerceObjects commerces = App.get(this).getCommerces();
        ...
    }
}