Android - Как Переопределить кнопку “Back”, таким образом, она не Заканчивает () мое Действие?

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

Это - то, так, чтобы, когда Пользователь теснит и Действие было продвинуто к фону, который они могут возвратить к Действию с помощью Уведомления.

Проблема возникает, когда Пользователь нажимает кнопку "Назад", мое Действие уничтожается, но Уведомление остается, поскольку я хочу, чтобы пользователь смог оттеснить, но все еще смочь добраться до Действия с помощью Уведомления. Но когда ПОЛЬЗОВАТЕЛЬ пробует это, я получаю Нулевых указателей как его попытку запустить новое действие вместо того, чтобы возвратить старое.

Таким образом, по существу я хочу, чтобы Кнопка "Назад" действовала то же самое как кнопка "Домой", и вот то, как я попробовал до сих пор:


        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)  {
            if (Integer.parseInt(android.os.Build.VERSION.SDK) < 5
                    && keyCode == KeyEvent.KEYCODE_BACK
                    && event.getRepeatCount() == 0) {
                Log.d("CDA", "onKeyDown Called");
                onBackPressed();
            }

            return super.onKeyDown(keyCode, event);
        }

        public void onBackPressed() {
            Log.d("CDA", "onBackPressed Called");
            Intent setIntent = new Intent(Intent.ACTION_MAIN);
            setIntent.addCategory(Intent.CATEGORY_HOME);
            setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(setIntent); 

            return;
        }   

Однако вышеупомянутый код все еще, кажется, позволяет моему Действию быть уничтоженным, Как я могу мешать своему Действию быть уничтоженным, когда кнопка "Назад" нажимается?

193
задан Donal Rafferty 29 June 2010 в 04:31
поделиться

2 ответа

Удалите ключевой прослушиватель или верните true , если у вас есть KEY_BACK .

Вам просто нужно следующее, чтобы поймать клавишу возврата (не вызывайте super в onBackPressed () ).

Кроме того, если вы планируете запускать службу в фоновом режиме, обязательно посмотрите на startForeground () и убедитесь, что у вас есть постоянное уведомление, иначе Android убьет вашу службу, если потребуется свободная память.

@Override
public void onBackPressed() {
   Log.d("CDA", "onBackPressed Called");
   Intent setIntent = new Intent(Intent.ACTION_MAIN);
   setIntent.addCategory(Intent.CATEGORY_HOME);
   setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   startActivity(setIntent);
}
262
ответ дан 23 November 2019 в 05:27
поделиться

Я думаю, что вы хотите не переопределять кнопку назад (это просто не кажется хорошей идеей - Android OS определяет это поведение, зачем его менять?), а использовать Activity Lifecycle и сохранять ваши настройки/данные в событии onSaveInstanceState(Bundle).

@Override
onSaveInstanceState(Bundle frozenState) {
    frozenState.putSerializable("object_key",
        someSerializableClassYouWantToPersist);
    // etc. until you have everything important stored in the bundle
}

Затем вы используете onCreate(Bundle), чтобы получить все из этого сохраняемого пакета и воссоздать состояние.

@Override
onCreate(Bundle savedInstanceState) {
    if(savedInstanceState!=null){ //It could be null if starting the app.
        mCustomObject = savedInstanceState.getSerializable("object_key");
    }
    // etc. until you have reloaded everything you stored
}

Считайте, что приведенный выше псевдокод указывает вам правильное направление. Чтение Жизненного цикла деятельности должно помочь вам определить лучший способ достижения того, что вы ищете.

12
ответ дан 23 November 2019 в 05:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: