Android: выход из приложения с кнопкой «Домой» и возврат к другой активности при длительном нажатии на кнопку «Домой» - PullRequest
5 голосов
/ 22 сентября 2011

У меня есть приложение, использующее Bluetooth, и оно не должно быть доступно, если на устройстве выключен Bluetooth.

способ, который я выбрал для реализации, заключается в следующем:

  1. создал диспетчерское действие, которое запускается при первом запуске приложения.
  2. это действие проверяет состояние Bluetooth, если bt выключен, он отправляет вас на noBtScreen, если он включен, он принимает вас yesBtScreen

проблема в том, что когда пользователь попадает на noBtScreen, а затем нажимает кнопку «Домой», меняет статус «bt» и возвращается в приложение (долгое нажатие на кнопку «Домой» и выбор моего приложения) он достигает noBtScreen которого он не должен получить на данный момент.

Существуют, очевидно, наивные способы исправить это, например, я могу проверить статус bt в onResume упражнения, но я думаю, что есть «правильное» решение, которое следует использовать здесь.

Я пробовал некоторые настройки активности в файле манифеста в частности, я попытался поставить следующие флаги на NoBtTask:
android:finishOnTaskLaunch
android:allowTaskReparenting в комбинации, а не в комбинации с
android:clearTaskOnLaunch
android:alwaysRetainTaskState

Я также пытался добавить this.finish к методу noBtActivity::onStop, но это тоже не помогло (потом случилось то, что я вошел один раз, вышел, и когда я снова вошел, ничего не произошло, и я остался на домашнем экране, когда я попробовал это снова, это действительно привело меня к работе диспетчера, интересно посмотреть журнал для этого:

09-21 17: 54: 49.511: INFO / ActivityManager (115): Запуск: Intent {cmp = com.test.elad / .NoBtActivity} из pid 12603

09-21 17: 54: 49.523: ОШИБКА / Elad (12603): NoBtActivity.onCreate

09-21 17: 54: 49.527: ОШИБКА / Elad (12603): NoBtActivity.onStart

09-21 17: 54: 49.527: ОШИБКА / Elad (12603): NoBtActivity.onResume

09-21 17: 54: 49.765: INFO / ActivityManager (115): отображается com.test.elad / .NoBtActivity: + 248 мс

09-21 17: 54: 51.867: ОШИБКА / Elad (12603): NoBtActivity.onSaveInstanceState

09-21 17: 54: 51.867: ОШИБКА / Elad (12603): NoBtActivity.onPause

09-21 17: 54: 51.867: INFO / ActivityManager (115): Запуск: Intent {act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10200000 cmp = com. android.launcher / com.android.launcher2.Launcher} из pid 115

09-21 17: 54: 51.882: VERBOSE / RenderScript_jni (195): SurfaceCreated

09-21 17: 54: 51.882: VERBOSE / RenderScript_jni (195): SurfaceChanged

09-21 17: 54: 52.277: ОШИБКА / Elad (12603): NoBtActivity.onStop

09-21 17: 54: 56.183: INFO / ActivityManager (115): Запуск: Intent {act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER] flg = 0x10100000 cmp = com. test.elad / .DispatcherActivity} из pid 115

09-21 17: 54: 56.265: ОШИБКА / Elad (12603): NoBtActivity.onDestroy

Ответы [ 8 ]

1 голос
/ 26 сентября 2011

Вызов finish() в onUserLeaveHint() обратный вызов действия.

1 голос
/ 22 сентября 2011

Поместите android:noHistory="true" в Манифест для noBtScreen и yesBtScreen.

Вот что говорит андроид о noHistory:

Значение «true» означаетчто деятельность не оставит исторического следа.Он не останется в стеке действий для задачи, поэтому пользователь не сможет вернуться к нему.

РЕДАКТИРОВАТЬ:

У меня есть другойПредположение, что, надеюсь, сработает.

Когда вы startActivity из вашей Диспетчерской Деятельности, вы можете передать дополнительный с именем ключа "randomExtra"

