Application.onCreate是否在Activity.onResume之前调用,如果应用程序已空闲数小时并被操作系统销毁?

时间:2015-12-03 14:41:47

标签: android

在我的应用程序onCreate中,我像这样实例化Retrofit:

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        RestClient.setupRestClient(getAppVersion(this));
    }


}

我曾经在RestClient中有一个静态块来初始化它,但现在我需要在Headers中为每个请求添加应用程序版本,所以我需要在初始化时传递String。 (getAppVersion()需要一个Context才能获得应用版本)

如果没有初始化,我在RestClient.get()中添加了一个throw子句。

我的问题是,通常如果一个Activity闲置几个小时,操作系统会杀死它,有时候在长时间闲置后恢复活动时,它在onResume中寻找的一些东西都是null并且它崩溃了,Application.onCreate也是如此。在onResume之前调用,如果活动事先被杀死了吗?

这是我的RestClient类

public class RestClient {

    private static API REST_CLIENT;

    private RestClient() {
    }

    public static API get() {
        if(REST_CLIENT==null){
            throw new IllegalStateException("Rest Client not initialized");
        }
        return REST_CLIENT;
    }

    public static void setupRestClient(final String appVersion) {

        Gson gson = new GsonBuilder()
                .registerTypeAdapter(Story.class, new StorySerializer())
                .create();


        RequestInterceptor requestInterceptor = new RequestInterceptor() {
            @Override
            public void intercept(RequestFacade request) {
                request.addHeader(ServerKeys.HEADER_OS_VERSION, ServerKeys.HEADER_OS_VERSION_VALUE_ANDROID);
                request.addHeader(ServerKeys.HEADER_APP_VERSION, appVersion);
            }
        };

        RestAdapter.Builder builder = new RestAdapter.Builder();
        builder.setEndpoint(APIKeys.API_ROOT);
        builder.setRequestInterceptor(requestInterceptor);
        builder.setExecutors(Executors.newFixedThreadPool(Preferences.MAX_NUMBER_OF_PARALLEL_NETWORK_OPERATIONS), new ScheduledThreadPoolExecutor(Preferences.MAX_NUMBER_OF_PARALLEL_NETWORK_OPERATIONS));
        builder.setConverter(new GsonConverter(gson));
        RestAdapter restAdapter = builder.build();
        REST_CLIENT = restAdapter.create(API.class);
    }

}

这就是我使用它的方式:

RestClient.get().resetUserPassword(ge....

2 个答案:

答案 0 :(得分:0)

如果您的活动是 已杀死 ,则 活动会调用onCreate。根据我的知识,应用程序的onCreate()只被调用一次。

所以示例:我启动我的应用程序并更改方向,onDestroy和onCreate仅针对该Activity调用。该应用程序从未重新启动。

所以现在回答你的问题我已经仔细阅读了,我想不会。除非整个应用程序关闭,否则应该没有理由再次调用应用程序的onCreate()。

答案 1 :(得分:0)

问题的直接答案是肯定的,就像塞尔文在评论中所说的那样。 但是,我的整个案例都是无效的,因为有一种更简单的方法可以解决我遇到的问题而无需将上下文传递给Retrofit, 这是如何:

String verName = BuildConfig.VERSION_NAME;