Intereting Posts
Ошибка в тестовом коде Geofence для Android? Кто-нибудь может подтвердить? Название панели Collapsing не меняется при динамическом изменении? Как разместить RecyclerView внутри NestedScrollView? Есть ли способ проверить, отладка или публикация подписи приложения? Picasso не загружает изображение из кеша в listview Android layout: этот тег и его дочерние элементы могут быть заменены одним <TextView /> и составным чертежом Как добавить навигационный ящик во все действия в приложении? Как возобновить работу? Невозможно перегрузить метод в интерфейсе AIDL Как интегрировать opencv-менеджер в приложение для Android SherlockFragmentActivity вызывает ClassNotFoundException Заказы Google Play, сделанные посредством выставления счетов в приложении, не могут быть списаны Java.lang.NoClassDefFoundError: javax.activation.DataHandler в android Как программно писать в Google Sheet из приложения для Android Невозможно использовать метод setForeground для ImageView

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).

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

Хорошо, что он работает вскоре после публикации моего вопроса. Я думаю, что ключевым отличием нашего кода является то, что я передаю флаг «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 (.. ) Метод текущей деятельности.