У меня есть приложение для Android, где я использую какой-то метод, чтобы показать номер уведомления на значке приложения. Теперь я хочу установить этот номер при получении уведомления.
Я подумал, что должен установить номер при получении уведомления, поэтому я установил его внутри метода onMessageReceived
. Но моя проблема заключается в том, когда мое приложение находится в фоновом режиме, метод onMessageReceived
не вызывается, поэтому номер уведомления не установлен.
Ниже приведен мой код. Я установил номер внутри onMessageReceived
. Я уже протестировал метод setBadge
и могу убедиться, что он работает. Проблема в том, что onMessageReceived
не вызывается, поэтому setBadge
также не вызывается, что не устанавливает номер.
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// TODO(developer): Handle FCM messages here.
Log.d(TAG, "From: " + remoteMessage.getFrom());
Conts.notificationCounter ++;
//I am setting in here.
setBadge(getApplicationContext(),Conts.notificationCounter );
Log.e("notificationNUmber",":"+ Conts.notificationCounter);
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
}
// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
}
// Also if you intend on generating your own notifications as a result of a received FCM
// message, here is where that should be initiated. See sendNotification method below.
}
// [END receive_message]
public static void setBadge(Context context, int count) {
String launcherClassName = getLauncherClassName(context);
if (launcherClassName == null) {
Log.e("classname","null");
return;
}
Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
intent.putExtra("badge_count", count);
intent.putExtra("badge_count_package_name", context.getPackageName());
intent.putExtra("badge_count_class_name", launcherClassName);
context.sendBroadcast(intent);
}
public static String getLauncherClassName(Context context) {
PackageManager pm = context.getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
for (ResolveInfo resolveInfo : resolveInfos) {
String pkgName = resolveInfo.activityInfo.applicationInfo.packageName;
if (pkgName.equalsIgnoreCase(context.getPackageName())) {
String className = resolveInfo.activityInfo.name;
return className;
}
}
return null;
}
Когда я искал эту проблему, Я обнаружил, что если приходящее сообщение отображать сообщение, то onMessageReceived
вызывается только в том случае, если приложение находится на переднем плане. Но если поступающее сообщение является сообщением с данными, то вызывается onMessageReceived
, даже если приложение работает в фоновом режиме.
Но мой друг сказал мне, кто отправляет уведомление (на стороне сервера), сообщение уже идет как на дисплее, так и в сообщении с данными. Он сказал, что объект данных заполнен.
Ниже приведен JSON для приходящего сообщения, он имеет объект данных.
{
"to":"my_device_id",
"priority":"high",
"notification":{
"body":"Notification Body",
"title":"Notification Title",
"icon":"myicon",
"sound":"default"
},
"data":{
"Nick":"DataNick",
"Room":"DataRoom"
}
}
Если я использую только объект данных, onMessageReceived вызывается, как они сказали, но это уведомление о времени не появляется вверху.
Теперь, почему onMessageReceived
не вызывается, если сообщение также является сообщением данных. Должен ли я сделать что-то другое для обработки сообщения данных? Работает ли он так же с отображением сообщений на стороне клиента.
Любая помощь будет оценена по достоинству. Заранее спасибо.