音讯推送在现在的App中已经非常常见,咱们经常会收到不同App的各种音讯。音讯推送的实现,国内与海外发行的App需求考虑不同的计划。国内发行的App,常见的有能够聚合各手机厂商推送功用的极光、个推等,海外发行的App肯定是直接运用Firebase Cloud Message(FCM)。

下面介绍下怎么接入FCM与发送告诉。

发送告诉

FCM的SDK不包含创立和发送告诉的功用,这部分需求咱们自己实现。

Android 13+ 上请求运行时告诉权限

Android 13 引入了用于显现告诉的新运行时权限。这会影响在 Android 13 或更高版本上运行的一切运用 FCM 告诉的运用。需求动态请求POST_NOTIFICATIONS权限后才能推送告诉,代码如下:

class ExampleActivity : AppCompatActivity() {
    private val requestPermissionCode = this.hashCode()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && 
                ActivityCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
                // 请求告诉权限
                ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.POST_NOTIFICATIONS), requestPermissionCode)
            }
    }
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
            if (requestCode == requestPermissionCode) {
                // 处理回调结果
            }
    }
}

创立告诉途径

从 Android 8.0(API 级别 26)开端,必须为一切告诉分配途径,否则告诉将不会显现。经过将告诉归类到不同的途径中,用户能够停用您运用的特定告诉途径(而非停用您的一切告诉),还能够操控每个途径的视觉和听觉选项。

创立告诉途径代码如下:

class ExampleActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val notificationManager = NotificationManagerCompat.from(this)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val applicationInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                packageManager.getApplicationInfo(packageName, PackageManager.ApplicationInfoFlags.of(0))
            } else {
                packageManager.getApplicationInfo(packageName, 0)
            }
            val appLabel = getText(applicationInfo.labelRes)
            val exampleNotificationChannel = NotificationChannel("example_notification_channel", "$appLabel Notification Channel", NotificationManager.IMPORTANCE_DEFAULT).apply {
                description = "The description of this notification channel"
            }
            notificationManager.createNotificationChannel(minigameChannel)
        }
    }
}

创立并发送告诉

创立与发送告诉,代码如下:

class ExampleActivity : AppCompatActivity() {
    private var notificationId = 0
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate()
        val notificationManager = NotificationManagerCompat.from(this)
        ...
        if (notificationManager.areNotificationsEnabled()) {
            val notification = NotificationCompat.Builder(this, "example_notification_channel")
                //设置小图标
                .setSmallIcon(R.drawable.notification)
                // 设置告诉标题
                .setContentTitle("title")
                // 设置告诉内容
                .setContentText("content")
                // 设置是否主动取消
                .setAutoCancel(true)
                // 设置告诉声音
                .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                // 设置点击的事件
                .setContentIntent(PendingIntent.getActivity(this, requestCode, packageManager.getLaunchIntentForPackage(packageName)?.apply { putExtra("routes", "From notification") }, PendingIntent.FLAG_IMMUTABLE))
                .build()
            // notificationId能够记录下来
            // 能够经过notificationId对告诉进行相应的操作
            notificationManager.notify(notificationId, notification)
        }
    }
}

*留意,smallIcon必须设置,否则会导致崩溃。

FCM

Firebase Cloud Message (FCM) 是一种跨平台音讯传递解决计划,可让您免费可靠地发送音讯。

官方接入文档

集成FCM

在项目下的build.gradle中增加如下代码:

buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        ...
        classpath("com.google.gms:google-services:4.3.14")
    }
}

在app module下的build.gradle中增加代码,如下:

dependencies {
  // 运用Firebase Andorid bom(官方推荐)
  implementation platform('com.google.firebase:firebase-bom:31.1.0') 
  implementation 'com.google.firebase:firebase-messaging' 
    // 不运用bom
    implementation 'com.google.firebase:firebase-messaging:23.1.1'
}

在Firebase后台获取项目的google-services.json文件,放到app目录下

Android FCM接入

要接收FCM的音讯推送,需求自定义一个Service承继FirebaseMessagingService,如下:

class ExampleFCMService : FirebaseMessagingService() {
    override fun onNewToken(token: String) {
        super.onNewToken(token)
        // FCM生成的令牌,能够用于标识用户的身份
    }
    override fun onMessageReceived(message: RemoteMessage) {
        super.onMessageReceived(message)
        // 接收到推送音讯时回调此方法
    }

在AndroidManifest中注册Service,如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application>
        <service
            android:name="com.minigame.fcmnotificationsdk.MinigameFCMService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
    </application>
</manifest>

告诉图标的样式

当App处于不活泼状态时,假如收到告诉,FCM会运用默许的图标与颜色来展现告诉,假如需求更改的话,能够在AndroidManifest中经过meta-data进行装备,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application>
        <!--修正默许图标-->
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/notification" />
        <!--修正默许颜色-->
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_color"
            android:resource="@color/color_blue_0083ff" />
    </application>
</manifest>

修正前:

Android FCM接入

修正后:

Android FCM接入

防止主动初始化

假如有特殊的需求,不期望FCM主动初始化,能够经过在AndroidManifest中装备meta-data来实现,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application>
        <meta-data
            android:name="firebase_messaging_auto_init_enabled"
            android:value="false" />
        <!--假如同时引入了谷歌剖析,需求装备此参数-->
        <meta-data
            android:name="firebase_analytics_collection_enabled"
            android:value="false" />
    </application>
</manifest>

需求重新启动FCM主动初始化时,更改FirebaseMessagingisAutoInitEnabled的特点,代码如下:

FirebaseMessaging.getInstance().isAutoInitEnabled = true
// 假如同时禁止了Google Analytics,需求装备如下代码
FirebaseAnalytics.getInstance(context).setAnalyticsCollectionEnabled(true)

调用此代码后,下次App启动时FCM会主动初始化。

测验音讯推送

在Firebase后台中,挑选Messageing,并点击制作首个宣扬活动,如图:

Android FCM接入

挑选Firebase 告诉音讯,如图:

Android FCM接入

输入标题和内容后,点击发送测验音讯,如图:

Android FCM接入

输入在FirebaseMessagingService的onNewToken方法中获取到的token,并点击测验,如图:

Android FCM接入

示例

已整合到demo中。

ExampleDemo github

ExampleDemo gitee

作用如图:

Android FCM接入