我正在使用Firebase作为数据库并使用FCM作为推送通知服务来构建聊天应用程序。
在构建应用程序时,我意识到我不应该总是为所有创建的消息触发推送通知。例如,用户可能已经在聊天,并且不应该收到该会话的推送通知。
实现此目的的一种方法是让服务器在用户每次进入会话时都知道并有条件地发送推送通知。但是,这是服务器端的解决方案,我想知道是否有使用Firebase的现有客户端解决方案。
答案 0 :(得分:0)
我们可以使用布尔方法检查应用程序是否在后台。使用活动管理器,我们可以检查应用程序(带有您的包名称)是否正在运行!然后在“ onMessageReceived”上使用简单的if-else,则可以选择显示通知,否则不显示任何通知。 在您创建的Firebase Messaging Service类中使用它:
public class MyGcmPushReceiver extends GcmListenerService {
/**
* Called when message is received.
* @param from SenderID of the sender.
* @param bundle Data bundle containing message data as key/value pairs.
* For Set of keys use data.keySet().
*/
@Override
public void onMessageReceived(String from, Bundle bundle) {
// Check here whether the app is in background or running.
if(isAppIsInBackground(getApplicationContext())) {
// Show the notification
} else {
// Don't show notification
}
}
/**
* Method checks if the app is in background or not
*/
private boolean isAppIsInBackground(Context context) {
boolean isInBackground = true;
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
for (String activeProcess : processInfo.pkgList) {
if (activeProcess.equals(context.getPackageName())) {
isInBackground = false;
}
}
}
}
}
else
{
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
ComponentName componentInfo = taskInfo.get(0).topActivity;
if (componentInfo.getPackageName().equals(context.getPackageName())) {
isInBackground = false;
}
}
return isInBackground;
}
}
原始信用归于Rabbit https://stackoverflow.com/a/42312210/10742321