我有一个小型应用程序,当我在后台运行该应用程序时,我可以从 Firabase云消息传递接收消息。我对此进行了大量搜索,但在应用关闭时如何在android中接收/创建通知找不到正确的答案,因此请不要以为这是一个重复的问题。有人可以告诉我一个有关此事及其完成方式的例子吗?
这是我的Firebase消息服务类
public class MyFirebaseMessagingService extends FirebaseMessagingService {
public static final String tag = "TAG";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d(tag,"FROM"+remoteMessage.getFrom());
//check if message contains data
if(remoteMessage.getData().size()>0){
Log.d(tag,"Message Data" + remoteMessage.getData());
}
//check if message constains notification
if(remoteMessage.getNotification() != null){
sendNotification(remoteMessage.getNotification().getBody());
}
}
private void sendNotification(String body){
Intent i = new Intent(this,MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_ONE_SHOT);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Firebase CLoud Messaging")
.setAutoCancel(true)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(0,notificationBuilder.build());
}
}
这是我的清单
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
答案 0 :(得分:1)
根据the docs,您可以通过FCM发送两种类型的通知。
firebase控制台只能发送第一类消息。如果您的应用程序位于背景中,则通知消息将由系统处理,但是如果您的应用程序已停止,则通知消息将不起作用。
切换到您自己的API,然后发送数据消息。
答案 1 :(得分:1)
因此,在经历了几个小时的问题并在 @Mauker 的帮助下,我终于做到了。这些是我采取的步骤以及从互联网上收到的所有信息。
首先,忘记将Firebase Cloud Message发送通知到您的移动应用程序。 再用邮递员来做那些动作。
通知有两种类型,一种是所有人都可以同时收到该通知的组通知,另一种是通知本身仅供用户查看的直接通知。
1º如果要组通知,则必须在应用程序启动程序类中执行以下操作:
FirebaseMessaging.getInstance().subscribeToTopic("groupNameChoosenByYou");
2º然后您必须创建一个类来处理此问题
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Map<String, String> data = remoteMessage.getData();
String myCustomKey = data.get("title"); //received from postman POST as you can see above
Intent i = new Intent(this,MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_ONE_SHOT);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(myCustomKey)
.setContentText(myCustomKey+myCustomKey)
.setAutoCancel(true)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(0,notificationBuilder.build());
}
}
3º去邮递员那里做
这应该是您的网址: https://fcm.googleapis.com/fcm/send
{
"to":"/topics/groupNameChoosenByYou",
"data":
{
"title":"Your title",
"message":"Your message"
}
}
4º在邮递员中时,请在标题中执行
Authorization -> Project settings in Firebase -> Cloud Messaging and take the Server key
Content-type -> application/json
5º如果您想为某些特定用户进行直接通知
"to":"/topics/groupNameChoosenByYou"
,替换为在与Firebase的第一次连接中生成的设备令牌ID(在安装应用程序时)
6º如果要在应用程序关闭时发送通知,除了facebook,whatsapp(黄金应用程序)等某些ROM不允许这样做,您必须进行电池优化并将您的应用程序放在<强>受保护的应用(这会因品牌而异)。理想的方法是给用户一个初始弹出窗口,以帮助他做到这一点。
这是我学到的,对我有用。上面的任何问题,在获得更多信息时,我都会尝试进行更多研究并进行更新。