信鴿推送的使用

来源:http://www.cnblogs.com/wangfengdange/archive/2016/09/30/5923434.html
-Advertisement-
Play Games

最近在看推送方面的知識,用的是信鴿推送主要是因為後臺用的是信鴿 推送用第三方推送,也就是在客戶端建一個廣播接收器,當伺服器發送消息時發送到信鴿,信鴿再發送一次,廣播接受器接受下; 我實現的功能比較簡單,當app在運行狀態時,會在主頁展示一個彈窗展示推送的消息;如果app不在運行狀態且service沒 ...


最近在看推送方面的知識,用的是信鴿推送主要是因為後臺用的是信鴿

推送用第三方推送,也就是在客戶端建一個廣播接收器,當伺服器發送消息時發送到信鴿,信鴿再發送一次,廣播接受器接受下;

我實現的功能比較簡單,當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         // 傳遞的參數為ApplicationContext
12         //Context context = getApplicationContext();
13         //1.獲取設備的Token
14         Handler handler = new HandlerExtension(MainActivity.this);
15         message = handler.obtainMessage();
16         XGPushManager.registerPush(getApplicationContext(), new XGIOperateCallback() {
17             
18             @Override
19             public void onSuccess(Object data, int flag) {
20                 // TODO Auto-generated method stub
21                 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             @Override
29             public void onFail(Object data, int errCode, String msg) {
30                 // TODO Auto-generated method stub
31                 Log.d("jiejie", "+++ register push fail. token:" + data
32                         + ", errCode:" + errCode + ",msg:"
33                         + msg);
34                 message.obj = "+++ register push fail. token:" + data
35                         + ", 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         @Override
46         public void handleMessage(Message msg) {
47             // TODO Auto-generated method stub
48             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為前臺配置的key
19                 // 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             @Override
15             public void onClick(DialogInterface arg0, int arg1) {
16                 // TODO Auto-generated method stub
17                 
18             }
19         });
20         AlertDialog mDialog = dialog.create();
21         mDialog.show();
22     }
23     
24     @Override
25     protected void onDestroy() {
26         // TODO Auto-generated method stub
27         super.onDestroy();
28         EventBus.getDefault().unregister(this);
29     }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CSS3就是出了不少高大上的功能,3D效果、動畫、多列等等。今天寫篇文章記錄怎麼一下怎麼用CSS3寫一個動畫。 醜話還得說前頭,IE9以及以下版本不支持CSS3動畫(如真要實現可以考慮用js,不過估計效果也不太好)。chrome和safafi建議加上首碼-webkit-以向前相容老版本。 今天簡單的 ...
  • 上代碼: counter-reset 屬性設置某個選擇器出現次數的計數器的值。預設為 0。 counter-increment 屬性設置某個選取器每次出現的計數器增量。預設增量是 1。 counter()插入計數器 ...
  • ...
  • Ext.window.MessageBox是一個工具類,他繼承自Ext.window.Windoe對象,用來生成各種風格的信息提示對話框,其實例對象可以通過Ext.MessageBox或Ext.Msg進行訪問,使用Ext.MessageBox和使用Ext.Msg有相同的效果,而後者提供了更簡短的調用 ...
  • GCD即為Grand Central Dispatch的縮寫,是一種主要用於非同步處理任務的安全的高性能解決方案。 在此不對比其他非同步處理技術,只記錄GCD的使用及說明。 先記錄一些必要的概念:線程,同步,非同步,並行隊列,串列隊列 線程:程式中任務執行流的最小單元。一個應用程式,一般存在一個進程(擁有 ...
  • GPUIMAGE中GPUImageStillCamera可以調用系統相機,並實現實時濾鏡,但是我沒有找到相機全屏的方法,望知道的說一下 GPUImageStillCamera繼承自GPUImageVideoCamera類,添加了捕獲照片的功能。 GPUImageVideoCamera 初始化方法: ...
  • 本文實現全自定義控制項--自定義開關 本文地址:http://www.cnblogs.com/wuyudong/p/5922316.html,轉載請註明源地址。 自定義開關 (View),本文完成下麵內容 1. 寫個類繼承View2. 拷貝包含包名的全路徑到xml中3. 界面中找到該控制項, 設置初始信 ...
  • Android Studio增量升級什麼情況下使用最合適呢? 比如現在的as版本是2.2版本,而你的as版本2.0版本,這個時候點Check For Updates就沒有反應了,因為你已經2個有版本沒升級了(版本跨度太大 ),所以這樣就不能線上升級了。 重要的信息 谷歌更新地址:https://dl ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...