Android OnNewIntent не вызывается
Я видел несколько подходов и попробовал все, но не смог заставить его работать. Я не знаю, почему это так сложно, в документах это выглядит так просто! Я хочу запустить OnNewIntent с уведомлением (пользователь нажимает на него в панели уведомлений).
В настоящее время я установил свою активность как синглтоп
<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).
Любая помощь будет оценена! Спасибо вам, ребята.
3 ответа
Хорошо, все заработало вскоре после публикации моего вопроса. Я думаю, что ключевым отличием в нашем коде является то, что я передаю флаг "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:launchMode="singleTop"
к определению вашей активности в файле манифеста, как показано ниже
<activity
android:name="MainActivity"
android:launchMode="singleTop"
</activity>
Затем, как сказал Хасан Масуд, вы должны добавить Intent.ACTION_MAIN
а также Intent.CATEGORY_LAUNCHER
на ваши действия, как показано ниже
Intent intent = new Intent(this, MainActivity.class);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
Это все. Таким образом, если приложение открыто и когда вы щелкаете по уведомлению, метод onNewIntent(..) сработает, но что бы ни случилось, если приложение закрыто, когда вы щелкаете по уведомлению, намерение уведомления переходит к onCreate(..) метод текущей деятельности.
После долгого осмотра я заметил, что 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 может быть лучшим выбором (у него нет проблем с не обновленными данными)