集成说明.md 12 KB

极光推送集成说明

模块说明

模块类型

  • 类型:Android Library Module (com.android.library)
  • 可打包:✅ 可以编译成 AAR 包
  • 打包命令./gradlew :capability-push:assembleRelease
  • AAR 位置capability-push/build/outputs/aar/capability-push-release.aar

AAR 使用方式

如果其他项目通过 AAR 方式引入:

// 其他项目的 build.gradle
dependencies {
    implementation files('libs/capability-push-release.aar')
    // 或者上传到 Maven 仓库后
    // implementation 'com.narutohuo.xindazhou:capability-push:1.0.0'
}

目录结构

capability-push/src/
└── main/
    ├── AndroidManifest.xml          # Android 清单文件(权限声明)
    └── java/
        └── com/narutohuo/xindazhou/push/
            ├── api/                  # API 接口层
            │   └── PushService.kt    # 推送服务接口定义
            ├── factory/              # 工厂类层
            │   └── PushServiceFactory.kt  # 服务工厂(统一入口,单例获取)
            ├── impl/                 # 实现层
            │   └── PushServiceImpl.kt     # 推送服务具体实现(封装极光推送SDK)
            ├── receiver/             # 接收器层
            │   └── JPushReceiver.kt       # 推送消息接收器(完全封装在模块内部)
            └── model/                # 数据模型层
                ├── PushConfig.kt          # 推送服务配置模型
                └── PushResponse.kt         # 推送相关的数据模型
                    ├── PushMessage        # 推送消息模型
                    └── PushResponse       # 推送响应模型

功能说明

1. api/ 层 - 接口定义

  • 职责:定义推送服务的公共接口,业务层只依赖接口
  • 内容PushService 接口,包含初始化、别名/标签设置、消息监听、注册/注销等方法
    • initialize() - 初始化推送服务
    • setAlias() - 设置别名(用户ID)
    • setTags() - 设置标签
    • setMessageListener() - 设置消息监听器
    • register() - 注册推送(开启推送)
    • unregister() - 注销推送(关闭推送)

2. factory/ 层 - 工厂类

  • 职责:提供统一的服务实例获取和初始化方式
  • 内容PushServiceFactory 单例工厂
  • 作用
    • 隐藏实现细节,统一入口,便于替换实现
    • 提供 init() 方法统一初始化,避免在 Application 中直接调用服务方法
    • 提供 getInstance() 方法获取服务实例

3. impl/ 层 - 具体实现

  • 职责:实现 PushService 接口的具体逻辑
  • 内容PushServiceImpl 单例实现类
  • 功能
    • 封装极光推送 SDK 调用
    • 处理推送消息接收
    • 错误处理和日志记录
    • 支持别名、标签、消息监听等功能

3.1 receiver/ 层 - 消息接收器

  • 职责:封装推送消息接收逻辑
  • 内容JPushReceiver BroadcastReceiver
  • 功能
    • 自动接收极光推送的消息(自定义消息、通知消息、通知点击)
    • 自动解析消息内容
    • 自动回调到 PushService 的消息监听器
    • 完全封装:在模块的 AndroidManifest.xml 中自动注册,业务层无需处理

4. model/ 层 - 数据模型

  • 职责:定义推送相关的数据模型
  • 内容
    • PushConfig - 推送服务配置模型(封装极光推送配置)
    • PushMessage - 推送消息模型(标题、内容、扩展数据等)
    • PushResponse - 推送响应模型(成功/失败、错误信息等)

5. AndroidManifest.xml - 权限配置

  • 职责:声明模块所需的 Android 权限
  • 内容:网络权限、唤醒锁、振动等权限声明

架构设计

  • 接口隔离:业务层只依赖接口,不依赖实现
  • 工厂模式:统一入口,隐藏创建逻辑
  • 单例模式:全局共享一个服务实例
  • 分层架构:api → factory → impl → 第三方SDK

已完成的工作

SDK 依赖已添加

  • cn.jiguang.sdk:jpush:5.9.0 - 极光推送SDK
  • cn.jiguang.sdk:jcore:5.2.0 - 极光推送核心库

代码实现已完成

  • PushServiceImpl 已实现极光推送 SDK 调用
  • PushServiceFactory 已创建
  • PushConfig 配置模型已创建

需要您配置的内容

1. 在极光推送官网注册应用

  1. 访问 极光推送官网
  2. 注册账号并创建应用
  3. 获取 AppKeyAppSecret

2. 配置 AndroidManifest.xml(可选,推荐通过 PushConfig 传入)

app/src/main/AndroidManifest.xml 中添加以下配置:

<manifest>
    <!-- 极光推送权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    
    <application>
        <!-- 极光推送 AppKey(可选,推荐通过 PushConfig 传入) -->
        <!-- <meta-data
            android:name="JPUSH_APPKEY"
            android:value="您的极光推送 AppKey" /> -->
        
        <!-- 极光推送渠道(可选,推荐通过 PushConfig 传入) -->
        <!-- <meta-data
            android:name="JPUSH_CHANNEL"
            android:value="developer-default" /> -->
        
        <!-- 极光推送服务 -->
        <service
            android:name="cn.jpush.android.service.PushService"
            android:enabled="true"
            android:exported="false">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.PushService" />
            </intent-filter>
        </service>
        
        <!-- 极光推送接收器 -->
        <receiver
            android:name="cn.jpush.android.service.PushReceiver"
            android:enabled="true"
            android:exported="false">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

