说起推送,这种第三方的平台很多,每个公司都可能用的不一样,之前我项目里都是用的Jpush,具体怎么配置就不多说了,不管用什么平台,就总结一点:集成的大体东西都基本一样。最近手头的这个项目用的是阿里云的移动推送。就简单说一下这个推送的集成。
不管哪个平台,大致都要先去注册应用,获取相应的appkey和appsecret。
正文:
第一步:用Maven快速集成进行配置。
文档地址:https://help.aliyun.com/document_detail/51056.html?spm=a2c4g.11186623.6.623.43da7fa8oUfFFH#h2–maven-1
进去照着配置就行了。就说一点:如果是快速集成(官方也建议采用此方式集成),Manifest不需要配置那些权限和其他相关组件配置,其他的不过多解释。
也就说清单文件只需要配置如下两项即可。
<!-- 阿里云推送相关(配置appkey和appsecret) -->
<meta-data
android:name="com.alibaba.app.appkey"
android:value="你的appkey" />
<meta-data
android:name="com.alibaba.app.appsecret"
android:value="你的appsecret" />
<!-- 消息接收监听器 (用户可自主扩展) -->
<receiver
android:name=".receiver.MyMessageReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" />
</intent-filter>
<intent-filter>
<action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" />
</intent-filter>
<intent-filter>
<action android:name="com.alibaba.sdk.android.push.RECEIVE" />
</intent-filter>
</receiver>
自定义一个MyMessageReceiver用来接收通知的接收和点击事件的相关处理。配置就算完成了。
第二步:初始化SDK
官方文档也说明了,初始化放在application中。如下:
private void initCloudChannel(AppApplication applicationContext) {
PushServiceFactory.init(applicationContext);
CloudPushService pushService = PushServiceFactory.getCloudPushService();
pushService.register(applicationContext, new CommonCallback() {
@Override
public void onSuccess(String response) {
Log.e(TAG, "init cloudchannel success");
// Log.e("===id", pushService.getDeviceId() + "");
}
@Override
public void onFailed(String errorCode, String errorMessage) {
Log.e(TAG, "init cloudchannel failed -- errorcode:" + errorCode + " -- errorMessage:" + errorMessage);
}
});
}
第三步:绑定推送标识
这个自行决定用什么字段作为推送的唯一标识,这里我用的是user_id。在获取到user_id的地方绑定即可。如下:
//阿里云推送绑定账户
PushServiceFactory.getCloudPushService().bindAccount(user_id, new CommonCallback() {
@Override
public void onSuccess(String s) {
}
@Override
public void onFailed(String s, String s1) {
}
});
第四步:接收推送内容,处理点击事件
这个主要就是看Recriver了,就是上面定义的MyMessageReceiver,代码如下:
public class MyMessageReceiver extends MessageReceiver {
/**
* 接收到通知的回调
*/
@Override
public void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
//8.0适配
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel = new NotificationChannel("1", "name", NotificationManager.IMPORTANCE_HIGH);
manager.createNotificationChannel(channel);
}
}
/**
* 点击通知的回调
*/
@Override
public void onNotificationOpened(Context context, String title, String summary, String extraMap) {
try {
JSONObject object = new JSONObject(extraMap);
String param= object.optString("param");
if (!TextUtils.isEmpty(param) ) {
Intent intent = new Intent(context, XXXActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("param", param);
context.startActivity(intent);
}
} catch (JSONException ignored) {
}
}
}
这里要注意Android8.0通知的显示和点击事件问题,8.0以上必须要设置通知渠道才能正常显示通知,不然收到了通知也显示不出来。
适配8.0 的通知主要注意以下几点:
1:必须设置通知渠道和渠道name,都不可为空,缺一不可,不然不显示。
2:必须设置setSmallIcon,不然不显示。
3:设置setContentIntent一定要在notify之前。不然不显示。
关于推送参数的获取,可以通过extraMap来解析获取就可以了。然后添加到intent中传递到目标Activity即可。
还要额外注意一点:关于在跳转目标Activity中参数的接收。
生命周期有可能会走:onCreate,也有可能会走:onNewIntent。因此最好的方法就是先在这两个生命周期中,都定义好处理通知的方法dealNotice(Intent intent);,最后统一处理即可。
第五步:必要的时候进行解绑(比如退出登录了)
PushServiceFactory.getCloudPushService().unbindAccount(new CommonCallback() {
@Override
public void onSuccess(String s) {
Log.e("===unbindSuccess", s);
}
@Override
public void onFailed(String s, String s1) {
}
});
在实际项目中,发送9.0的手机初始化就有问题,提示网络配置错误,让检查网络配置,这实际上就是阿里的推送没适配9.0系统的https网络安全。解决办法网上也是有的,很简单,如下:
清单文件的application节点下添加:
android:usesCleartextTraffic="true"