我有一个小应用程序,当应用程序在后台运行时,我从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>
根据文档,您可以通过 FCM 发送两种类型的通知。
- 通知消息
- 数据电文
Firebase 控制台只能发送第一类消息。如果您的应用处于后台,则通知消息将由系统处理,但如果您的应用已停止,则通知消息将不起作用。
切换到您自己的 API,并发送数据消息。
因此,经过几个小时的这个问题,在@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不允许这样做,您必须转到电池优化并将您的应用程序放在受保护的应用程序中(这因品牌而异(。理想的方法是为用户提供一个初始弹出窗口来帮助他执行此操作。
这就是我学到的,它对我有用。上面的任何问题帖子,我将尝试对此进行更多研究,并在获得更多信息时进行更新。