Intereting Posts
Является ли Thread.sleep (x) достаточно точным для использования в качестве часов в Android? Где я должен отпереть ButterKnife 8.xx в ViewHolder? Разработка Android: api 14 vs api 15 Как получить MAC-адрес подключенного Bluetooth-устройства в android Android Studio Emulator не загружает Windows 10 Получение базового аутентификатора google из AccountManager Сервер ADB не подтвердил Фрагмент места / основная активность android.view.InflateException Как найти экран заблокирован в android Как узнать и использовать OpenGL ES 2.0? Я просто не понимаю – серьезный Qn. Как получить идентификатор контакта, адрес электронной почты, номер телефона в одном запросе SQLite? Контакты Оптимизация Android Как установить значение по умолчанию для ListPreference Никакой активности не найдено для обработки Intent action.VIEW при нажатии на ссылку электронной почты Выбор / выделение нескольких элементов в списке с помощью пользовательского адаптера – Android Когда я синхронизирую методы или использую синхронизированные блоки в своих методах в игре Android?

Android OnNewIntent не вызывается

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

В настоящее время я установил свою активность как singleTop

<activity android:name="-.-.-.MainMenuActivity" android:launchMode="singleTop" android:screenOrientation="portrait" > </activity> 

Это код, в котором я создаю уведомление:

 public void showNotification(String text, String componentId){ NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.logo) .setContentTitle("Title") .setAutoCancel(true) .setContentText(text); // Creates an explicit intent for an Activity in your app Intent resultIntent = new Intent(this, MainMenuActivity.class); if(!componentId.equalsIgnoreCase("")){ resultIntent.putExtra("componentId", componentId); } resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, 0); mBuilder.setFullScreenIntent(resultPendingIntent, false); mBuilder.setContentIntent(resultPendingIntent); NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // mId allows you to update the notification later on. mNotificationManager.notify(0, mBuilder.build()); } 

Это метод OnNewIntent в моей MainMenuActivity:

 @Override protected void onNewIntent(Intent intent) { // TODO Auto-generated method stub super.onNewIntent(intent); setIntent(intent); ... } 

Я никогда не получаю звонок OnNewIntent. Я не знаю, что я делаю неправильно. Я использую только 2 действия во всем приложении, и MainMenuActivity появляется после LoginActivity, поэтому MainMenuActivity всегда должен находиться поверх стека (у меня больше фрагментов, где я заменяю их внутри MainMenuActivity).

Любая помощь будет оценена! Спасибо вам, ребята.

Solutions Collecting From Web of "Android OnNewIntent не вызывается"

Хорошо, что он работает вскоре после публикации моего вопроса. Я думаю, что ключевым отличием нашего кода является то, что я передаю флаг «PendingIntent.FLAG_UPDATE_CURRENT» для создания / поиска объекта PendingIntent. Этот пост помог мне понять это.

 Notification.Builder mBuilder = new Notification.Builder(context) .setSmallIcon(R.drawable.notifyicon) .setContentTitle(title) .setContentText(extras.getString("message")) .setAutoCancel(true) .setOnlyAlertOnce(false) .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) .setVibrate(new long[] {0,500,250,500}); if(badgeCount > 1) mBuilder.setNumber(badgeCount); // Creates an explicit intent for an Activity in your app Intent resultIntent = new Intent(context, SiteViewActivity.class); resultIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); resultIntent.putExtra(NOTIFY_INTENT_TYPE_KEY, alertType); PendingIntent resultPendingIntent = PendingIntent.getActivity(context, alertType, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(resultPendingIntent); NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); notifyMgr.notify(alertType, mBuilder.build()); 

После долгого осмотра я заметил, что Android 4.4 (Kitkat и, возможно, ниже) не будет вызывать onNewIntent и onResume ни при использовании FLAG_UPDATE_CURRENT на pendingIntent. Как только вы измените его на FLAG_ONE_SHOT, он начнет работать. На Android 6 (и, вероятно, также 5), однако onNewIntent работает даже с флагом FLAG_UPDATE_CURRENT.

Однако кажется, что если вы создаете несколько ожидающих намерений (например, после получения двух уведомлений), данные не будут обновляться флагом FLAG_ONE_SHOT, поэтому флаг FLAG_CANCEL_CURRENT может быть лучшим выбором (у него нет проблем с не обновленными данными)

Во-первых, вы должны добавить android:launchMode="singleTop" в определение активности в файле манифеста, как android:launchMode="singleTop" ниже

 <activity android:name="MainActivity" android:launchMode="singleTop" </activity> 

Тогда как Хасан Масуд сказал, что вы должны добавить Intent.ACTION_MAIN и Intent.CATEGORY_LAUNCHER к вашему действию, как Intent.CATEGORY_LAUNCHER ниже

 Intent intent = new Intent(this, MainActivity.class); intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); 

Это все. Таким образом, если приложение открыто, и когда вы нажимаете уведомление, метод onNewIntent (..) будет запускаться, но что бы ни случилось, если приложение закрыто, когда вы нажимаете уведомление, намерение уведомления переходит к onCreate (.. ) Метод текущей деятельности.