Android — onOnCreateOptionsMenu не вызывается через намерение

#android #android-intent

#Android #android-намерение

Вопрос:

В настоящее время у меня есть действие, в котором есть одноточечный режим lauchMode, и служба, которая создает уведомление, которое открывает действие onclick. Действие вызывает функцию, и пока функция работает, кнопка обновления optionsmenu будет установлена в качестве progressbar.

Для этого я сохраняю меню и объект MenuItem в функции onOptionsMenuCreate. Теперь проблема в том, что если я полностью закрою приложение и нажму на уведомление службы, приложения откроются и появится исключение NullException, потому что событие onOptionsMenuCreate не вызывается, когда приложение запускается через намерение из службы. Таким образом, переменные равны нулю. Он отлично работает, когда приложение не закрыто и может быть просто возобновлено.

Вот мой код (упрощенный):

Намерение (для уведомления):

     Intent resultIntent = new Intent(this, MainActivity.class);
    resultIntent.setAction("START_FOO");
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent resultPendingIntent =
            PendingIntent.getActivity(
                    this,
                    0,
                    resultIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT
            );
 

onCreate() (MainActivity):

 if (intent.getAction().equals("START_FOO")) {
        foo();
    }
 

onNewIntent() (MainActivity):

 if (intent.getAction().equals("START_FOO")) {
        foo();
    }
 

onOptionsMenuCreate() (MainActivity):

     this.refreshItem = menu.findItem(R.id.action_refresh);
    this.menu = menu;
 

foo() (MainActivity):

 // here comes a NullException, if the application starts through the intent. (only start - resuming works fine through the intent)
refreshItem.setActionView(R.layout.menu_refresh_progress);
 

Я многое отладил, поэтому могу сказать, что функция onCreate будет вызвана, а событие onOptionsMenuCreate() — нет.

  • Запустить приложение без намерения -> работает нормально
  • Возобновить приложение без намерения -> работает нормально
  • Запустите приложение через намерение -> OnOptionsMenuCreate не вызывается
  • Возобновить приложение через intent -> работает нормально

PS: Я надеюсь, что мой английский был достаточно хорош, чтобы кто-нибудь мог понять мою проблему. 🙂

Ответ №1:

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

Вместо этого используйте статическую boolean переменную в своем приложении и установите ее true равной, когда приложение запускается через уведомление Intent . Затем onPrepareOptionsMenu() вы можете проверить состояние boolean переменной и соответствующим образом настроить содержимое меню.

Метод onPrepareOptionsMenu() вызывается каждый раз, когда меню отображается пользователю, так что это то место, где вы должны выполнять динамические настройки меню.

Комментарии:

1. Привет, я пробовал это с помощью onPrepareOptionsMenu(), но он по-прежнему работает не через намерение. Вызывается onCreate, а затем foo() , но onPrepareOptionsMenu не вызывается.

2. Если я перемещаю свой телефон, чтобы он переключался в ландшафтный режим, вызывается onCreate, но inPrepareOptionsMenu нет -> снова исключение NullPointerException.

3. Нет, вы неправильно поняли мой пост. Не полагайтесь на refreshItem правильную настройку при запуске приложения через Notification . Вы должны просто установить boolean переменную true , когда используется уведомление. Вот и все. onPrepareOptionsMenu() , при вызове должен вызываться setActionView() соответствующим образом на основе значения boolean переменной.

4. Моя проблема в том, что мне нужно иметь доступ к целевому пункту меню (refreshItem), чтобы позже я мог использовать кнопку обновления в качестве панели прогресса. Именно по этой причине я пытаюсь сохранить экземпляр меню и кнопку обновления (refreshItem) в качестве переменной. У вас есть идея, как функция foo() может получить доступ к кнопке обновления?

5. Я не понимаю, как пункт меню можно использовать в качестве индикатора выполнения, но в любом случае, пункт меню «‘не существует»‘, пока вы не нажмете на него, поэтому вы не сможете получить к нему доступ, пока пользователь не откроет список опций.