android个推 - Go语言中文社区

android个推


之前公司用的推送是极光,昨天公司要求转战个推,然后查看了个推的开发文档,可以说非常简单。缺点就是通知需要我们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);

}

}

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/lzq520210/article/details/72571549
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-13 13:52:56
  • 阅读 ( 1315 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