Метод класса Android Application onCreate вызывается несколько раз

Я перегрузил класс Application в моем приложении для Android и использую систему отчетов ACRA. Мое приложение выглядит так ( реальный исходный код здесь):

public class MyApplication extends Application 
{
    @Override
    public void onCreate() {        
        ACRA.init( this );

        /*
         * Initialize my singletons etc
         * ...
         * ...
         */
        super.onCreate();
    }
}

И, насколько я знаю, объект Application должен быть создан только один раз, поэтому метод onCreate должен вызываться только один раз. Проблема в том, что в моих отчетах о сбоях (из ACRA) у меня есть это:

java.lang.RuntimeException: Unable to create service it.evilsocket.myapp.net.N ...
java.lang.RuntimeException: Unable to create service it.evilsocket.myapp.net.NetworkMonitorService: java.lang.RuntimeException: Unable to create application it.evilsocket.myapp.MyApplication: **java.lang.IllegalStateException: ACRA#init called more than once**
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2283)
    at android.app.ActivityThread.access$1600(ActivityThread.java:127)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4441)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: Unable to create application it.evilsocket.myapp.MyApplication: java.lang.IllegalStateException: ACRA#init called more than once
    at android.app.LoadedApk.makeApplication(LoadedApk.java:495)
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2269)
    ... 10 more
Caused by: java.lang.IllegalStateException: ACRA#init called more than once
    at org.acra.ACRA.init(ACRA.java:118)
    at it.evilsocket.myapp.MyApplication.onCreate(MyApplication.java:46)
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969)
    at android.app.LoadedApk.makeApplication(LoadedApk.java:492)
    ... 11 more
java.lang.RuntimeException: Unable to create application it.evilsocket.myapp.MyApplication: java.lang.IllegalStateException: ACRA#init called more than once
    at android.app.LoadedApk.makeApplication(LoadedApk.java:495)
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2269)
    at android.app.ActivityThread.access$1600(ActivityThread.java:127)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4441)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: ACRA#init called more than once
    at org.acra.ACRA.init(ACRA.java:118)
    at it.evilsocket.myapp.MyApplication.onCreate(MyApplication.java:46)
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969)
    at android.app.LoadedApk.makeApplication(LoadedApk.java:492)
    ... 11 more
java.lang.IllegalStateException: ACRA#init called more than once
    at org.acra.ACRA.init(ACRA.java:118)
    at it.evilsocket.myapp.MyApplication.onCreate(MyApplication.java:46)
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969)
    at android.app.LoadedApk.makeApplication(LoadedApk.java:492)
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2269)
    at android.app.ActivityThread.access$1600(ActivityThread.java:127)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4441)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    at dalvik.system.NativeStart.main(Native Method)

Похоже, приложение onCreate вызывается несколько раз, есть идеи?

ЗАМЕТКИ:

  • В моем xml-манифесте android я НЕ использовал атрибут android:process="string".
  • Да, я уверен, что в моих процедурах инициализации я не случайно вызываю MyApplication.onCreate .

4 ответа

Решение

Если вы посмотрите на трассировку стека, это выглядит как ACRA.init звонит makeApplication, Я подозреваю, что есть какой-то код, чтобы проверить, было ли приложение уже создано, и если нет, создайте его, и это вызвано вашим вызовом ACRA.init до super.onCreate, Обычно при переопределении onCreate методы (ли Application или же Activity) рекомендуется позвонить super.onCreate в качестве первой строки вашей реализации и делать ваши собственные вещи потом. Я бы попробовал и посмотрел, исправит ли это что-то.

Я думаю, что у вас есть дополнительный процесс в вашем приложении. Вот почему Application.onCreate вызывается более одного раза. Посмотрите в свой файл манифеста и попробуйте найти действие или службу с помощью чего-то вроде android: process =. Это означает, что действие / служба запускается во второй виртуальной машине Dalvik, и поэтому создается другой экземпляр приложения.

Я также вижу это с ACRA 4.4.0 в дикой природе.

Может быть, что-то столь же простое в методе init?

if (mApplication != null) {
    throw new IllegalStateException("ACRA#init called more than once");
    //(return or finish or gracefully exit somehow)       
} else {
    mApplication = app;
    //and then continue with rest of acra init...

Изменить: 12/27/12 В продолжение этого, похоже, что Кевин принял эти изменения. Подробности здесь: https://github.com/ACRA/acra/commit/cda06f5b803a09e9e7cc7dafae2c65c8fa69b861

Недавно я просматривал исходный код ACRA и думаю, что эта проблема решается в ACRA двумя способами:

  1. Вместо onCreate() документ ACRA теперь рекомендует инициализировать ACRA в attachBaseContext, который вызывается перед onCreate().
  2. У ACRA есть некоторая логика для проверки наличия других экземпляров ACRA во время инициализации. Если да, ACRA отменит регистрацию существующего репортера и обойдёт текущего репортёра с помощью некоторой прокси-обработки.

Проверьте функцию инициализации в ACRA.kt

Другие вопросы по тегам