2011-01-27 4 views
0

스트리트 뷰를위한 새로운 활동을 시작합니다.메인 앱은 스트리트 뷰 활동을 시작한 후 살해됩니다.

Intent streetView = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(uri)); 
startActivity(streetView); 

It 스트리트 뷰를 정상적으로 시작합니다. 내가 많이하지 않으면 뒤로 버튼을 누를 수 있고 앱이 아무 것도 바뀌지 않았을 때 대기하고 있습니다. 나는 조금의 스트리트 뷰 (Street View)를 사용하고 주위를 둘러 보면 주위 뷰를 이동하는 경우

그러나, 나는 로그 캣에서 볼 :

10월 1일부터 27일까지 : 53 : 27.526 : INFO/ActivityManager (1079) 메모리 부족 : 더 이상 백그라운드 프로세스가 없습니다.

10월 1일부터 27일까지 : 53 : 27.636 : DEBUG/dalvikvm가 (32218) : 53 : 27.831 : GC_FOR_MALLOC가 655ms

10월 1일에서 27일까지에서 3,054 개체/198,608 바이트 해제 DEBUG/dalvikvm (32,164) GC_FOR_MALLOC 53 : 27.862 : 1,054 개체/342ms

10월 1일에서 27일까지에서 51,664 바이트 해제 INFO/dalvikvm 힙 (32,164) 87,396 바이트 할당 3.656MB에 힙 (파편 경우) 성장

01- 27 10 : 53 : 27.878 : INFO/ActivityManager (1079) : 프로세스 com.favorite.me (pid 32135)가 사망했습니다.

01-27 10 : 53 : 27.878 : INFO/ActivityManager (1079) : 메모리 부족 : 더 이상 백그라운드 프로세스가 없습니다.

01-27 10 : 53 : 27.482 : INFO/ActivityManager (1079) : com.myapp.app (pid 31481) 프로세스가 종료되었습니다.

10월 1일부터 27일까지 : 53 : 27.490 : INFO/창 관리자 (1079)을 WIN DEATH : 창

이어서 {44c68ba8 com.myapp.app/com.myapp.app.MyLocation는 = 거짓 일시} 때 뒤로 버튼을 눌러 내 앱으로 돌아 가면 내 앱의 상태를 잃어버린 것처럼 모든 변수가 null로 재설정 된 것처럼 보입니다. 이 문제를 해결할 수있는 유일한 방법은 뒤로 버튼을 다시 누르고 해당 활동을 다시 시작하는 것입니다.

내가 말할 수있는 것부터, onpause() 또는 onSaveInstanceState() 메소드를 호출하지 않고 OS가 streetview를 실행하기 위해 메모리에 대한 App을 강제 종료합니다.

내가 다르게해야 할 일이 있습니까? 내가 왜 이런 일에 대한 단서가있을 수 있습니다 생각

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

 @Override 
    public void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     sLong = savedInstanceState.getDouble("sLong"); 
     sLat = savedInstanceState.getDouble("sLat"); 
     sMapStyle = savedInstanceState.getBoolean("sMapStyle"); 
     sMapUpdate = savedInstanceState.getBoolean("sMapUpdate"); 
     sMapStreet = savedInstanceState.getBoolean("sMapStreet"); 
     sFirstTime = savedInstanceState.getBoolean("sFirstTime"); 
     locationAvailable = savedInstanceState.getBoolean("locationAvailable"); 
     sGPSFlag = savedInstanceState.getBoolean("sGPSFlag"); 
     sMessage = savedInstanceState.getString("sMessage"); 
     sMap = savedInstanceState.getString("sMap"); 
     sGPS = savedInstanceState.getString("sGPS"); 
     sAddressIn = savedInstanceState.getString("sAddressIn"); 
     sGPSLat = savedInstanceState.getString("sGPSLat"); 
     sGPSLong = savedInstanceState.getString("sGPSLong"); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle savedInstanceState) { 
     super.onSaveInstanceState(savedInstanceState); 
     savedInstanceState.putDouble("sLong",sLong); 
     savedInstanceState.putDouble("sLat",sLat); 
     savedInstanceState.putBoolean("sMapStyle",sMapStyle); 
     savedInstanceState.putBoolean("sMapUpdate",sMapUpdate); 
     savedInstanceState.putBoolean("sMapStreet",sMapStreet); 
     savedInstanceState.putBoolean("sFirstTime",sFirstTime); 
     savedInstanceState.putBoolean("locationAvailable",locationAvailable); 
     savedInstanceState.putBoolean("sGPSFlag",sGPSFlag); 
     savedInstanceState.putString("sMessage",sMessage); 
     savedInstanceState.putString("sMap",sMap); 
     savedInstanceState.putString("sGPS",sGPS); 
     savedInstanceState.putString("sAddressIn",sAddressIn); 
     savedInstanceState.putString("sGPSLat",sGPSLat); 
     savedInstanceState.putString("sGPSLong",sGPSLong); 
    } 

