你的位置:首页 > 操作系统

[操作系统]信鸽推送的使用


最近在看推送方面的知识,用的是信鸽推送主要是因为后台用的是信鸽

推送用第三方推送,也就是在客户端建一个广播接收器,当服务器发送消息时发送到信鸽,信鸽再发送一次,广播接受器接受下;

我实现的功能比较简单,当app在运行状态时,会在主页展示一个弹窗展示推送的消息;如果app不在运行状态且service没被销毁就展示默认的通知

那么如何在主页展示弹窗:当广播接受器收到我要的消息时,用观察者模式,收到消息在发送个消息个主界面

官方的Demo连接:http://xg.qq.com/xg/help/ctr_help/download

修改后Demo的地址:http://download.csdn.net/detail/qq_29774291/9635735

1.先按照官网的例子添加好权限及服务有些服务要改成自己的包名;

2.把官网的广播接受器先复制到自己的项目中,再在清单文件中添加;

3.随后添加从官网给出的3个AccessKey了

<meta-data android:name="com.tencent.rdm.uuid" android:value="eb5fa555d70c3246a4944f55be8c266b" />    <!-- 【必须】 请将YOUR_ACCESS_ID修改为APP的AccessId,“21”开头的10位数字,中间没空格 -->    <!-- 【必须】 请修改为APP的AccessId,“21”开头的10位数字,中间没空格 -->    <meta-data      android:name="XG_V2_ACCESS_ID"      android:value="2100219302" />    <!-- 【必须】 请修改为APP的AccessKey,“A”开头的12位字符串,中间没空格 -->    <meta-data      android:name="XG_V2_ACCESS_KEY"      android:value="A15KJ71W9ELC" />

4.现在在主界面中注册信鸽推送主要是获取一个token,然后可以上传给服务端,现在服务器就可以给你发送消息了;当然从信鸽官方后台可以发送消息,但是从信鸽后台发送的消息有时会接受不到,这点做的完全不及极光推送好

XGPushConfig.enableDebug(this, true);这句发布的时候记得改为false或删除
 1 //信鸽start 2     private String token; 3     private Message message = null; 4   private void XGInit() { 5     // TODO Auto-generated method stub 6     XGPushConfig.enableDebug(this, true); 7     // 如果需要知道注册是否成功,请使用registerPush(getApplicationContext(), 8     // XGIOperateCallback)带callback版本 9     // 如果需要绑定账号,请使用registerPush(getApplicationContext(),account)版本10     // 具体可参考详细的开发指南11     // 传递的参数为ApplicationContext12     //Context context = getApplicationContext();13     //1.获取设备的Token14     Handler handler = new HandlerExtension(MainActivity.this);15     message = handler.obtainMessage();16     XGPushManager.registerPush(getApplicationContext(), new XGIOperateCallback() {17       18       @Override19       public void onSuccess(Object data, int flag) {20         // TODO Auto-generated method stub21         Log.d("jiejie", "+++ register push sucess. token:" + data + " " + flag);22         token = data + "";23         message.obj = "+++ register push sucess. token:" + data;24         System.out.println(token);25         message.sendToTarget();26       }27       28       @Override29       public void onFail(Object data, int errCode, String msg) {30         // TODO Auto-generated method stub31         Log.d("jiejie", "+++ register push fail. token:" + data32             + ", errCode:" + errCode + ",msg:"33             + msg);34         message.obj = "+++ register push fail. token:" + data35             + ", errCode:" + errCode + ",msg:" + msg;36         message.sendToTarget();37       }38     });39   }40   private static class HandlerExtension extends Handler{41     WeakReference<MainActivity> mActivity;42     HandlerExtension(MainActivity activity) {43       mActivity = new WeakReference<MainActivity>(activity);44     }45     @Override46     public void handleMessage(Message msg) {47       // TODO Auto-generated method stub48       super.handleMessage(msg);49       MainActivity theActivity = mActivity.get();50       if(theActivity == null){51         theActivity = new MainActivity();52       }53       if(msg != null){54         Log.d(Constants.LogTag, msg.obj.toString());55         System.out.println("ddd"+msg.obj.toString());56       }57     }58   }

 

