사용자가 설정을 통해 강제 종료 한 후 앱이 시작되는지 알 수 있습니까?

StackOverflow https://stackoverflow.com/questions/9400488

  •  29-10-2019
  •  | 
  •  

문제

내 활동의 onCreate ()에서 앱이 일반 홈 / 뒤로 버튼에 따라 이전에 종료되었는지 또는 사용자가 실제로 Android 설정으로 이동하여 강제 종료를 선택했는지 알고 싶습니다.

이 두 가지 경우를 구분할 수 있습니까?

수정 :

내가 의미하는 바를 충분히 설명하지 못했을 것 같습니다. 활동 수명주기 문서를 읽었으며 상당히 잘 이해하고 있습니다.

기본적으로 사용자가 이전에 Android 설정으로 이동하여 강제 종료를 눌렀는지 여부와 관계없이 활동이 언제 생성되었는지 알고 싶습니다. 앱이 강제 중지 된 경우 조치를 취하고 싶습니다 (특히 시작시 스플래시 화면 표시).

아래의 많은 답변은 onStop () 또는 onDestroy ()에 플래그를 넣을 수 있으며 사용자가 강제 중지를 누르면 이러한 메서드가 호출되지 않는다고 말합니다. 문제는 다음 순서로 인해 해당 지점에 도달하기 전에 이러한 메서드가 이미 호출되었을 것입니다.

  1. 앱이 활성 상태이며 사용 중입니다.
  2. 사용자가 뒤로 버튼 (onStop (), onDestroy () 호출 됨) 또는 홈 버튼 (onStop () 호출 됨) 또는 최근 앱 버튼 (onStop () 호출 됨)을 누름
  3. 사용자가 Android 설정으로 이동하여 강제 종료를 탭합니다.

    이 상황에서 플래그를 onStop ()의 공유 환경 설정에 넣었지만 사용자는 강제 중지를 누르고 플래그는 여전히 onCreate ()에서 활성화됩니다.

    사용자가 설정에서 강제 종료를 누르지 않는 한 스플래시 화면을 표시하고 싶지 않습니다. 이것이 해야하는 방식이 아니라는 것을 알고 있습니다.하지만이 결정은 제가 내린 것이 아닙니다.

다른 팁

더 쉬운 방법이 있는지 확실하지 않지만 Activity의 onStop 함수에서 플래그로 업데이트되는 SharedPreferences 객체를 만들 수 있습니다.그리고 onCreate에서 플래그를 확인하십시오.사용자 강제가 앱을 닫으면 onStop 또는 onDestroy가 호출되지 않는다고 생각합니다.

사용자가 "강제 종료"로 애플리케이션을 닫은 경우 "onStop"메소드가 실행되지 않습니다.해당 메서드에 플래그 (파일에 저장, 사용자 기본 설정, SQL 등)를 넣을 수 있습니다.다음에 응용 프로그램이 시작될 때 플래그를 확인하십시오!

홈 활동의 유전자 태그 코드를 재정의합니다 (일반적인 경우 뒤로 버튼을 누르면 애플리케이션 기본 활동이 닫힙니다).

이 함수에서 SharedPreferences 변수 (예 : lastforceClose를 false로 설정)를 설정 한 다음 onbackbuttonpressed () 또는 finish ()의 수퍼 메서드를 호출하여 활동을 종료합니다.

다음에 활동을 시작할 때마다 sharedpreferences의 변수를 확인하여 lastforceClose 변수가 false로 설정되어 있는지 여부를 확인할 수 있습니다 (지금 바로 true로 변경) ...

사용자가 Android 설정을 통해 onBackButtonPressed를 가지고있는 경우 여기에서 케이스를 처리 할 수도 있습니다. (예 : 공유 환경 설정 xml 파일 등에 키가 없음)

100 % 확실하지는 않지만 작동합니다.
1) 일부 영구 저장소의 onDestroy of the Activity에서 상태 (정상 종료)를 저장합니다.(SharedPreferences 또는 SQLite)
2) onCreate에서 상태를 확인하고 정상 종료이면 앱이 정상적으로 닫히고 그렇지 않으면 강제로 닫혔습니다.상태를 재설정합니다.

먼저, 재개와 제작이 혼동 스러울 수 있습니다. 앱 기본 사항, 특히 활동 수명주기 에 대한 내용을 확실히 읽어보세요. . 그 상태 다이어그램이 도움이됩니다.

사용자가 애플리케이션에서 "백업"할 때 반드시 폐기되는 것은 아닙니다. 실제로 개발자가 Activity를 명시 적으로 파괴하는 onPause()에 후크를 추가하지 않는 한 파괴되지 않을 것입니다.

이해해야 할 Android 앱 수명주기에서 가장 중요한 단일 개념은 다음과 같습니다.

Android OS는 사용자가 원하든 원하지 않든 언제든지 종료 될 수 있다는 보장을 제외하고는 애플리케이션이 얼마나 오래 지속될 지에 대해 절대적으로 보장하지 않습니다.

그에 따라 항상 앱을 작성해야하며 수명주기 시작 및 종료 후크의 모든 단일 항목을 채우는 것이 좋습니다. 사용자가 앱에서 하드웨어 버튼을 되 돌리면 앱이 필요하게 파괴되지 않지만 강제 종료를 통해 앱이 종료되면 앱이 완전히 파괴됩니다. 앱이 어떻게 닫혔는지 확인하는 방법을 찾는 대신,이를 처리하는 "적절한"방법은 상태에 따라 적절한 양의 정리를 수행하도록 onPause(), onStop()onDestroy() 메서드를 설정하는 것입니다. 사용자가 작업을 통해 수행하지 않아도 기술적으로 OS가 여전히 앱을 "강제 종료"할 수 있기 때문에 onDestroy()가 호출 된 경우에만 뒤집히는 일종의 Preference 객체 또는 상태 변수가있을 수 있습니다. 매니저.

모든 앱 수명주기 이벤트의 기록을 유지 한 다음 기록 된 마지막 이벤트가 정상인지 다양한 유전자 태그 코드를 확인할 수 있습니다. 그렇지 않다면 어떤 일이 일어 났음을 합리적으로 추론 할 수 있습니다. 사용자가 강제 종료를 호출하면 시스템이 앱에 유전자 태그 코드를 전송하게되며,이 경우 아무런 표시도받지 못할 것입니다. 가 도움이 될 수 있습니다.

또한 원하는 것을 다른 방식으로 달성 할 수 있는지 여부도 고려할 수 있습니다. 앱이 완전히 상태 비 저장 인 경우 어떤 종류의 종료에도 문제가 없어야합니다. 앱에 상태가있는 경우 이론적으로 모든 데이터 / 앱 트랜잭션이 ACID ity를 달성 할 수 있습니다. 따라서 충돌 / 강제 종료로 인한 불일치를 방지 할 수 있습니다.

그게 도움이 되나요? 아니면 다른 작업을 원하시나요? ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ ㅇㅇㅇ

활동이 아닌 서비스에서 상태 플래그를 작성하는 것은 어떻습니까?활동 수명주기는 여전히 완료되지만 서비스 수명주기는 완료되지 않아야합니다.

귀하의 요구 사항과 동일하지는 않지만 충분히 가까울 수 있습니다.이 요구 사항이없는 활동을 표시하는 경우 서비스를 중지하고 나중에 다시 시작해야합니다.또는 서비스가 일종의 이벤트 스트림을 작성하고이를 사용하여 시작시 표시 할 내용을 파악하도록합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top