写在开头:极光推送集成非常简单,现在项目中主要用来接收推送通知,短信通知,刷新界面,具体集成地址:
http://docs.jiguang.cn/jpush/client/Android/android_guide/
下面是关于调用的一些工具类;
1.Android jpushUtils:基于极光文档api 3.0.7 集成而来
源码:
** * 类名:JPushutils.class * 描述:使用别名 * Created by:刘帅 on 2017/8/24 0024. * -------------------------------------- * 修改内容: * 备注: * Modify by: */ public class JPushutils extends JPushMessageReceiver { public static final String PROJECTNAME = "PB";//极光推送别名 /** * 设置极光推送app别名 * 用于给某特定用户推送消息。别名,可以近似地被认为,是用户帐号里的昵称 使用标签 * 覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。 * @param alias */ public static void setAlias(Context conn, String alias) { setJpushAlias(conn,0x1,Validate.isNullTodefault(alias,PROJECTNAME)); } /** * 删除极光推送app别名 */ public static void deleteAlias(Context conn) { deleteJpushAlias(conn,0x2); } /** * 获取极光推送app别名 */ public static void getAlias(Context conn ) { getJpushAlias(conn,0x3); } /** * 设置标签 * 用于给某一群人推送消息。标签类似于博客里为文章打上 tag ,即为某资源分类。 */ public static void setTags(Context conn,final String[] Tags) { setJpushTags(conn,0x4,Tags); } /** * 添加标签 */ public static void addTags(Context conn,final String[] Tags) { addJpushTags(conn,0x5,Tags); } /** * 删除标签 */ public static void deleteTags(Context conn,final String[] Tags) { deleteJpushTags(conn,0x6,Tags); } /** * 删除所有标签 */ public static void cleanTags(Context conn) { cleanJpushTags(conn,0x7); } /** * 获取所有标签 */ public static void getAllTags( Context conn) { getAllJpushTags(conn,0x8); } private static void setJpushAlias( Context conn,int sequence,final String alias) { JPushInterface.setAlias(conn,sequence,alias); } private static void deleteJpushAlias(Context conn,int sequence) { JPushInterface.deleteAlias(conn, sequence); } private static void getJpushAlias(Context conn,int sequence) { JPushInterface.getAlias(conn,sequence); } //设置标签 private static void setJpushTags(Context conn,int sequence,final String[] Tags){ Setset = new HashSet<>(); for (int i = 0; i < Tags.length; i++) { set.add(Tags[i]); } JPushInterface.setTags(conn,sequence,set); } private static void addJpushTags(Context conn,int sequence,final String[] Tags){ Set set = new HashSet<>(); for (int i = 0; i < Tags.length; i++) { set.add(Tags[i]); } JPushInterface.addTags(conn,sequence,set); } private static void deleteJpushTags(Context conn,int sequence,final String[] Tags){ Set set = new HashSet<>(); for (int i = 0; i < Tags.length; i++) { set.add(Tags[i]); } JPushInterface.deleteTags(conn,sequence,set); } private static void cleanJpushTags(Context conn,int sequence){ JPushInterface.cleanTags(conn,sequence); } private static void getAllJpushTags(Context conn,int sequence){ JPushInterface.getAllTags(conn,sequence); } @Override public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) { switch (jPushMessage.getSequence()){ case 0x1: if(jPushMessage.getErrorCode()==0) KL.d("设置Alias成功"); else KL.d("设置Alias失败"); break; case 0x2: if(jPushMessage.getErrorCode()==0) KL.d("删除Alias成功"); else KL.d("删除Alias失败"); break; case 0x3: if(jPushMessage.getErrorCode()==0) KL.d("Alias为:"+jPushMessage.getAlias()); else KL.d("获取Alias失败"); break; } super.onAliasOperatorResult(context, jPushMessage); } @Override public void onTagOperatorResult(Context context, JPushMessage jPushMessage) { switch (jPushMessage.getSequence()){ case 0x4: if(jPushMessage.getErrorCode()==0) KL.d("设置Tag成功"); else KL.d("设置Tag失败"); break; case 0x5: if(jPushMessage.getErrorCode()==0) KL.d("增加Tag成功"); else KL.d("增加Tag失败"); break; case 0x6: if(jPushMessage.getErrorCode()==0) KL.d("删除Tag成功"); else KL.d("删除Tag失败"); break; case 0x7: if(jPushMessage.getErrorCode()==0) KL.d("删除所有Tag成功"); else KL.d("删除所有Tag失败"); break; case 0x8: if(jPushMessage.getErrorCode()==0) KL.d("获取所有Tag成功,Tags:"+jPushMessage.getTags().toString()); else KL.d("获取所有Tag失败"); break; } super.onTagOperatorResult(context, jPushMessage); }
注:因为工具类本身继承自极光推送的一个广播接收器,功能是用于获取Tag和Alias操作是否成功的消息回调。所以要在mainfests文件注册广播接收;
android:name=".util.JPushutils"
android:enabled="true"
android:exported="false">
android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
android:name="com.house" />
2.java Web :jPushUtils
/** * 极光推送服务端实现类 * author:刘帅 * controller 层调用 : * 方法与说明: * JPush.getInstance().sendPush(String alert); * 推送消息,如更新,紧急通知等。对象:所有人员,所有设备 * * JPush.getInstance().sendPush(String userID, String alert, String mklx); * 推送消息,如通知公告,待审批通知等。 对象:指定人员 注意:调用此方法,需要传入人员 userID,推送内容,模块名称。方便手机端进行模块区分,跳转页面 * * JPush.getInstance().sendPush(String userID, String json) * 推送消息 如:当用户提交一条申请单,服务端处理后,向手机端推送一条消息,手机端借此刷新页面的待办数量。 对象:指定人员 注意:调用此方法,需传入人员 userID,json字符串。 * json 格式: {"success":"true","items":[{"mklx":"1","dspsl":"3"},{"mklx":"2","dspsl":"3"}]} * * @整理 by 刘帅 2017年8月10日 */ public class JPush { protected static final Logger LOG = LoggerFactory.getLogger(JPush.class); private static JPush jpush; public static JPush getInstance() { // if (jpush == null) return new JPush(); // return jpush; } /** * 向全部人员推送 * * @throws APIRequestException */ public void sendPush(String alert) { JPushClient jpushClient = new JPushClient(Params.masterSecret, Params.appKey, null, ClientConfig.getInstance()); // 生成推送的内容 PushPayload payload = buildPushObject_all_all_alert(alert); try { System.out.println(payload.toString()); PushResult result = jpushClient.sendPush(payload); System.out.println(result + "................................"); LOG.info("Got result - " + result); } catch (APIConnectionException e) { LOG.error("Connection error. Should retry later. ", e); } catch (APIRequestException e) { LOG.error("Error response from JPush server. Should review and fix it. ", e); LOG.error("如果异常在此抛出,原因是:别名还没有在任何客户端SDK提交设置成功。也就是说,目标用户从未登陆过app,首次登录成功以后,就不会抛出此异常了"); LOG.info("HTTP Status: " + e.getStatus()); LOG.info("Error Code: " + e.getErrorCode()); LOG.info("Error Message: " + e.getErrorMessage()); LOG.info("Msg ID: " + e.getMsgId()); } } /** * 向全部人员推送 * @param tags * 标签名称 * @param alert * 推送内容 * @param mklx * 模块类型 */ public void sendPushByTagsone(String tags,String alert,String mklx) { JPushClient jpushClient = new JPushClient(Params.masterSecret, Params.appKey, null, ClientConfig.getInstance()); // 生成推送的内容 PushPayload payload = buildPushObject_all_tags_alert(tags,alert,mklx); try { System.out.println(payload.toString()); PushResult result = jpushClient.sendPush(payload); System.out.println(result + "................................"); if(200==result.getResponseCode()) System.out.println("推送成功"); else System.out.println("推送失败"); LOG.info("Got result - " + result); } catch (APIConnectionException e) { LOG.error("Connection error. Should retry later. ", e); } catch (APIRequestException e) { LOG.error("Error response from JPush server. Should review and fix it. ", e); LOG.error("如果异常在此抛出,原因是:别名还没有在任何客户端SDK提交设置成功。也就是说,目标用户从未登陆过app,首次登录成功以后,就不会抛出此异常了"); LOG.info("HTTP Status: " + e.getStatus()); LOG.info("Error Code: " + e.getErrorCode()); LOG.info("Error Message: " + e.getErrorMessage()); LOG.info("Msg ID: " + e.getMsgId()); } } /** * 构建推送对象:所有android_ios,所有人员,通知内容为 ALERT。附加字段为 mklx——"通知公告" * * @return */ private PushPayload buildPushObject_all_tags_alert(String tag,String alert, String mklx) { return PushPayload.newBuilder().setPlatform(Platform.android_ios())// 平台:android_ios .setAudience(Audience.tag(tag))// 标签,这里如果是向指定用户推送事件,需要将用户的标签名称传入 .setNotification(Notification.newBuilder().setAlert(alert) .addPlatformNotification(AndroidNotification.newBuilder() // .setTitle(TITLE)//android 特有,设置app名称或标题的 .addExtra("mklx", mklx).build()) .addPlatformNotification(IosNotification.newBuilder() // .setBadge(5)//ios所特有的,用于显示有N条待办事件的 .addExtra("mklx", mklx).build()) .build()) .build(); } /** * 向指定人员推送 * * @param userID * 用户ID * @param alert * 推送内容 * @param mklx * 模块名称 * @throws APIRequestException */ public void sendPush(String userID, String alert, String mklx) { JPushClient jpushClient = new JPushClient(Params.masterSecret, Params.appKey, null, ClientConfig.getInstance()); // 生成推送的内容 PushPayload payload = buildPushObject_all_alias_alert(userID, alert, mklx); try { System.out.println(payload.toString()); PushResult result = jpushClient.sendPush(payload); System.out.println(result + "................................"); LOG.info("Got result - " + result); } catch (APIConnectionException e) { LOG.error("Connection error. Should retry later. ", e); } catch (APIRequestException e) { LOG.error("Error response from JPush server. Should review and fix it. ", e); LOG.error("如果异常在此抛出,原因是:别名还没有在任何客户端SDK提交设置成功。也就是说,目标用户从未登陆过app,首次登录成功以后,就不会抛出此异常了"); LOG.info("HTTP Status: " + e.getStatus()); LOG.info("Error Code: " + e.getErrorCode()); LOG.info("Error Message: " + e.getErrorMessage()); LOG.info("Msg ID: " + e.getMsgId()); } } /** * 向指定用户推送,用于主界面刷新消息数量 * * @param userID * 用户ID * @param json * 推送内容 * @throws APIRequestException */ public void sendPush(String userID, String json) { JPushClient jpushClient = new JPushClient(Params.masterSecret, Params.appKey, null, ClientConfig.getInstance()); // 生成推送的内容 PushPayload payload = buildPushObject_messageWithExtras(userID, json); try { System.out.println(payload.toString()); PushResult result = jpushClient.sendPush(payload); System.out.println(result + "................................"); LOG.info("Got result - " + result); } catch (APIConnectionException e) { LOG.error("Connection error. Should retry later. ", e); } catch (APIRequestException e) { LOG.error("Error response from JPush server. Should review and fix it. ", e); LOG.error("如果异常在此抛出,原因是:别名还没有在任何客户端SDK提交设置成功。也就是说,目标用户从未登陆过app,首次登录成功以后,就不会抛出此异常了"); LOG.info("HTTP Status: " + e.getStatus()); LOG.info("Error Code: " + e.getErrorCode()); LOG.info("Error Message: " + e.getErrorMessage()); LOG.info("Msg ID: " + e.getMsgId()); } } /** * 构建推送对象:所有平台,所有设备,所有人,内容为 ALERT 的通知。 * * @return */ private PushPayload buildPushObject_all_all_alert(String alert) { return PushPayload.alertAll(alert);// 基本通知 } /** * 构建推送对象:所有android_ios,推送目标是别名为 "usirID",通知内容为 ALERT。附加字段为 mklx——"通知公告" * * @return */ private PushPayload buildPushObject_all_alias_alert(String userID, String alert, String mklx) { return PushPayload.newBuilder().setPlatform(Platform.android_ios())// 平台:android_ios .setAudience(Audience.alias(userID))// 别名,这里如果是向指定用户推送事件,需要将用户的UserID传入 .setNotification(Notification.newBuilder().setAlert(alert) .addPlatformNotification(AndroidNotification.newBuilder() // .setTitle(TITLE)//android 特有,设置app名称或标题的 .addExtra("mklx", mklx).build()) .addPlatformNotification(IosNotification.newBuilder() // .setBadge(5)//ios所特有的,用于显示有N条待办事件的 .addExtra("mklx", mklx).build()) .build()) .build(); } /** * 构建推送对象:所有android_ios,推送目标是别名为 "usirID",推送内容为json——"{key:1,key:2}"。 * * @return */ private PushPayload buildPushObject_messageWithExtras(String userID, String json) { System.out.println("json====="+json); return PushPayload.newBuilder().setPlatform(Platform.android_ios()) .setAudience(Audience.alias(userID))// 别名,这里如果是向指定用户推送事件,需要将用户的UserID传入 .setMessage(Message.newBuilder() .setMsgContent(json) .build()) .build(); } public class Params { // 极光推送,注册帐号显示的Key和masterSecret private static final String appKey = ""; private static final String masterSecret = ""; } }
3.附上接收极光推送消息的广播接收器
/** * 类名:JPushReceiver.class * 描述:极光推送广播接收器 * Created by:刘帅 on 2017/2/9. * -------------------------------------- * 修改内容: * 备注: * Modify by: */ public class JPushReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); KL.d("[JPushReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle)); if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) { String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID); KL.d("[JPushReceiver] 接收Registration Id : " + regId); //send the Registration Id to your server... } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) { KL.d("[JPushReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE)); } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) { KL.d("[JPushReceiver] 接收到推送下来的通知"); int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID); KL.d("[JPushReceiver] 接收到推送下来的通知的ID: " + notifactionId); } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) { KL.d("[JPushReceiver] 用户点击打开了通知"); } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) { KL.d("[JPushReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA)); //在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码,比如打开新的Activity, 打开一个网页等.. } else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) { boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false); KL.d("[JPushReceiver]" + intent.getAction() +" connected state change to "+connected); } else { KL.d("[JPushReceiver] Unhandled intent - " + intent.getAction()); } } // 打印所有的 intent extra 数据 private String printBundle(Bundle bundle) { StringBuilder sb = new StringBuilder(); for (String key : bundle.keySet()) { if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) { sb.append("\nkey:" + key + ", value:" + bundle.getInt(key)); }else if(key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)){ sb.append("\nkey:" + key + ", value:" + bundle.getBoolean(key)); } else if (key.equals(JPushInterface.EXTRA_EXTRA)) { if (bundle.getString(JPushInterface.EXTRA_EXTRA).isEmpty()) { KL.d("This message has no Extra data"); continue; } } else { sb.append("\nkey:" + key + ", value:" + bundle.getString(key)); } } return sb.toString(); } }
注:mainfests注册:
android:name=".util.JPushReceiver"
android:enabled="true"
android:exported="false">
android:name="cn.jpush.android.intent.REGISTRATION" />
android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK" />
android:name="cn.jpush.android.intent.CONNECTION" />
android:name="com.house" />