5.修改广播接受器中的onTextMessage方法,当消息发送来时,将消息发送到主界面,不展示通知

不过你先要知道你app是否正在运行状态

 1 /** 2    * 判断是否运行在前台 3    *  4    * @param context 5    * @return 6   */ 7   public static boolean isRunningForeground(Context context) { 8     String packageName = getPackageName(context); 9     String topActivityClassName = getTopActivityName(context);10     Log.d("TAG", "packageName=" + packageName + ",topActivityClassName=" + topActivityClassName);11     if (packageName != null && topActivityClassName != null && topActivityClassName.startsWith(packageName)) {12       Log.d("TAG", "---> isRunningForeGround");13       return true;14     } else {15       Log.d("TAG", "---> isRunningBackGround");16       return false;17     }18   }19 20   // 方法2、通过RunningAppProcessInfo类判断(不需要额外权限):21 22   public static boolean isBackground(Context context) {23     ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);24     List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();25     for (RunningAppProcessInfo appProcess : appProcesses) {26       if (appProcess.processName.equals(context.getPackageName())) {27         if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {28           Log.i("后台", appProcess.processName);29           return true;30         } else {31           Log.i("前台", appProcess.processName);32           return false;33         }34       }35     }36     return false;37   }

6.通知EventBus来实现观察者模式在广播接收器中发送消息

 1 // 消息透传 2   @Override 3   public void onTextMessage(Context context, XGPushTextMessage message) { 4     String text = "收到消息:" + message.toString(); 5     EventBus.getDefault().post(text); 6     System.out.println(text); 7     // 获取自定义key-value 8     PushTextMessage pushTextMessage = new PushTextMessage(); 9 10     String title = message.getTitle();11     String content = message.getContent();12     pushTextMessage.setTitle(title);13     pushTextMessage.setContent(content);    14     String customContent = message.getCustomContent();15     if (customContent != null && customContent.length() != 0) {16       try {17         // JSONObject obj = new JSONObject(customContent);18         // // key1为前台配置的key19         // if (!obj.isNull("key")) {20         // String value = obj.getString("key");21         // LogUtils.log(LogTag, "get custom value:" + value);22         // }23         CustomContent custom = com.alibaba.fastjson.JSONObject.parseObject(customContent, CustomContent.class);24         if (custom != null) {25           pushTextMessage.setCustomContent(custom);26         }27 28         // ...29       } catch (Exception e) {30         System.out.println(e + "d");31         e.printStackTrace();32       }33     }34     show(context, text);35     Log.d("jiejie", "pushTextMessage:" + pushTextMessage);36    // EventBus.getDefault().post(pushTextMessage);37     try {38       // APP自主处理消息的过程...39       boolean isForeground = AppUtil.isRunningForeground(context);40       Log.d("jiejie", isForeground + "d");41       if (isForeground) {42         EventBus.getDefault().post(pushTextMessage);43       } else {44         notify(context, title, content);45       }46     } catch (Exception e) {47       System.out.println(e + "ddd");48       e.printStackTrace();49     }

7.在主界面中接受EventBus发送的消息,展示一个弹窗

 1 @Subscribe 2   public void onMessageReviced(final PushTextMessage pushTextMessage){ 3     Log.d("jiejie", "好" + " 标题" +pushTextMessage.getTitle() + " 内容:" +pushTextMessage.getContent() + "CustomContent" + pushTextMessage.getCustomContent().getCmd()); 4     if(pushTextMessage != null){ 5       showAlertDialog(this, pushTextMessage); 6     } 7   } 8   private void showAlertDialog(Context context,PushTextMessage text){ 9     AlertDialog.Builder dialog = new AlertDialog.Builder(context);10     dialog.setTitle("推送的标题");11     dialog.setMessage(text.getContent());12     dialog.setPositiveButton("确认", new DialogInterface.OnClickListener() {13       14       @Override15       public void onClick(DialogInterface arg0, int arg1) {16         // TODO Auto-generated method stub17         18       }19     });20     AlertDialog mDialog = dialog.create();21     mDialog.show();22   }23   24   @Override25   protected void onDestroy() {26     // TODO Auto-generated method stub27     super.onDestroy();28     EventBus.getDefault().unregister(this);29   }