Пользователь может войти в систему только сервер с ОДНИМ экземпляром приложения (т.е. использование нескольких устройств не допускается). Если другой экземпляр получает эту блокировку «входа в систему», то все остальные экземпляры этого пользователя должны удалить свои данные (сброс к заводским настройкам), чтобы обеспечить согласованность.
Можно принудительно получить блокировку, потому что пользователь может удалить приложение и переустановить его, что приведет к другому идентификатору экземпляра, и пользователь больше не сможет снять блокировку. Следовательно, можно принудительно получить блокировку.
Из-за такой принудительной возможности нам нужно всегда проверять конкретный экземпляр, имеет ли он блокировку. Это делается при (почти) каждом запросе к серверу. Сервер может отправить «неправильный идентификатор блокировки». Если это обнаружено, клиентское приложение должно удалить все.
Это был вариант использования.
Я иметь действие A, которое запускает действие входа L или основное действие приложения B в зависимости от значения SharedPrefs. После запуска L или B он закрывается, и работает только L или B. Таким образом, в случае, если пользователь уже вошел в систему, B сейчас работает.
B запускает C. C вызывает startService для IntentService D. Это приводит к этот стек:
(A) > B > C > D
Из метода onHandleIntent D событие отправляется в ResultReceiver R.
R теперь обрабатывает это событие, предоставляя пользователю диалоговое окно, в котором он может выбрать сброс настроек приложения (удаление базы данных, общих настроек и т. д.)
После сброса настроек я хочу перезапустить приложение (чтобы закрыть все действия) и снова запустить только A, который затем запускает действие входа в систему 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);
}
Код: Выделить всё
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 Я получаю сообщение об ошибке:
Код: Выделить всё
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?
Итак, как мне решить проблему, чтобы стек действий стал (A) > L?
Подробнее здесь: https://stackoverflow.com/questions/660 ... ndroid-app
Мобильная версия