Android项目中使用FCM(FirebaseCloudMessage)推送

FCM(FirebaseCloudMessage)简单介绍

Firebase 是 Google 的移动平台,提供了分析、数据库、消息传递和崩溃报告等功能, FCM(FirebaseCloudMessage)是用来代替已经弃用的 GCM (Google Cloud Messaging )。

FCM 接入

Firebse官方接入文档

你可以按照上面的文档一步步接入,也可以按照Android Studio - Tools- Firebase ,然后选择Cloud Messaging,点开后有步骤提示,按步骤接入获取到google-services.json文件放到文档说明的位置即可。

image

FCM添加插件和依赖

在Project的 build.gradle中加入:

buildscript {
    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.3'
        classpath 'com.google.gms:google-services:4.3.3'
    }
}
allprojects {
    repositories {
        google()
        jcenter()

    }
}

在Model的 build.gradle中加入:

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
android {

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    ...
    implementation 'com.google.firebase:firebase-messaging:20.0.0'
}

FirebaseCloudMessage 版本区别

版本区别主要提现在 " firebase-messaging:18.0.0 ",其中最能提现的就是通知当中是否含有图片的功能,18之前没有推送通知栏图片的功能,18之后有了相应的Api,通知栏在收到含图的通知后会自动出图,所以如果你的应用需要推送图片,还请注意一下依赖的版本。


无图通知

有图通知

有图通知展开

添加消息接收类和清单文件

现在的版本较以前相对简单只需要继承FirebaseMessagingService 即可

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    private static final String TAG = "MyFirebaseMessagingServ";


    /**
     * Notification 为空 或者 Notification 不为空且App 如果是在前台打开状态下  是会调用这个方法,但是不会主动弹出通知 需要自己添加
     *
     *  Notification 不为空 App 如果是在后台运行 不会调用下面的这些方法 会直接弹出通知.
     *
     * @param remoteMessage
     */
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        Log.e(TAG, "onMessageReceived: ____________________________收到消息" );
        if (remoteMessage.getNotification() != null) {
            //弹出通知
            showNotification(remoteMessage);
        }
    }

    /**
     * 应用首次安装注册推送id , 后台需要的话可以在这里通过网络推送给后台
     * @param token
     */
    @Override
    public void onNewToken(String token) {
        super.onNewToken(token);
        Log.e(TAG, "onNewToken: _________应用首次安装注册推送id ___________________"+token );
    }
}

以往的版本是需要专门写一个去继承FirebaseInstanceIdService 来表示Fcm注册成功可以接受通知了,如今是直接使用上面的 onNewToken 来接收了。( 解释其他文章可能有写到去继承)

然后清单文件配置


        <!--       通知栏显示的 应用名称字体颜色和下拉查看通知详情的箭头的颜色-->

        <meta-data android:name="com.google.firebase.messaging.default_notification_color"
            android:resource="@android:color/holo_red_dark" />


        <!-- 只要传入的消息未明确设置通知渠道,FCM 就会使用此值-->
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id"
            android:value="@string/default_notification_channel_id" />



        <service android:name=".MyFirebaseMessagingService" android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

发送通知

配置完成后运行项目 (提前连接国际网)将项目运行到手机上,查看日志如果 onNewToken 方法里面的日志 将token打印出来那么表示注册成功,我们可以进行下一步的发送通知:

  1. 通过 Firebase 控制台推送(数据单一)


    控制台推送

    2.通过 PostMan控制台推送


    postman推送

    key=项目设置这里的服务器密钥

推送方式的介绍:

1.根据token推向指定的设备,每一台设备在首次打开应用的时候都会注册到一个对应的唯一的token,然后我们根据这个token可以推向指定的用户。

{
        "to":"App 获取到的 FCM 返回的 token",

        "notification":{
        ... 通知栏数据
                  },
        "data":{
          ....隐藏数据
              }

     }

2.根据topic推给一个指定的用户群,比如在项目当中有个新闻订阅功能,订阅了新闻栏目,那么我们根据topic 推送就可以专门针对这些订阅了的用户。

//项目代码订阅主题
 FirebaseMessaging.getInstance().subscribeToTopic("news");
//postman 通过主题推送
{
       "to":"/topics/news",

        "notification":{
        ... 通知栏数据
            },
        "data":{
          ....隐藏数据
          }

      }

Notification数据简介:

   "notification":{
         "title":"推送标题",
         "body":"推送的内容",
          "color":"应用icon和下拉箭头的颜色",
          "sound":"收到通知的声音",
          "click_action":"通知栏点击跳转事件",
          "icon":"通知栏应用icon - 本地图片",
          "image":"通知栏当中图片 -网络图片"
        }
字段对应

清单文件配置 click_action 设置通知栏跳转页面,如果不设置默认是启动页。

     // 配置click_action
        <activity android:name=".PushActivity">
            <intent-filter>
                <action android:name="com.xxxx.push" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

推送数据对通知的影响

如果我们推送的数据 notification 对应的数据 不为空,那么我们接收消息就需要分为两种情况,前台和后台,如果App当前状态为前台,那么 onMessageReceived 方法就会被调用,后续我们自己拿到对用的数据进行通知栏的显示,如果App当前状态为后台的话 那么我们无需自己写 sdk会自己弹出。
如果我们推送的数据 notification 对应的数据为空,把所有的数据放置到data 字段里面,那么sdk不会为我们弹出通知,这时候无论App在前台还是后台都会调用 onMessageReceived ,这时候我们自己需要处理通知栏的ui 显示。这种情况一般用于自定义通知栏ui 的时候。

// 获取data 数据
  Map<String, String> data = remoteMessage.getData();

Demo

demo里面含有推送消息的网络请求,下载运行可直接推送测试(需要连接国际网络)。

image.png

Demo下载地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342