Firebase Cloud Message(FCM)可以帮助Android App实现消息推送功能,并且可以在推送通知中携带参数,当用户点击推送通知时,推送中携带的参数信息将传递到主Activity的getIntent中。
官方文档:https://firebase.google.com/docs/cloud-messaging/android/client
一、配置Android应用并下载google-service.json文件:
在Firebase控制台新建项目(需要使用Google账户登录),配置好Android应用后下载google-service.json文件,将google-service.json文件添加到项目的app目录下即可。
(1)添加项目时填写项目名称、项目id使用默认的就可以、选择国家、底部的两个勾选项要么都选,要么都不选,表示是否和Google分享你的app分析数据,最后点击创建项目即可。
(2)Firebase的项目不止是为Android打造的,可以在项目中添加Android应用,IOS应用,网页应用。那么我们先要为这个项目添加一个Android应用:
选择“将Firebase添加到您的安卓应用”,然后填写app包名,app别名可以选填,调试签名证书SHA1,调试签名证书SHA1可以通过命令行获取:
Mac环境:
keytool -exportcert -list -v \ -alias androiddebugkey -keystore ~/.android/debug.keystore
Windows环境:
keytool -exportcert -list -v \ -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore
输入命令行后需要输入密钥库口令,默认的密钥库口令是android
获取正式签名证书SHA1的命令行:
keytool -exportcert -list -v \ -alias <your-key-name> -keystore <path-to-production-keystore>
在<your-key-name>填入密钥名,<path-to-production-keystore>填入密钥路径,然后输入密钥库口令即可获取SHA1。
4.添加好Android应用后,下载google-service.json文件,添加到项目的app目录下
二、添加CloudMessage依赖:
1.项目级的build.gradle中,添加:
classpath 'com.google.gms:google-services:4.0.1'
2.app模块下的build.gradle中,添加:
dependencies { ... implementation 'com.google.firebase:firebase-core:15.0.0' implementation 'com.google.firebase:firebase-messaging:17.0.0' } apply plugin: 'com.google.gms.google-services'
3.AndroidManifest中添加:
<service android:name=".MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> <service android:name=".MyFirebaseInstanceIDService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service>
并新建MyFirebaseMessagingService继承自FirebaseMessagingService,新建MyFirebaseInstanceIDService继承自FirebaseInstanceIdService即可。
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { }
public class MyFirebaseMessagingService extends FirebaseMessagingService { }
动图演示:
这样就完成了Android端的集成。运行程序并将程序退出到后台,只有app在后台运行时才能收到推送通知。
4.打开Firebase控制台,转到Cloud Message模块,点击发送您的第一条消息:
在消息文字中填入推送的通知内容,消息标签可以不填,目标是用来选择发送给哪些设备的,我们这里选择我们的应用,这样安装了我们的app的用户都能收到此消息。
点击高级选项,可以自定义消息标题,通知渠道是Android8.0以上新推出的功能,可以不填,自定义数据中可以输入键值对。当用户点击通知进入app时,这些键值对会发送到主Activity的getIntent中。声音可以选择启动或停用,指的是用户收到通知时是否有声音提示。编辑好这些内容后,点击发送消息,安装了此app的Android设备就可以收到这条推送了(需要在真机运行,Android模拟器无法收到推送)。
Android设备接收到消息:
5.在主Activity中将键值对打印出来:编辑MainActivity:
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = getIntent(); if(intent!=null&&intent.hasExtra("键")){ Log.d(TAG, "intent: "+intent.getStringExtra("键")); } } }
运行并退出app到后台 --> 在Firebase控制台发送一条推送 --> 点击推送进入app,Log控制台可以看到:
6.Firebase也可以给单个设备发送消息,这个功能在调试的时候非常有用,谁都不希望自己测试推送时发送的消息发给所有人。在程序中获得Firebase 的token id并将其打印出来:
Log.d(TAG, "Firebase Token: "+ FirebaseInstanceId.getInstance().getToken());
在Firebase控制台发送推送时选择单个设备,将设备的Firebase token id填入,这样就可以把推送消息只发送给这一个设备了。