첫째, 안드로이드에서 실제로 응용 프로그램을 죽이거나 다시 시작해서는 안된다는 것을 알고 있습니다. 유스 케이스에서 서버가 클라이언트에 특정 정보를 보내는 특정 경우 애플리케이션을 공장 초기화합니다.
사용자는 하나의 응용 프로그램 인스턴스가있는 서버에서만 로그인 할 수 있습니다 (즉, 여러 장치는 허용되지 않음). 다른 인스턴스가 해당 "로그인 된"잠금을 받으면 일관성을 유지하기 위해 해당 사용자의 다른 모든 인스턴스가 데이터를 삭제 (공장 재설정)해야합니다.
사용자가 앱을 삭제하고 다시 설치하여 다른 인스턴스 ID를 초래하고 더 이상 잠금을 해제 할 수 없기 때문에 강제로 잠금을 얻을 수 있습니다. 따라서 강제로 잠금을 얻을 수 있습니다.
그 힘 가능성 때문에 우리는 항상 잠금이있는 구체적인 인스턴스를 확인해야합니다. 서버에 대한 거의 모든 요청에 대해 수행됩니다. 서버가 "잘못된 잠금 ID"를 보낼 수 있습니다. 이것이 감지되면 클라이언트 애플리케이션이 모든 것을 삭제해야합니다.
그것은 유스 케이스였습니다.
sharedPrefs 값에 따라 Activity
로그인 Activity
L 을 시작 하는 A 또는 앱의 기본 Activity
B가 있습니다. L 또는 B를 시작한 후에는 L 또는 B 만 실행되도록 자체 종료됩니다. 따라서 사용자가 이미 로그인 한 경우 B가 현재 실행 중입니다.
B는 C를 시작한다. C startService
는 IntentService
D를 요구한다 .
(A)> B> C> D
D의 onHandleIntent 메소드에서 이벤트가 ResultReceiver R로 전송됩니다 .
R은 이제 사용자에게 애플리케이션을 공장 재설정 (데이터베이스, sharedPrefs 등 삭제) 할 수있는 대화 상자를 제공하여 해당 이벤트를 처리합니다.
공장 재설정 후 응용 프로그램을 다시 시작하고 (모든 활동을 닫으려면) A 만 다시 시작하면 로그인 Activity
L이 시작되고 자체 종료됩니다.
(A)> L
대화 상자의 onClick 방법은 다음과 같습니다.
@Override
public void onClick(DialogInterface dialog, int which) {
// Will call onCancelListener
MyApplication.factoryReset(); // (Deletes the database, clears sharedPrefs, etc.)
Intent i = new Intent(MyApp.getContext(), A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
MyApp.getContext().startActivity(i);
}
그리고 그것은 MyApp
클래스입니다 :
public class MyApp extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
public static Context getContext() {
return context;
}
public static void factoryReset() {
// ...
}
}
문제는 FLAG_ACTIVITY_NEW_TASK
활동 B와 C가 여전히 실행 중이라는 것입니다. 로그인시 뒤로 버튼을 누르면 Activity
C가 표시되지만 홈 화면으로 돌아가고 싶습니다.
설정하지 않으면 FLAG_ACTIVITY_NEW_TASK
오류가 발생합니다.
07-07 12:27:12.272: ERROR/AndroidRuntime(9512): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
D는 또한에 의해 시작된 백그라운드 작업에서 호출 될 수 Context
있기 때문에 Activities '를 사용할 수 없습니다 .ServiceIntent
AlarmManager
어떻게 이것을 (A)> L이되는 액티비티 스택으로 해결할 수 있습니까?