Как программно «перезапустить» приложение Android?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как программно «перезапустить» приложение Android?

Сообщение Anonymous »

Во-первых, я знаю, что на самом деле не следует убивать/перезапускать приложение на Android. В моем случае я хочу восстановить заводские настройки моего приложения в конкретном случае, когда сервер отправляет клиенту часть определенной информации.
Пользователь может войти в систему только сервер с ОДНИМ экземпляром приложения (т.е. использование нескольких устройств не допускается). Если другой экземпляр получает эту блокировку «входа в систему», то все остальные экземпляры этого пользователя должны удалить свои данные (сброс к заводским настройкам), чтобы обеспечить согласованность.
Можно принудительно получить блокировку, потому что пользователь может удалить приложение и переустановить его, что приведет к другому идентификатору экземпляра, и пользователь больше не сможет снять блокировку. Следовательно, можно принудительно получить блокировку.
Из-за такой принудительной возможности нам нужно всегда проверять конкретный экземпляр, имеет ли он блокировку. Это делается при (почти) каждом запросе к серверу. Сервер может отправить «неправильный идентификатор блокировки». Если это обнаружено, клиентское приложение должно удалить все.

Это был вариант использования.
Я иметь действие 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);
}
И это класс 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 все еще выполняются. Если я нажму кнопку «Назад» в процессе входа в систему, я увижу 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?
Я не могу использовать контекст действий, поскольку ServiceIntent D также может быть вызван из фоновой задачи, запускаемой AlarmManager.
Итак, как мне решить проблему, чтобы стек действий стал (A) > L?

Подробнее здесь: https://stackoverflow.com/questions/660 ... ndroid-app
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»