2011-08-16 2 views
2

저는 건물에있는 Android 응용 프로그램에서 이상한 문제가 발생했습니다. 응용 프로그램은 기본적으로 장치에 기본 홈 화면으로 배치되는 홈 화면 대체 응용 프로그램입니다.Android 응용 프로그램 onCreate가 재부팅 중에 홈 화면 시작 프로그램으로 호출되지 않습니다.

<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> 

: 매니페스트 파일의

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 
    } 
} 

내용 : 나는 안드로이드 응용 프로그램 클래스를 확장 한과 onCreate() 방법에 기본적으로 내가 어떤 관찰자를 등록하고 서비스를 시작하고 몇 가지 초기화 작업을 수행하려면, 여기에 코드입니다 Eclipse를 사용하거나 수동으로 apk를 장치에 설치하면이 기능이 잘 작동합니다. 일단 앱이 잘 작동하면 위의 onCreate() 메서드가 호출되고 서비스도 정상적으로 시작되지만 이번에는 장치를 재부팅하면 onCreate() 메서드가 호출되지 않습니다 (로그 문과 서비스가 표시되지 않음). 시작되지 않음). 일부 디버깅 후 기본 런처/홈 화면 앱으로 내 앱을 설정 한 다음 기기를 재부팅하면 앱이 기본 런처로 설정되면 안드로이드가 재부팅 후 홈 화면으로 앱을 자동으로 실행해야하기 때문에 이것이 발생하는 것으로 나타났습니다. 제 경우에는 앱이 시작되었지만 코드는 실행되지 않습니다.

디버거를 사용하려고했으나 장치를 재부팅 할 때 디버거가 연결이 끊어지고 USB 디버깅이 활성화 될 때까지 이미 앱이 시작 되었기 때문에 작동하지 않았습니다.

Logcat을 두 번 확인했지만 오류가 표시되지 않았습니다. 나는 그 부분을 초기화하는 BOOT_COMPLETED 의도를 가지고 있다고 생각했지만 솔루션이 없다면이 시점에서 할 수있는 코드 리팩토링이 필요합니다.

그래서 이것이 표준 동작인지 또는이 문제를 일으키는 알려진 버그인지 궁금합니다. 응용 프로그램의 onCreate 메서드는 응용 프로그램이 시작될 때마다 항상 호출됩니다. 나는 아침부터 할 수있는 일을 다 해봤지만 아무 것도 효과가 없었고 문제를 정확하게 지적하지 못했습니다.

감사합니다.

답변

4

글쎄, 마침내 나는 문제를 알아 냈고, 그것은 내 코드 자체에있었습니다. 나는 처음에 MyApplicationonCreate() 메쏘드가 호출되지 않았다고 의심했다. 나는 어떤 로그도 볼 수 없었기 때문에 그 가정을했다. 메서드가 호출되는지 여부를 알기 위해 Log.i()을 사용하는 대신 ArrayList에 몇 가지 추가 로그 메시지를 추가하고 나중에 인쇄 했으므로 메서드가 실제로 호출되고 서비스가 올바르게 인스턴스화되었지만 데이터도 제대로 표시되지만 또는 그 시간까지 SDCard가 준비되지 않았기 때문에 파일 목록이 채워지지 않습니다. 나는 또한 로그가 Logcat에서 사용할 수 없다는 사실을 확신한다. 왜냐하면 USB 디버거가 내 앱이 시작된 후에 (홈 스크린 앱처럼) 준비가되었다는 사실 때문이다. 내 오버라이드 (override) MyApplication 클래스는 기본적으로 브로드 캐스트 리시버를 확장 ExternalStorageListener라는 리스너를 구현하는 것을 볼 때

실제 문제가 분명하게, 나는 데이터를 재 구축하기 위해, 예를 ACTION_MEDIA_MOUNTED에 대한 ACTION_MEDIA_REMOVED을 SDCard에 관련 텐트를받을 수 클래스 (파일 목록)을 만들었습니다 . 내 경우에 ExternalStorageListener 클래스는 코드 샘플의 위의 메서드에이 filter.addDataScheme("file")을 추가하는 것을 잊었 기 때문에 Intents를 수신하지 못했습니다.

나는 내 질문이 잘못된 가정에 기반하고 있으며 실제적인 문제를 파악하기가 어렵다고 생각한 코드 예제에 동의한다. 나는 이것을 답으로 표시 할 것인지 아니면 그대로 두어야하는지에 대한 질문에 무엇을해야할지 확신하지 못한다.

관련 문제