나의 플랫폼/안드로이드

[Android] finishAffinity

GsBOB 2017. 10. 31. 11:20

어플리케이션을 종료 하는 방법을 몇가지 블로그에 적어 놓은게 있다.


http://gogorchg.tistory.com/entry/Android-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EA%BA%A0%EB%81%97%ED%95%98%EA%B2%8C-%EC%A2%85%EB%A3%8C%ED%95%98%EB%8A%94-%EB%B2%95


http://gogorchg.tistory.com/entry/Android-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%A2%85%EB%A3%8C

System.exit 를 호출하여 종료 시키는 분들도 있으실 듯하다.


하지만, 이럴 경우 Android 내부에서 오류가 발생 할 확률이 큽니다.


특히, 멀티스레드 환경에서나 Delay를 포함 시키는 함수에서 오류를 품어낼 확률이 크죠.



그래서 API 16 이후 부터 나온 finishAffinity 함수를 호출 하기를 권장 합니다.


public static void restartApplication(Activity activity, int delay) {
if (delay == 0) {
delay = 1;
}
Intent restartIntent = activity.getPackageManager()
.getLaunchIntentForPackage(activity.getPackageName());
restartIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent intent = PendingIntent.getActivity(
activity, 0,
restartIntent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager manager = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE);
manager.set(AlarmManager.RTC, System.currentTimeMillis() + delay, intent);
finishAffinity(activity);
}

private static void finishAffinity(final Activity activity) {
activity.setResult(Activity.RESULT_CANCELED);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.finishAffinity();
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
activity.finishAffinity();
}
});
}
}

참고 : https://blog.uzuki.live/android-exit-application-finishaffinity/


위 함수를 이용하면 Application을 재실행하여 메인 함수를 호출 하게 됩니다.

참고하세요.