Android에서 스 와이프하여 앱이 종료 될 때 코드를 처리하는 방법은 무엇입니까? 중이고 홈 버튼을

내 앱이 실행 중이고 홈 버튼을 누르면 앱이 백그라운드로 전환됩니다. 이제 홈 버튼을 길게 누르고 최근 앱 목록에서 앱을 스 와이프하여 앱을 종료하면 onPause(), onStop()또는 같은 이벤트가 발생 onDestroy()하지 않고 오히려 프로세스가 종료됩니다. 서비스를 중지하고 알림을 종료하고 리스너를 등록 취소하려면 어떻게해야합니까? 나는 꽤 많은 기사와 블로그를 읽었지만 유용한 정보를 얻지 못했고 그것에 대한 문서를 찾지 못했습니다. 어떤 도움을 주시면 감사하겠습니다. 미리 감사드립니다.



답변

비슷한 종류의 문제를 방금 해결했습니다.

최근 앱 목록에서 스 와이프하여 애플리케이션이 종료 될 때 서비스를 중지 하는 경우 다음을 수행 할 수 있습니다 .

매니페스트 파일 내 에서 서비스 플래그 stopWithTask를 유지하십시오 true. 처럼:

<service
    android:name="com.myapp.MyService"
    android:stopWithTask="true" />

그러나 리스너 등록을 취소하고 알림을 중지하고 싶다고 말했듯이이 방법을 제안합니다.

  1. 매니페스트 파일 내 에서 서비스 플래그 stopWithTask를 유지하십시오 false. 처럼:

    <service
        android:name="com.myapp.MyService"
        android:stopWithTask="false" />
  2. 이제 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) 공유 기본 설정에 프로세스 ID 저장 :

SharedPreferencesUtils.getInstance().putInt(SharedPreferencesUtils.APP_PROCESS_ID, android.os.Process.myPid());

2) 최근 작업에서 지운 후 런처에서 응용 프로그램이 시작되면 다음을 수행하십시오.

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
}


답변

당신이 집을 누를 때- onPause그리고 onStop당신의 활동이 호출 될 때, 그래서 지금 당신은 모든 절약과 정리를해야합니다. 왜냐하면 안드로이드 플랫폼은 더 이상 onDestroy다른 라이프 사이클 메소드가 호출 될 것이라는 것을 보장하지 않기 때문에 프로세스가 종료 될 수 있습니다. 통지없이.


답변

on onPause()이 호출 되면 데이터를 저장해야합니다 . 이 수명주기 다이어그램을보십시오.
Android 개발자

onPause()또는 이후에 앱이 종료 될 수 있음을 알 수 있습니다 onStop().

거기에서 데이터를 처리하고 onRestart()\ 에서 복구하십시오 onCreate().

행운을 빕니다!


답변

시스템은 콜백을 호출하지 않고 메모리에서 프로세스를 제거하기 때문에 스 와이프를 처리 할 수 ​​없습니다.

사용자가 “최근 앱”화면을 호출하기 전에 항상 onPause ()가 호출되는지 확인했습니다. 따라서 isFinishing ()을 확인하지 않고 모든 데이터를 onPause 메서드에 저장해야합니다.

뒤로 버튼을 확인하려면 onBackPressed 메서드를 사용하십시오.


답변

ViewModel.onCleared ()는 사용자가 “중지”또는 버튼을 누르는 대신 스 와이프하여 깜짝 종료를 실행할 때 일부 리소스 (네트워크의 다른 곳에서 실행중인 시스템)를 해제하는 것이 목표 인 경우 유용 할 수 있습니다. [원래이 질문에 도달 한 방법입니다].

응용 프로그램이 알림을받지 못하고 Activity.onDestroy ()가 방향 변경과 같은 구성 변경에 대해 호출되므로 대답이 없습니다. 그러나 ViewModel.onCleared는 애플리케이션이 스 와이프 될 때 (및 사용자가 활동에서 돌아올 때) 호출됩니다. 사용하려는 리소스가 스택의 둘 이상의 활동과 연결되어있는 경우 참조 횟수 또는 다른 메커니즘을 추가하여 ViewModel.onClear가 리소스를 해제할지 여부를 결정할 수 있습니다.

이것은 ViewModel을 사용하는 또 다른 좋은 이유입니다.

-밥