Приложение Android onCreate не вызывается для приложения запуска домашнего экрана во время перезагрузки - PullRequest
2 голосов
/ 17 августа 2011

У меня возникла странная проблема в приложении Android, которое я создаю, это приложение, по сути, приложение для замены домашнего экрана, которое будет добавлено в устройство в качестве домашнего экрана по умолчанию.Чтобы выполнить некоторые действия по инициализации, я расширил класс приложения Android, и в методе onCreate() я в основном регистрирую некоторого наблюдателя и запускаю службу, вот код:

public class MyApplication extends Application implements ExternalStorageListener {
    private ExternalStorageObserver externalStorageObserver;

    public void onCreate() {
        Log.i("MyApplication", "Starting application");
        super.onCreate();

        externalStorageObserver = new ExternalStorageObserver(this);

        if(externalStorageObserver.isExternalStorageAvailable()) {
            // this builds a list of files present in the SD card
            // which is being used through the application to do
            // some work
            buildData();

            File externalFileDir = getApplicationContext().getExternalFilesDir(null);
            if(externalFileDir != null && externalFileDir.isDirectory()) {
                // do something...  
            } 
        }

        //Register listener to observe external storage state
        registerExternalStorageObserver(); 

        Log.i("SyncService", "Starting sync service...");
        ComponentName cmp = startService(new Intent(getApplicationContext(), SyncService.class));
        Log.i("SyncService", cmp.toString());
    }


    private void registerExternalStorageObserver() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
        filter.addAction(Intent.ACTION_MEDIA_REMOVED);
        registerReceiver(externalStorageObserver, filter);
    }

    private void buildData() {
        // builds a list
    }   
}

Содержимое файла манифеста:

<application android:persistent="true" android:icon="@drawable/icon"
    android:label="@string/app_name" android:name="com.webgyani.android.MyApplication"
    android:debuggable="true">

    <activity android:name=".HomeTabActivity" android:launchMode="singleInstance"
        android:stateNotNeeded="true" android:theme="@style/LightTabsTheme"
        android:screenOrientation="landscape" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.HOME" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>

Это прекрасно работает, когда я устанавливаю приложение с помощью Eclipse или вручную устанавливаю apk на устройство.После того, как приложение установлено, все работает нормально, я имею в виду вышеупомянутый метод onCreate(), вызываемый и служба также запускается нормально, но если я перезагружаю устройство на этот раз, метод onCreate() не вызывается (ни один из операторов журнала не появляетсяа также сервисы не запускаются).После некоторой отладки я заметил, что это происходит только в том случае, если я устанавливаю свое приложение в качестве приложения запуска по умолчанию / домашнего экрана и после этого перезагружаю устройство, потому что после того, как вы установите приложение в качестве запуска запуска по умолчанию, Android должен автоматически запускать ваше приложение в качестве домашнего экрана после перезагрузки.В моем случае приложение запускается, но этот код не выполняется.

Я пытался использовать отладчик, но это не сработало, потому что, когда я перезагружаю устройство, отладчик отключается, и к тому времени, когда отладка по USB включается, мойприложение уже запущено.

Я даже дважды проверил Logcat, но не увидел никаких ошибок.Я думал о намерении BOOT_COMPLETED инициализировать эту часть, но это потребует некоторого рефакторинга кода, который я не собираюсь делать в данный момент, если не будет решения.

Так что мне любопытно узнать, чтоявляется ли это стандартным поведением, или есть известная ошибка, которая вызывает это, потому что я предполагаю, что метод onCreate приложения всегда будет вызываться при каждом запуске приложения.Я пробовал все, что мог с утра, но ничего не получалось, не мог точно определить проблему, если кто-то из вас мог бы пролить на это свет, то это было бы очень признательно.

Спасибо

1 Ответ

4 голосов
/ 18 августа 2011

Ну, наконец-то я разобрался с проблемой, и это было в самом моем коде. Сначала я подозревал, что метод MyApplication onCreate() не вызывается, у меня было такое предположение, потому что я не мог видеть никаких журналов. Чтобы узнать, вызывается ли метод или нет, вместо использования Log.i() я также добавлял некоторые дополнительные сообщения журнала в ArrayList и распечатывал их позже, это показало, что методы действительно вызывались, и даже Служба создавалась правильно, но данные или список файлов не заполняются, потому что к этому времени SDCard не была готова. Я также почти уверен, что журналы не были доступны в Logcat из-за того, что USB-отладчик становится готовым после запуска моего приложения (так как это приложение для домашнего экрана).

Фактическая проблема становится очевидной, когда вы видите, что мой переопределенный класс MyApplication реализует прослушиватель с именем ExternalStorageListener, который в основном расширяет BroadcastReceiver, я создал этот класс для получения Intents, связанных с SDCard, например ACTION_MEDIA_MOUNTED, ACTION_MEDIA_REMOVED для восстановить данные (список файлов). В моем случае класс ExternalStorageListener не получал Intents, потому что я забыл добавить этот filter.addDataScheme("file") в методе registerExternalStorageObserver выше в примере кода.

Я согласен с тем, что мой вопрос основывался на ложном предположении, и пример кода, который я опубликовал, довольно сложно понять суть проблемы. Я не уверен, что делать с вопросом: пометить это как ответ или оставить все как есть.

...