前 言
最近由于项目的功能需求的需要,需要在Android应用集成消息推送的功能,而目前市面上的第三方消息推送除了友盟推送外,还有极光推送、小米推送、个推以及信鸽(腾讯)推送等。当时本人对比各大第三方的消息推送进行了测试,觉得友盟消息推送集成简单,推送消息的送达率比较高以及即时。而且支持深度优化过的Android系统的国产手机(小米、华为、魅族)应用的进程被“杀死”的情况下能及时送达推送。
集成前的工作
- 在友盟+(友盟+官网)的后台注册账号并申请认证成为开发者,认证通过后选择“消息推送(U-Push)”业务后创建应用了(注意:应用的包名必须与AndroidStudio创建的包名一致,否则推送无法送达),创建应用后把应用的AppKey和Umeng Message Secret记录下来。(如下图)
- 在小米消息推送、华为消息推送以及魅族消息推送渠道申请相应的秘钥后在友盟后台填写相应的配置信息。(如下图)
友盟消息推送SDK的集成
在AndroidStudio的Gradle的dependencies{…}下添加以下依赖:
// PushSDK必须依赖基础组件库,所以需要加入对应依赖
implementation 'com.umeng.sdk:common:1.5.3'
// PushSDK必须依赖utdid库,所以需要加入对应依赖
implementation 'com.umeng.sdk:utdid:1.1.5.3'
// PushSDK
implementation 'com.umeng.sdk:push:4.2.0'
// 小米Push通道
implementation 'com.umeng.sdk:push-xiaomi:1.0.0'
// 华为Push通道
implementation 'com.umeng.sdk:push-huawei:1.0.0'
// 魅族Push通道
implementation 'com.umeng.sdk:push-meizu:1.0.0'
如果添加依赖同步编译后失败的话可以尝试在Project的Grande里jcenter()前面添加上mavenCentral()再同步编译看看。(如下图)
在自定义的Application的onCreate()方法里初始化友盟消息推送的SDK,如下片段代码所示:
public class PushApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
/**
* 初始化common库
* 参数1:上下文,不能为空
* 参数2:设备类型,UMConfigure.DEVICE_TYPE_PHONE为手机、UMConfigure.DEVICE_TYPE_BOX为盒子,默认为手机
* 参数3:Push推送业务的secret
*/
UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE, "这里填写应用申请到的Umeng Message Secret");
PushAgent mPushAgent = PushAgent.getInstance(this);
// 注册推送服务,每次调用register方法都会回调该接口
mPushAgent.register(new IUmengRegisterCallback() {
@Override
public void onSuccess(String deviceToken) {
// 注册成功会返回device token
}
@Override
public void onFailure(String s, String s1) {
}
});
// 小米通道Push初始化,第一个参数为上下文,第二个参数为XIAOMI_ID ,第三个参数为XIAOMI_KEY
MiPushRegistar.register(this, "这里填写小米的XIAOMI_ID", "这里填写小米的XIAOMI_KEY");
// 华为通道Push初始化,华为渠道无需传key
HuaWeiRegister.register(this);
// 魅族通道Push初始化,第一个参数为上下文,第二个参数为MEIZU_APPID ,第三个参数为MEIZU_APPKEY
MeizuRegister.register(this, "这里填写魅族的MEIZU_APPID", "这里填写魅族的MEIZU_APPKEY");
}
}
在Activity的onCreate()方法里初始化友盟消息推送的SDK,如下片段代码所示:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PushAgent.getInstance(context).onAppStart();
}
}
创建多渠道MipushTestActivity代码文件并继承UmengNotifyClickActivity进行测试小米、华为以及魅族国产机型离线的推送测试,如下片段代码所示:
public class MipushTestActivity extends UmengNotifyClickActivity {
private static String TAG = MipushTestActivity.class.getName();
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_mipush);
}
@Override
public void onMessage(Intent intent) {
// 此方法必须调用,否则无法统计打开数
super.onMessage(intent);
String body = intent.getStringExtra(AgooConstants.MESSAGE_BODY);
Log.i(TAG, body);
}
}
创建魅族所需广播MeizuTestReceiver代码文件并继承UmengMeizuPushReceiver,如下片段代码所示:
public class MeizuTestReceiver extends UmengMeizuPushReceiver {
}
在Android的清单文件里添加相应的配置信息及注册相应的application、meta-data、activity以及receiver信息。如下代码所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="应用的包名">
<application
android:name=".PushApplication"
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">
<meta-data
android:name="UMENG_APPKEY"
android:value="这里添加在友盟后台申请到的应用APPKEY" />
<!-- Channel ID用来标识App的推广渠道,作为推送消息时给用户分组的一个维度。-->
<meta-data
android:name="UMENG_CHANNEL"
android:value="Channel ID" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MipushTestActivity"
android:exported="true"
android:launchMode="singleTask" />
<!--魅族push应用定义消息receiver声明 -->
<receiver android:name=".MeizuTestReceiver">
<intent-filter>
<!-- 接收push消息 -->
<action android:name="com.meizu.flyme.push.intent.MESSAGE" />
<!-- 接收register消息 -->
<action android:name="com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />
<!-- 接收unregister消息-->
<action android:name="com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK" />
<!-- 兼容低版本Flyme3推送服务配置 -->
<action android:name="com.meizu.c2dm.intent.REGISTRATION" />
<action android:name="com.meizu.c2dm.intent.RECEIVE" />
<category android:name="这里添加应用的包名">
</category>
</intent-filter>
</receiver>
</application>
</manifest>
推送测试
在友盟+消息推送的后台添加推送测试的消息。(如下图所示)
手机端(本人的手机是小米手机,MIUI 10开发版,Android 8.1)通知栏接收到友盟后台推送的消息界面。(如下图所示)