2011-08-02 4 views
3

내 앱이 다른 앱과 놀고 나서 포 그라운드로 돌아 왔을 때 충돌이 발생하고 해결 방법을 찾을 수 없습니다.앱이 포 그라운드로 다시 돌아올 때 발생하는 문제

내 응용 프로그램은 웹 서비스에서 일부 데이터를로드하고 this SO question에서 설명한대로 응용 프로그램을 확장하는 클래스에 선언 된 전역 정적 변수에 넣는 스플래시 화면 액티비티를 가지고 있습니다. 모든 데이터가로드되면이 액티비티는 일부 메뉴가있는 홈 액티비티를 시작하여 앱에서 탐색합니다. 글로벌 vars는 대부분의 활동에 사용됩니다.

I/ActivityManager(2465): Process com.mysite.myapp (pid 23538) has died. 
I/WindowManager(2465): WIN DEATH: Window{4852a678 com.mysite.myapp/com.mysite.myapp.Home paused=false} 
I/WindowManager(2465): WIN DEATH: Window{485b63a8 com.mysite.myapp/com.mysite.myapp.Home paused=false} 
I/WindowManager(2465): WIN DEATH: Window{4826fbf8 com.mysite.myapp/com.mysite.myapp.ItemList paused=false} 
I/WindowManager(2465): WIN DEATH: Window{48286f90 com.mysite.myapp/com.mysite.myapp.ItemDetail paused=false} 
W/GpsLocationProvider(2465): Unneeded remove listener for uid 1000 
D/GpsLocationProvider(2465): stopNavigating 
D/gps_BRCM(2465): [status check] on_stop() : GPS_STATUS_SESSION_END 
D/gps_BRCM(2465): gps_engine_status_update 2 
D/GpsLocationProvider(2465): send an intent to notify that the GPS has been enabled or disabled 
D/gps_BRCM(2465): gps_stop: called 
V/GpsLocationProvider(2465): hybridGpsSensorDeregister : No registered sensorManager 
D/GpsLocationProvider(2465): hybridGpsSensorDeregister 

및 디버거가 분리 : 어떤 점에서

은 다른 애플 리케이션과 함께 재생하는 동안, 내 응용 프로그램은 내가 로그 캣에서 볼 수 있기 때문에, 살해 것 같다.

이제 앱을 다시 열면 글로벌 액세 스를 사용하지 않으면 최신 액티비티가 시작됩니다 (이 경우 액티비티로 이동하자마자 충돌합니다). 그렇지 않으면 즉시 충돌합니다.

내 위치 서비스도 중지 되었기 때문에 logcat에 표시된 것처럼 내 앱이 종료 된 경우 스플래시 화면에서 다시 시작하는 대신 최신 활동이 열리는 이유는 무엇입니까?

답변

2

귀하의 문제에 대한 더러운 해결책은 글로벌 변수가 귀하의 활동 중 onResume method에 기입되어 있는지 확인하는 것입니다. 변수가 채워지지 않은 경우 CLEAR_TOP 플래그가 설정된 인 텐트를 사용하여 스플래시 화면 활동을 시작합니다.이렇게하면 모든 액티비티가 액티비티 스택에서 제거되고 스플래시 화면이로드되어 앱이 작동하는 데 필요한 모든 데이터가 다시로드됩니다.

잘못 설계된 응용 프로그램이 작동하는 데 도움이되는 더러운 해결 방법입니다. 귀하의 앱이 귀하에게 더 좋기를 바라며 사용자가 솔루션 inazaruk을 제공하도록하려는 경우. 그는 응용 프로그램의 기본 설정에 대해 정확합니다.

5

질문에 대한 직접적인 대답은 아니지만 유용 할 것으로 생각했습니다.

데이터를 전역 변수에 저장하는 것이 좋지 않습니다. 사용자가 앱을 탐색 할 때마다 앱이 종료 될 수 있기 때문입니다. 그 또는 그녀가 돌아 오면 다시 데이터를로드해야합니다.

ContentProviderService을 사용해야합니다. Service은 인터넷에서 데이터를로드하고 ContentProvider에 저장해야합니다. ContentProvider은 데이터를 유지해야합니다. 모든 활동은이 캐시 된 데이터에 액세스하려면 ContentProvider을 사용해야합니다.

이 방법을 응용 프로그램 :

  1. 때마다 응용 프로그램이 시작 데이터
  2. 귀하의 활동에 데이터가 캐시는 사실에 의존 할 수 있습니다 (CPU, 배터리 및 대역폭 절약)를 다운로드 할 필요가 없습니다 콘텐츠 제공자.
  3. ContentProvider에서 데이터가 업데이트 될 때마다 각 Activity에 UI를 알리고 업데이트 할 수 있습니다.
  4. ContentProvider의 데이터는 응용 프로그램 실행에서 지속됩니다 (예 : SQLite를 사용하는 경우).
  5. 웹 서비스에서 데이터를 읽고 ContentProvider와 동기화하는 백그라운드 서비스는 Activities와 완전히 분리됩니다. 당신이 Acitivities에서 ServiceContentProvider, 적절한 처리를 구현에 시간을 투자 할 필요가 원인

. 그러나 응용 프로그램은보다 강력하고 확장 성이 있습니다 (새 구성 요소를 쉽게 추가 할 수 있음).

+0

감사합니다, 유용합니다. 이것은 내 첫 번째 큰 Android 앱이며 현재 재 설계 할 시간이 없기 때문에 Janusz 또는 Pedro Loureiro의 더러운 속임수를 사용합니다. 즉, 삭제 된 데이터를 다시로드합니다. 어쨌든 데이터는 매번 달라 지므로 앱을 시작할 때마다 다시로드해야합니다. ContentProvider를 사용하여이를 수행하는 방법을 조사 할 것입니다. – jul

1

안드로이드가 애플리케이션을 죽이면, 리소스를 절약하기 위해서뿐입니다. 더 나은 유용성을 가지기 위해서, OS는 당신이 그 앱 내부 어디에 있었는지를 기억할 것입니다 (적절한 청취자를 구현한다면, 액티비티는 인스턴스 상태를 스택으로 저장합니다).

앱을 복원하면 활동과 그 밖의 모든 사항이 복원됩니다. 전역 정적 변수에 데이터를 저장하면 응용 프로그램이 종료 될 때 "손실"되었을 수 있습니다!

난 당신이 데이터베이스를 사용하거나 데이터를 사용하기 전에 여전히 존재하는 경우 적어도 확인하는 것이 좋습니다 (예 : MyClassHolder.myGlobalStaticParameter == null)

관련 문제