: 여기

내에서 OnCreate, onRestoreInstanceState 및 onSaveInstanceState 방법이다. 아직도 그것을 정정하는 방법 아직도 확실하지 않습니다. 일부 디버깅 메시지를 설정하고 onRestoreInstanceState()onSaveInstanceState() 메서드가 실행되는 것을보고 있습니다.

문제는 까지 내 저장된 인스턴스를 복원하지 않고onCreate() 메서드 완료 후입니다. 그러나이 시점에서 여전히 null 인 변수를 필요로한다는 것은 onCreate() 메서드 중에 있습니다. onCreate() 이후에 사용자 코드를 입력하지 않고도 코드를 실행하려면 어떻게해야합니까? 또는 코드 앞에 onRestoreInstanceState()을 어떻게 실행시킬 수 있습니까?

+0

'onpause()'와'onSaveInstanceState()'가 호출되지 않는다는 것을 어떻게 알 수 있습니까? 이 방법 중 하나 (또는 ​​둘 다)에 상태를 저장하려고 시도하고 있습니까? 그들에게 전화를 걸고 있습니까? –

+0

logcat에서 pause = false를 표시합니다. 따라서 실행중인 onpause()처럼 보이지 않습니다. 또한 내 onSaveInstanceState() 메서드에서 저장하려고 시도하는 변수를 넣습니다. – Brian

답변

2

onSaveInstanceState을 올바로 사용하지 않았을 수 있습니다.

  1. 하면 onSaveInstanceState에서 당신에 전달 된 번들에 앱의 상태를 나타내는 변수를 쓰기 있는지 확인합니다.

  2. 당신의 활동이 onCreate 인 경우 주어진 번들을 사용하여 상태를 복원하십시오. 또는 onRestoreInstanceState에서이 작업을 수행 할 수 있습니다.

자세한 예제는 this을 참조하십시오.

+0

비록 내가 onSaveInstanceState에 저장하더라도, 내 프로세스를 죽인 logcat에서 볼 때 Streetview 활동에서 돌아온 후에도 여전히 null을 표시합니다. – Brian

+0

어젯밤에 onRestoreInstanceState()를 사용하면서 두뇌 폭풍우를 겪었으며, 실제로이 메서드에서 필요한 코드를 호출 할 수있었습니다.이 메서드는 onCreate()에서 다시 호출 할 필요가 없습니다. . 제안 해 주셔서 감사합니다! – Brian

1

리소스를 확보하기 위해 앱을 종료하는 경우 앱을 종료하지 못하도록하거나 인스턴스 데이터를 저장하기 위해 수행 할 수있는 작업이 없습니다.

Android 개발자 사이트에서 Saving Persistent State을 확인하십시오. 그들은 더 적극적으로 인스턴스 상태를 저장해야 할 수 있음을 시사 -이 앱은 안드로이드에 의해 살해 될 때 상태를 손실로부터 보호됩니다

당신은 아마 키에 더 적극적으로 당신의 데이터를 커밋 할 것 활동의 수명주기 동안 시간 : 예를 들어 등, 사용자가 입력 필드 사이 가 전환 할 때, 당신의 자신의 활동을 마무리하기 전에,

을 새로운 활동을 시작하기 전에 내가 제안 할 수 있습니다 모두는 당신을 명시 적으로 사입니다 스트리트 뷰 활동을 시작하기 전에 인스턴스 상태를 확인하십시오.

onCreate에서 인스턴스 상태가 null이고 인스턴스가 올바르게 저장되었다는 데 도움이되지 않으면 onCreate에서 나머지 코드보다 먼저 인스턴스 상태를 복원하는 것이 좋습니다. onRestoreInstanceState 들어

:

이전 상태 저장된 활동 A로부터 재 초기화되고있을 때이 방법은 ONSTART() 후 호출

주어진

또한 동일한 링크에서 참고 여기 savedInstanceState에 있습니다.

이제 ONSTART는 :에서 onCreate (번들) 이후에 호출

- 활동 가 중지했을 때 또는 onRestart 후(),하지만 지금은 다시 이 사용자에게 표시되고있다.

따라서 onCreate에서 필요한 모든 항목의 상태를 onRestoreInstanceState에서 복원 할 수 없습니다.이 작업은 onCreate에서 수행해야합니다.

0

onSaveInstanceState 함수에서 "super.onSaveInstanceState"가 끝에 와야합니다.

관련 문제