之前公司用的推送是极光,昨天公司要求转战个推,然后查看了个推的开发文档,可以说非常简单。缺点就是通知需要我们android客户端本地发送。后面会详细说。
个推的集成文档:http://docs.getui.com/mobile/android/androidstudio/#4
集成的步骤我这里就不说了,这里默认是已经对接好个推了,主要说一下遇到的问题。
首先说一下需求,要求后台调用个推,推送一串数据,我们android客户端获取到通知后,点击通知,解析数据,然后进行相应的操作。
要满足这个需求,后台需要使用透传模板进行推送,如下:
这里我不先不管后台是怎么实现对接个推的,先用个推的控制台模拟发送通知,如下:
这里我们需要使用别名来实现针对某一些或某一个用户进行推送
别名的类型时String类型的,数值可以和后台协商好用什么形式的,我们是将别名设置为用户id+手机号,这里需要注意一下,如果分生产和测试环境的话,需要考虑到这两种环境的用户不能同时都接收到通知,
这里提一个方案,就是将别名中拼上环境域名。
接下来说一下步骤;
1.对接个推sdk
2.在用户登录成功后,后台将别名返回
然后将别名与个推绑定
boolean isBind =PushManager.getInstance().bindAlias(context,“别名”);
在退出登录时
//解绑个推别名
boolean isUnBind =PushManager.getInstance().unBindAlias(context,”别名”,true);
3.要在manifest中注册两个service分别为GeTuiIntentService和GeTuiPushService
GeTuiPushService
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import com.igexin.sdk.GTServiceManager;
/**
* Created by lizhiqiang on 2017/5/19.
* 作者:lizhiqiang
*
* 个推服务
*/
public class GeTuiPushService extends Service {
@Override
public void onCreate() {
super.onCreate();
GTServiceManager.getInstance().onCreate(this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
return GTServiceManager.getInstance().onStartCommand(this, intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
return GTServiceManager.getInstance().onBind(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
GTServiceManager.getInstance().onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
GTServiceManager.getInstance().onLowMemory();
}
}
GeTuiIntentService
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Message;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;
import com.igexin.sdk.GTIntentService;
import com.igexin.sdk.PushConsts;
import com.igexin.sdk.PushManager;
import com.igexin.sdk.message.FeedbackCmdMessage;
import com.igexin.sdk.message.GTCmdMessage;
import com.igexin.sdk.message.GTTransmitMessage;
import cn.doolii.activity.SplashAct;
import cn.doolii.activity.user.ProtocolWebAct;
import cn.doolii.app.App;
import cn.doolii.doolii.R;
/**
* Created by lizhiqiang on 2017/5/19.
* 作者:lizhiqiang
*
* 继承 GTIntentService 接收来自个推的消息, 所有消息在线程中回调, 如果注册了该服务, 则务必要在 AndroidManifest中声明, 否则无法接受消息
* onReceiveMessageData 处理透传消息
* onReceiveClientId 接收 cid
* onReceiveOnlineState cid 离线上线通知
* onReceiveCommandResult 各种事件处理回执
*/
public class GeTuiIntentService extends GTIntentService {
private String data;
/**
* 为了观察透传数据变化.
*/
private static int cnt;
public GeTuiIntentService() {
}
@Override
public void onReceiveServicePid(Context context, int pid) {
}
@Override
public void onReceiveMessageData(Context context, GTTransmitMessage msg) {
String appid = msg.getAppid();
String taskid = msg.getTaskId();
String messageid = msg.getMessageId();
byte[] payload = msg.getPayload();
String pkg = msg.getPkgName();
String cid = msg.getClientId();
// 第三方回执调用接口,actionid范围为90000-90999,可根据业务场景执行
boolean result = PushManager.getInstance().sendFeedbackMessage(context, taskid, messageid, 90001);
Log.d(TAG, "call sendFeedbackMessage = " + (result ? "success" : "failed"));
Log.d(TAG, "onReceiveMessageData -> " + "appid = " + appid + "\ntaskid = " + taskid + "\nmessageid = " + messageid + "\npkg = " + pkg
+ "\ncid = " + cid);
if (payload == null) {
Log.e(TAG, "receiver payload = null");
} else {
data = new String(payload);
Log.d(TAG, "receiver payload = " + data);
// 测试消息为了观察数据变化
if (data.equals("收到一条透传测试消息")) {
data = data + "-" + cnt;
cnt++;
}
**//重点在这里**
个推收到推送消息后,沃恩需要自己发送通知
showNotification();
sendMessage(data, 0);
}
Log.d(TAG, "----------------------------------------------------------------------------------------------");
}
private void showNotification() {
NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
mBuilder.setContentTitle("测试标题")//设置通知栏标题
.setContentText("测试内容") //设置通知栏显示内容
.setContentIntent(getDefalutIntent(Notification.FLAG_AUTO_CANCEL)) //设置通知栏点击意图
// .setNumber(number) //设置通知集合的数量
.setTicker("测试通知来啦") //通知首次出现在通知栏,带上升动画效果的
.setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示,一般是系统获取到的时间
.setPriority(Notification.PRIORITY_DEFAULT) //设置该通知优先级
// .setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知将自动取消
.setOngoing(false)//ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
.setDefaults(Notification.DEFAULT_VIBRATE)//向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合
//Notification.DEFAULT_ALL Notification.DEFAULT_SOUND 添加声音 // requires VIBRATE permission
.setAutoCancel(true)
.setSmallIcon(R.drawable.ic_launcher);//设置通知小ICON
mNotificationManager.notify(0, mBuilder.build());
}
public PendingIntent getDefalutIntent(int flags){
**//GeTuiService自定义一个service 用来接收android本地发送的通知**
Intent serviceIntent = new Intent(this, GeTuiService.class);
serviceIntent .putExtra("data",data);
//getService 跳到服务 getActivity 跳到activity
PendingIntent pendingIntent= PendingIntent.getService(this, 0,serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT);
return pendingIntent;
}
@Override
public void onReceiveClientId(Context context, String clientid) {
Log.e(TAG, "onReceiveClientId -> " + "clientid = " + clientid);
}
@Override
public void onReceiveOnlineState(Context context, boolean online) {
}
@Override
public void onReceiveCommandResult(Context context, GTCmdMessage cmdMessage) {
int action = cmdMessage.getAction();
if ((action == PushConsts.THIRDPART_FEEDBACK)) {
feedbackResult((FeedbackCmdMessage) cmdMessage);
}
}
private void feedbackResult(FeedbackCmdMessage feedbackCmdMsg) {
String appid = feedbackCmdMsg.getAppid();
String taskid = feedbackCmdMsg.getTaskId();
String actionid = feedbackCmdMsg.getActionId();
String result = feedbackCmdMsg.getResult();
long timestamp = feedbackCmdMsg.getTimeStamp();
String cid = feedbackCmdMsg.getClientId();
Log.d(TAG, "onReceiveCommandResult -> " + "appid = " + appid + "\ntaskid = " + taskid + "\nactionid = " + actionid + "\nresult = " + result
+ "\ncid = " + cid + "\ntimestamp = " + timestamp);
}
private void sendMessage(String data, int what) {
Message msg = Message.obtain();
msg.what = what;
msg.obj = data;
App.sendMessage(msg);
}
}
GeTuiService
4.定义一个GeTuiService,用来接收本地通知传过来的数据
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import cn.doolii.activity.user.ProtocolWebAct;
import cn.doolii.utils.CommonUtil;
import cn.doolii.utils.StringUtils;
/**
* @Description: 个推 通知栏点击后 跳到此服务 接收数据 相应处理
* @author lizhiqiang
* @date 2017-5-19下午5:25:15
*/
public class GeTuiService extends Service {
private String data;
private String content;
private String text;
private String title;
private String type;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@SuppressWarnings("deprecation")
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
data = intent.getStringExtra("data");
Log.i("--fuwu--",data+"");
if (!StringUtils.isEmptyString(data)){
try {
JSONObject js=new JSONObject(data);
content=js.optString("content");
text=js.optString("text");
title=js.optString("title");
type=js.optString("type");
**//接下来进行相应的跳转操作**
} catch (JSONException e) {
e.printStackTrace();
}
}
return super.onStartCommand(intent, flags, startId);
}
}