Android에서 스 와이프하여 앱이 종료 될 때 코드를 처리하는 방법은 무엇입니까?
내 앱이 실행 중이고 홈 버튼을 누르면 앱이 백그라운드로 전환됩니다. 이제 홈 버튼을 길게 누르고 최근 앱 목록에서 앱을 스 와이프하여 앱을 종료하면 onPause()
, onStop()
또는 같은 이벤트가 발생 onDestroy()
하지 않고 오히려 프로세스가 종료됩니다. 서비스를 중지하고 알림을 종료하고 리스너를 등록 취소하려면 어떻게해야합니까? 나는 꽤 많은 기사와 블로그를 읽었지만 유용한 정보를 얻지 못했고 그것에 대한 문서를 찾지 못했습니다. 어떤 도움을 주시면 감사하겠습니다. 미리 감사드립니다.
비슷한 종류의 문제를 방금 해결했습니다.
최근 앱 목록에서 스 와이프하여 애플리케이션이 종료 될 때 서비스를 중지 하는 경우 다음을 수행 할 수 있습니다 .
매니페스트 파일 내 에서 서비스 플래그 stopWithTask
를 유지하십시오 true
. 처럼:
<service
android:name="com.myapp.MyService"
android:stopWithTask="true" />
그러나 리스너 등록을 취소하고 알림을 중지하고 싶다고 말했듯이이 방법을 제안합니다.
매니페스트 파일 내 에서 서비스 플래그
stopWithTask
를 유지하십시오false
. 처럼:<service android:name="com.myapp.MyService" android:stopWithTask="false" />
이제
MyService
서비스에서 method를 재정의 하십시오onTaskRemoved
. (이로stopWithTask
설정된 경우에만 실행됩니다false
).public void onTaskRemoved(Intent rootIntent) { //unregister listeners //do any other cleanup if required //stop service stopSelf(); }
코드의 다른 부분도 포함하는 자세한 내용은 내 질문 을 참조하십시오 .
도움이 되었기를 바랍니다.
이 작업을 수행하는 한 가지 방법을 찾았습니다.
이렇게 하나의 서비스를
public class OnClearFromRecentService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("ClearFromRecentService", "Service Started");
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("ClearFromRecentService", "Service Destroyed");
}
@Override
public void onTaskRemoved(Intent rootIntent) {
Log.e("ClearFromRecentService", "END");
//Code here
stopSelf();
}
}
2) manifest.xml에이 서비스 등록
<service android:name="com.example.OnClearFromRecentService" android:stopWithTask="false" />
3) 그런 다음 스플래시 활동에서이 서비스를 시작하십시오.
startService(new Intent(getBaseContext(), OnClearFromRecentService.class));
그리고 이제 안드로이드에서 앱을 지울 때마다 onTaskRemoved () 메서드가 실행됩니다.
비슷한 문제를 해결했습니다. 최근 작업에서 스 와이프 한 후 다음에 실행할 때 제대로 작동하려면 아래 단계를 따르세요.
1) Save process ID in shared preference:
SharedPreferencesUtils.getInstance().putInt(SharedPreferencesUtils.APP_PROCESS_ID, android.os.Process.myPid());
2) When application is launched from launcher after clear from recent task then do:
int previousProcessID = mSharedPreferencesUtils.getInt(SharedPreferencesUtils.APP_PROCESS_ID);
int currentProcessID = android.os.Process.myPid();
if ((previousProcessID == currentProcessID)) {
// This ensures application not killed yet either by clearing recent or anyway
} else {
// This ensures application killed either by clearing recent or by anyother means
}
When you press home - onPause
and onStop
of your Activity is being called, so at this time you have to do all savings and cleanup, because Android platform doesn't further guarantee that onDestroy
or any other lifecycle method would be invoked, so the process could be killed without any notification.
You need to save your data when on onPause()
is called. Look at this life cycle diagram: Android Developer
You can see that an app can be killed after onPause()
or onStop()
.
Handle your data there and recover it in onRestart()
\ onCreate()
.
good luck!
You can't handle swipe, because system just removes your process from memory without calling any callback.
I have checked, that before user calls "recent apps" screen, onPause() will be always called. So you need to save all data in onPause method without checking isFinishing().
To check back button, use onBackPressed method.
This worked for me on android 6,7,8,9.
Make one service like this:
public class OnClearFromRecentService extends Service {
@Override public IBinder onBind(Intent intent) {
return null; }
@Override public int onStartCommand(Intent intent, int flags, int
startId) {
Log.d("ClearFromRecentService", "Service Started");
return START_NOT_STICKY; }
@Override public void onDestroy() {
super.onDestroy();
Log.d("ClearFromRecentService", "Service Destroyed"); }
@Override public void onTaskRemoved(Intent rootIntent) {
Log.e("ClearFromRecentService", "END");
//Code here
stopSelf(); } }
2) Register this service in manifest.xml
:
<service android:name="com.example.OnClearFromRecentService"
android:stopWithTask="false" />
3) Then start this service on your splash activity
startService(new Intent(getBaseContext(),
OnClearFromRecentService.class));
ViewModel.onCleared() can be useful, if the goal is to release some resource (perhaps a system running somewhere else on the network) when the user executes a surprise exit by swiping, rather than by pressing the "stop" or button. [This is how I originally arrived at this question].
Application doesn't get a notification, and Activity.onDestroy() gets called for configuration changes such as changes in orientation, so the answer isn't there. But ViewModel.onCleared gets called when the Application is swiped away (as well as when the user backs out of the activity). If the resource you want to use is associated with more than one activity in the stack, you can add reference counts or some other mechanism to decide if ViewModel.onClear should release the resource.
This is yet another of many good reasons to use ViewModel.
-- Bob
'programing tip' 카테고리의 다른 글
Node.js 이벤트 시스템은 Akka의 행위자 패턴과 어떻게 다른가요? (0) | 2020.09.02 |
---|---|
IDLE 대화 형 쉘에서 파이썬 스크립트를 실행하는 방법은 무엇입니까? (0) | 2020.09.01 |
하위 디렉토리에서 .htaccess 암호 보호를 제거하는 방법 (0) | 2020.09.01 |
HTTPS를 통해 전송되지 않는 리소스 확인 (0) | 2020.09.01 |
#ifdef 및 #ifndef의 역할 (0) | 2020.09.01 |