Затем в onResume или onCreateиз других ваших действий проверьте, если intent.hasExtra("randomExtra"), а затем, если это возвращает true, то просто продолжайте.Если он возвращает false, тогда выполните startActivity(new Intent(context, DispatcherActivity.class)

0 голосов
/ 18 февраля 2018

Я сделал приложение, в начале которого был экран входа в систему. Выход из приложения и возврат означают возврат к экрану входа в систему. Вот как я это обошел - потребовалось использование намерений для сохранения данных. (У меня есть 4 действия - Основная активность, вторая активность, настройка входа в систему и активность входа в систему)

на основной деятельности у меня это:

@Override
protected void onUserLeaveHint() {
    super.onUserLeaveHint();

    Intent intent = getIntent();
    String activity = intent.getStringExtra("activity");
    if (activity == null || !activity.equals("first") || !activity.equals("firsttime")){
        NavUtils.navigateUpFromSameTask(MainActivity.this);
    }else {
        getIntent().removeExtra("activity");
    }
    System.out.println("mainactivity");
}

на втором занятии у меня это:

private void returning(){
    Intent intent = new Intent(this, MainActivity.class);
    intent.putExtra("activity","first");
    startActivity(intent);
}

и при моей активности по настройке входа в систему у меня есть это (при нажатии для входа в систему):

    Intent i = new Intent(LoginSetup.this, MainActivity.class);
    i.putExtra("activity","firsttime");
    startActivity(i);

Таким образом, каждый раз, когда я перемещаюсь между действиями, что-то сохраняется в дополнениях намерений, и когда я покидаю занятие, намерение проверяется на предмет наличия данных намерения. Если намерение не содержит никаких дополнений, вы вернетесь к экрану входа в систему.

надеюсь, это поможет.

0 голосов
/ 03 октября 2011

Попробуйте что-нибудь вроде этого:

  1. Зарегистрируйте BroadcastReceiver для android.bluetooth.adapter.action.STATE_CHANGED (отметьте this ), оно уведомит вас, когда Bluetooth будет включенили выключено.

  2. В вашем onReceive() методе BroadcastReceiver сохраните свою позицию.Вы можете использовать sharedpreference для этого.

  3. Когда ваш noBtScreen выходит на передний план, переопределите метод onResume() и проверьте эту переменную, и если bluetooth включен, тогда startactivity(yesBtScreen)и завершить () noBtScreen.

  4. Вы можете поставить такую ​​же проверку на yesBtScreen, а если bluetooth выключен, то startactivity(noBtScreen) и завершить () yesBtScreen.

0 голосов
/ 03 октября 2011

Мое предложение для вас состоит в том, чтобы создать новый класс, расширяющийся от Activity (BTActivity) и сделать так, чтобы и NoBtActivity, и YesBtActivity расширялись от BTActivity.

Теперь, на BTActivity Override onRestart и проверьте, есть ли там состояние Bluetooth, если он включен и вы используете NoBtActivity, измените на YesBtActivity и наоборот.

0 голосов
/ 02 октября 2011

Это может не дать точного ответа на ваш вопрос, так как предполагает другой подход, но, надеюсь, он, по крайней мере, будет полезен для других зрителей.Вот что я бы сделал:

Приложение изначально запускает (BluetoothEnforcerActivity), который является пустым экраном.В его onResume() проверьте состояние Bluetooth.Если Bluetooth недоступен, покажите диалоговое окно с предупреждением, информирующее пользователя о том, что для продолжения Bluetooth должен быть включен.Диалог будет иметь кнопки «Выйти» и «Попробуйте снова».

«Выйти», конечно, закроет диалоговое окно и BluetoothEnforcerActivity (вернет пользователя на главный экран).«Повторить попытку» закроет диалоговое окно так, что BluetoothEnforcerActivity снова будет проверять Bluetooth в onResume()..BluetoothEnforcerActivity запускает основное действие и вызывает свой собственный метод finish ().

Все сказанное, не забудьте рассмотреть случай, когда пользователь отключает Bluetooth после того, как он прошел BluetoothEnforcerActivity.

0 голосов
/ 29 сентября 2011

Во-первых, если вы собираетесь поместить свой finish () где угодно, он будет в методе onPause ().onPause вызывается сразу после выхода из активно показывающей активности.

С учетом сказанного вам необходимо проверить эти флаги намерений ... более конкретно посмотрите на: http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_SINGLE_TOP

http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NO_HISTORY

Редактировать: здесь также есть флаг, установленный системой, который вы можете проверить, было ли действие запущено из истории стека действий: http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

Edit2: WOW Я вижу некоторые действительно сложные ответы!OP должен сделать не более, чем убедиться, что операция не может быть вызвана снова, если это не оговорено условным выражением.Для выполнения этой задачи достаточно флага Intent.

Не усложняйте вещи !!!

0 голосов
/ 28 сентября 2011

Попробуйте указать android: launchMode = "singleTask" в манифесте для вашей деятельности диспетчера.

...