3. 配置资源文件(推荐方式)

app/src/main/res/values/strings.xml 中配置推送参数(推荐方式,配置统一管理):

<!-- app/src/main/res/values/strings.xml -->
<resources>
    <!-- 极光推送配置(必填) -->
    <string name="push_jpush_app_key">您的极光推送 AppKey</string>
    <string name="push_jpush_channel">developer-default</string>
</resources>

4. 在 Application 中初始化(极简调用,完全封装)

在您的 XinDaZhouApplication 类中初始化推送服务,只需一行代码

方式1:使用默认配置(从资源文件读取,最简单)

// app/src/main/java/com/narutohuo/xindazhou/XinDaZhouApplication.kt
package com.narutohuo.xindazhou

import android.app.Application
import com.narutohuo.xindazhou.push.factory.PushServiceFactory
import timber.log.Timber

class XinDaZhouApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        
        // ========== 初始化推送服务(极简调用,完全封装)==========
        // 自动完成:初始化、设置监听器、注册推送
        PushServiceFactory.init(context = this) { message ->
            // 处理接收到的推送消息(可选)
            Timber.d("收到推送消息: ${message.title} - ${message.content}")
            // 可以在这里处理推送消息,例如显示通知、更新UI等
        }
        
        Timber.d("XinDaZhouApplication - onCreate: 推送服务初始化完成")
    }
}

或者更简单(不传监听器,使用默认处理)

// 如果不需要自定义处理,可以不传监听器(使用默认日志记录)
PushServiceFactory.init(context = this)

方式2:使用自定义配置

// app/src/main/java/com/narutohuo/xindazhou/XinDaZhouApplication.kt
package com.narutohuo.xindazhou

import android.app.Application
import com.narutohuo.xindazhou.push.factory.PushServiceFactory
import com.narutohuo.xindazhou.push.model.PushConfig
import timber.log.Timber

class XinDaZhouApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        
        // ========== 初始化推送服务(使用自定义配置)==========
        PushServiceFactory.init(
            context = this,
            config = PushConfig(
                appKey = "您的极光推送 AppKey",
                channel = "developer-default", // 可选,默认为 "developer-default"
                debugMode = BuildConfig.DEBUG // 可选,根据 BuildConfig 设置
            )
        ) { message ->
            // 处理接收到的推送消息(可选)
            Timber.d("收到推送消息: ${message.title} - ${message.content}")
        }
        
        Timber.d("XinDaZhouApplication - onCreate: 推送服务初始化完成")
    }
}

优势

  • 极简调用:只需一行代码,所有初始化自动完成
  • 完全封装:初始化、设置监听器、注册推送都在 init() 中自动完成
  • 可选监听器:可以传入消息监听器,也可以不传(使用默认处理)
  • ✅ 业务层不直接依赖极光推送API
  • ✅ 如果更换SDK,只需修改实现层,业务层无需改动
  • ✅ 配置统一管理,代码更清晰

5. BroadcastReceiver(完全封装,无需处理)

重要BroadcastReceiver 已完全封装在模块内部,业务层不需要创建或注册!

推送模块内部已自动创建并注册了 JPushReceiver,所有推送消息会自动接收并回调到 init() 中设置的消息监听器。

说明

  • 完全封装BroadcastReceiver 在模块的 AndroidManifest.xml 中自动注册
  • 自动处理:所有推送消息自动接收,无需业务层处理
  • 自动回调:消息自动回调到 init() 中设置的消息监听器
  • 业务层透明:业务层不需要知道 BroadcastReceiver 的存在

6. 使用示例

// 初始化(在 Application 中,只需一行代码)
PushServiceFactory.init(context = this) { message ->
    // 处理推送消息
    Timber.d("收到推送: ${message.title} - ${message.content}")
}

// 后续使用(可选,按需调用)
val pushService = PushServiceFactory.getInstance()
pushService.setAlias("user123")  // 设置别名(可选)
pushService.setTags(listOf("vip", "premium"))  // 设置标签(可选)
val registrationId = pushService.getRegistrationId()  // 获取注册ID(可选)
val isEnabled = pushService.isPushEnabled()  // 检查推送状态(可选)

完整使用流程总结

1. Application 初始化(步骤4)- 只需一行代码
   XinDaZhouApplication.onCreate()
   → PushServiceFactory.init(context) { message -> ... }
   → 内部自动完成:初始化、设置监听器、注册推送
   
2. BroadcastReceiver 自动接收消息(完全封装,业务层无需处理)
   模块内部的 JPushReceiver.onReceive()
   → pushService.handleReceivedMessage(...)
   → messageListener.invoke(message)
   
3. 业务层处理消息
   Application 中的 messageListener
   → 处理推送消息(显示通知、更新UI等)

注意事项

  1. AppKey 配置:必须在资源文件或 PushConfig 中配置正确的 AppKey
  2. 权限申请:Android 6.0+ 需要动态申请权限
  3. 混淆配置:如果使用 ProGuard,需要添加混淆规则(参考极光推送官方文档)
  4. 测试:建议先在测试环境验证推送功能
  5. BroadcastReceiver:✅ 已完全封装在模块内部,业务层无需处理

参考文档