#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. Я не понимаю, как пункт меню можно использовать в качестве индикатора выполнения, но в любом случае, пункт меню «‘не существует»‘, пока вы не нажмете на него, поэтому вы не сможете получить к нему доступ, пока пользователь не откроет список опций.