1. 程式人生 > >Android第三方推送

Android第三方推送

極光推送

jpush_android.png

開發者整合 JPush Android SDK 到其應用裡,JPush Android SDK 建立到 JPush Cloud 的長連線,為 App 提供永遠線上的能力。 當開發者想要及時地推送訊息到達 App 時,只需要呼叫 JPush API 推送,或者使用其他方便的智慧推送工具,即可輕鬆與使用者交流。
圖中紅色部分,是 JPush 與 App 開發者的接觸點。手機客戶端側,App 需要整合 JPush SDK;伺服器端部分,開發者呼叫 JPush REST API 來進行推送。

Android SDK
JPush Android SDK 是作為 Android Service 長期執行在後臺的,從而建立並保持長連線,保持永遠線上的能力。

多平臺支援
JPush Android SDK 除了 jar 包,還有一個 .so檔案,.so檔案需要與CPU平臺適配,需要支援哪個平臺的 CPU,就需要包含這個平臺相應的 .so 編譯檔案。
除支援預設的 ARM CPU 平臺之外,JPush SDK 還提供 x86 與 MIPs 平臺的 CPU 版本 SDK。

電量與流量
JPush Android SDK 由於使用自定義協議,協議體做得極致地小,流量消耗非常地小。
電量方面,JPush Android SDK 經過持續地優化,儘可能減少不必要的程式碼執行;並且,長期的版本升級迭代,不斷地調優,在保證一定的網路連線穩定性的要求小,減少電量消耗。

SDK整合

ndk {
    abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
}

manifestPlaceholders = [
    JPUSH_PKGNAME: "com.rairmmd.push",
    JPUSH_APPKEY : "f42dc3becb6117921dd38907", //JPush上註冊的包名對應的appkey.
    JPUSH_CHANNEL: "developer-default", //暫時填寫預設值即可.
]

//依賴庫
compile 'cn.jiguang.sdk:jpush:3.0.9'  
compile 'cn.jiguang.sdk:jcore:1.1.7'  

AndroidManifest配置:

許可權:

<permission
    android:name="com.rairmmd.push.permission.JPUSH_MESSAGE"
    android:protectionLevel="signature" />

<uses-permission android:name="com.rairmmd.push.permission.JPUSH_MESSAGE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />

元件配置:

<!-- Required SDK 核心功能-->
<!-- 可配置android:process引數將PushService放在其他程序中 -->
<service
    android:name="cn.jpush.android.service.PushService"
    android:enabled="true"
    android:exported="false" >
    <intent-filter>
        <action android:name="cn.jpush.android.intent.REGISTER" />
        <action android:name="cn.jpush.android.intent.REPORT" />
        <action android:name="cn.jpush.android.intent.PushService" />
        <action android:name="cn.jpush.android.intent.PUSH_TIME" />
    </intent-filter>
</service>

<!-- since 3.0.9 Required SDK 核心功能-->
<provider
    android:authorities="您應用的包名.DataProvider"
    android:name="cn.jpush.android.service.DataProvider"
    android:exported="true"/>

<!-- since 1.8.0 option 可選項。用於同一裝置中不同應用的JPush服務相互拉起的功能。 -->
<!-- 若不啟用該功能可刪除該元件,將不拉起其他應用也不能被其他應用拉起 -->
<service
    android:name="cn.jpush.android.service.DaemonService"
    android:enabled="true"
    android:exported="true">
    <intent-filter >
        <action android:name="cn.jpush.android.intent.DaemonService" />
        <category android:name="您應用的包名"/>
    </intent-filter>
</service>

<!-- Required SDK核心功能-->
<receiver
    android:name="cn.jpush.android.service.PushReceiver"
    android:enabled="true" >
    <intent-filter android:priority="1000">
        <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />
        <category android:name="您應用的包名"/>
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.USER_PRESENT" />
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
    <!-- Optional -->
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <data android:scheme="package" />
    </intent-filter>
</receiver>

<!-- Required SDK核心功能-->
<activity
    android:name="cn.jpush.android.ui.PushActivity"
    android:configChanges="orientation|keyboardHidden"
    android:theme="@android:style/Theme.NoTitleBar"
    android:exported="false" >
    <intent-filter>
        <action android:name="cn.jpush.android.ui.PushActivity" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="您應用的包名" />
    </intent-filter>
</activity>
    <!-- SDK核心功能-->
<activity
    android:name="cn.jpush.android.ui.PopWinActivity"
    android:configChanges="orientation|keyboardHidden"
    android:exported="false"
    android:theme="@style/MyDialogStyle">
    <intent-filter>
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="您應用的包名" />
    </intent-filter>
</activity>

<!-- Required SDK核心功能-->
<service
    android:name="cn.jpush.android.service.DownloadService"
    android:enabled="true"
    android:exported="false" >
</service>

<!-- Required SDK核心功能-->
<receiver android:name="cn.jpush.android.service.AlarmReceiver" />

<!-- Required since 3.0.7 -->
<!-- 新的tag/alias介面結果返回需要開發者配置一個自定的廣播 -->
<!-- 該廣播需要繼承JPush提供的JPushMessageReceiver類, 並如下新增一個 Intent-Filter -->
<receiver
    android:name="自定義 Receiver"
    android:enabled="true" >
    <intent-filter>
        <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
        <category android:name="您應用的包名" />
    </intent-filter>
</receiver>

<!-- User defined. 使用者自定義的廣播接收器-->
<receiver
    android:name="您自己定義的Receiver"
    android:enabled="true">
    <intent-filter>
        <!--Required 使用者註冊SDK的intent-->
        <action android:name="cn.jpush.android.intent.REGISTRATION" />
        <!--Required 使用者接收SDK訊息的intent-->
        <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
        <!--Required 使用者接收SDK通知欄資訊的intent-->
        <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
        <!--Required 使用者開啟自定義通知欄的intent-->
        <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
        <!-- 接收網路變化 連線/斷開 since 1.6.3 -->
        <action android:name="cn.jpush.android.intent.CONNECTION" />
        <category android:name="您應用的包名" />
    </intent-filter>
</receiver>

最後在Application中初始化:

JPushInterface.setDebugMode(true);
JPushInterface.init(this);

手機測試: HTC、樂視
推送實時性強,推送完馬上收到推送。

百度推送

百度雲推送(Push)是一站式APP資訊推送平臺,為企業和開發者提供免費的訊息推送服務,開發者可以通過雲推送向用戶精準推送通知和自定義訊息以提升使用者留存率和活躍度。

Android SDK整合

下載對應的SDK,匯入到libs目錄。需新增:

sourceSets {
    main {
         jniLibs.srcDirs = ['libs']
    }
}

或直接將so檔案放jniLibs目錄下。

AndroidManifest配置:
許可權:

<!-- Push service 執行需要的許可權 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 富媒體需要宣告的許可權 -->
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

<!-- 適配Android N系統必需的ContentProvider寫許可權宣告,寫許可權包含應用包名-->
<uses-permission android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.YourPackageName" />
<permission
        android:name="baidu.push.permission.WRITE_PUSHINFOPROVIDER.YourPackageName"
        android:protectionLevel="signature">
</permission>

元件:

<!-- push service start -->
<!-- 用於接收系統訊息以保證PushService正常執行 -->
<receiver android:name="com.baidu.android.pushservice.PushServiceReceiver"
    android:process=":bdservice_v1" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
        <action android:name="com.baidu.android.pushservice.action.media.CLICK" />
        <!-- 以下四項為可選的action宣告,可大大提高service存活率和訊息到達速度 -->
        <action android:name="android.intent.action.MEDIA_MOUNTED" />
        <action android:name="android.intent.action.USER_PRESENT" />
        <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
        <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
    </intent-filter>
</receiver>
<!-- Push服務接收客戶端傳送的各種請求-->
<receiver android:name="com.baidu.android.pushservice.RegistrationReceiver"
    android:process=":bdservice_v1" >
    <intent-filter>
        <action android:name="com.baidu.android.pushservice.action.METHOD" />
        <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <data android:scheme="package" />
    </intent-filter>
</receiver>
<service android:name="com.baidu.android.pushservice.PushService" android:exported="true"
    android:process=":bdservice_v1" >
    <intent-filter >
            <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />
    </intent-filter>
</service>

<!-- 4.4版本新增的CommandService宣告,提升小米和魅族手機上的實際推送到達率 -->
<service android:name="com.baidu.android.pushservice.CommandService"
    android:exported="true" />

<!-- 適配Android N系統必需的ContentProvider宣告,寫許可權包含應用包名-->
<provider
    android:name="com.baidu.android.pushservice.PushInfoProvider"
    android:authorities="YourPackageName.bdpush"
    android:writePermission="baidu.push.permission.WRITE_PUSHINFOPROVIDER.YourPackageName"
    android:protectionLevel = "signature"
    android:exported="true" />

<!-- push結束 -->

初始化:

PushManager.startWork(getApplicationContext(),PushConstants.LOGIN_TYPE_API_KEY,"api_key")

手機測試: HTC、樂視
連續推送有時會延時,有時控制檯開啟耗時久。
推送完HTC過了十幾秒才收到推送,有時馬上能收到,有點不穩。
樂視直接沒收到推送,過了幾分鐘才收到。

對比

極光

極光極光

百度

百度百度

推送成功率差不多,百度有時稍有延遲。

整合方面:

極光可以直接jcenter依賴,新增比較方便,不過需配置的內容多。
百度需下載sdk依賴,配置步驟較少。

總結

極光

極光推送可以在同一裝置中不同應用的JPush服務之間相互拉起,保活性強。這意味著假設你接入了極光推送,而恰好今日頭條也接入了極光。有一天你的App被殺死了,但這時使用者啟動了今日頭條,那麼推送系統也就會通過共享的推送通道順便把你推送訊息送達到手機上,然後還可能把你的程序也喚醒(被“保活”了)。

百度

百度百度

百度推送會拉起小米,魅族的系統推送。對於小米魅族相容性,推送效果可能更好。MIUI系統是不會殺死小米的推送服務。

如果希望進一步提高推送的效果,其實可以整合多個手機廠商的推送服務。
比如小米渠道用小米推送,華為渠道用華為推送,但這樣的實現成本會大一些。

總的來說: 我認為極光推送效率,成功率更高。

小米推送案例
騰訊新聞使用的小米推送,沒有使用自己家的信鴿推送
淘寶使用了自家的阿里雲推送,同時還集成了小米推送
百度視訊和愛奇藝使用的是小米推送,沒有用自家的百度推送

相關推薦

Android第三方

極光推送 開發者整合 JPush Android SDK 到其應用裡,JPush Android SDK 建立到 JPush Cloud 的長連線,為 App 提供永遠線上的能力。 當開發者想要及時地推送訊息到達 App 時,只需要呼叫 JPush API 推送,或者使用其他方便的智

Android第三方——極光,百度雲,個

現在Android有不少的第三方推送介面,大大節省了我們的時間,讓我們專注於軟體本身的編寫。 極光推送 極光推送作為一個比較成熟的推送API,用起來是非常便利的,今天就來總結一下。 註冊賬號之後,首先建立一個應用,如下圖: 應用建立完成之後,會生成應用標識(AppKey)

Android開發之第三方JPush極光知識點詳解 學會整合第三方SDK

下面是一些知識點介紹,後期將會帶領大家進行程式碼實戰: 一、Android實現推送方式解決方案: 1、推送方式基礎知識:    在移動網際網路時代以前的手機,如果有事情發生需要通知使用者,則會有一個視窗彈出,將告訴使用者正在發生什麼事情。可能是未接電話

Android雲巴整合第三方實現APP偽保活(小米篇)

此文只是講述如何使用雲巴自帶的包實現該功能,核心技術並不是博主寫的。此功能實現首先實現基礎的推送,沒有實現的請看SDK快速入門,實現了的可以直接去官方文件怎麼整合第三方,雲巴文件傳送門,那我為什麼要寫這篇博文,我是不會和你講的,進入正題: 1.新建專案

android應用接入第三方實踐

本文由來和目的 由來:昨天技術群裡有人問到推送,作為一個親自踩過坑的的人,回答了一些問題,有人就說,你應該寫一篇部落格啊。其實在做完公司的專案整合之後,是想寫的,但是因為懶就一直沒寫,但昨天經人這麼一說,感覺還是寫出來的好。 目的:本文不會告訴你具體的推送整

android 極光 聲音與振動 的關閉和開啟

fff getc 用法 koa pub tar brush asi drawable   前言:最近剛好在寫一些推送方面的東西,又是新手,不斷在網上找資料,很少,不過還是找到了一些,反正百度我是再也不想百度了,谷歌一下子就能找到想要的。   廢話不多說。  

Android實現方式解決方案

都是 device andro broker dev 常見 剛才 設置 互聯網  本文介紹在Android中實現推送方式的基礎知識及相關解決方案。推送功能在手機開發中應用的場景是越來起來了,不說別的,就我們手機上的新聞客戶端就時不j時的推送過來新的消息,很方便的閱讀最新的新

Android push消息到達成功率優化

發送消息 data- 得到 推斷 view 使用 數據 數據庫 blog Android push推送消息到達成功率優化 問題:server向client發送消息。

基於Netty實現的Android 訊息(即時通訊)的解決方案

根據Netty框架實現訊息推送(即時聊天)功能. Netty框架,TCP長連線,心跳,阻塞訊息佇列,執行緒池處理訊息傳送, 基於Google ProtoBuf自定義的訊息協議, TCP粘包/拆包.... 客戶端通過TCP連線到伺服器,並建立TCP長連線;當伺服器端收到新訊息後通過TCP連線推送給

談談接入各種第三方平臺的技術方案和一點經驗

在移動網際網路時代,為了運營好一個APP,訊息推送是一個優質廉價的渠道。訊息推送的使用場景簡單來說,可以包括運營類的訊息推送,如活動推廣期間的推送等,還包括通知類的訊息推送,如社交場景中的新訊息提醒等。 對於APP來說,訊息推送能夠起到內容告知、提高日活,甚至召回使用者的作用。那麼如何接入第三方推送平臺呢

Android 小米(MiPush)的化簡深入理解

      小米推送(MiPush)是小米公司向開發者提供的訊息推送服務,總的流程如官方文件所示:      由圖可知,推送是雙向的:      1.推送是可以由app的後臺端發起,應用伺服器的後

Android 信鴿整合

本文是基於3.+的版本,在整合4.+的版本中,整合mid包時遇到一個問題 Manifest merger failed : uses-sdk:minSdkVersion 16 cannot be s

android pn是出現reomte-server-error(502)

07-23 17:18:33.249: E/Androidpn_XmppManager(17600): XMPP connection failed 07-23 17:18:33.249: E/Androidpn_XmppManager(17600): XMPPError connecti

android librtmp h264流 aac流 基本過程總結四 流x264

{ RTMPPacket * packet; unsigned char * body; int i; int ret = 0; if (m_pRtmp == NULL) return -1; packet = (RTMPPacket *) malloc(RTMP_HEAD_SIZE +

android 極光 自定義聲音

可以定義樣式,那麼可以禁用極光的聲音,收到通知就播放一個聲音就好:禁用: // 極光 JPushInterface.setDebugMode(IS_DEBUG); JPushInterface.init(this); BasicPushNotificationB

android(本地遠端

在現在的app中推送技術很普遍,推送可以提高使用者活躍度,也可以進行一些活動推送,今天就跟大家聊一下推送 推送分為遠端推送和本地推送,都可以通過推送訊息跳轉到一些應用或者活動介面,本地推送幾行程式碼就可以實現,遠端推送就需要藉助一些平臺的力量 (1)本地推送 Notifi

EasyPusher Android實時當前螢幕畫面

由於Android 5.0提供了捕獲當前螢幕畫面的SDK,基於該SDK,EasyPusher實現了實時推送手機螢幕畫面的功能。經測試,效果很不錯,延遲也比較低,畫面也比較流暢。該功能可運用到小型會議PPT演示、手遊直播等行業。 具體來說,MediaProjec

ionic平臺下的Android極光整合文件

雖然當前提供推送服務的第三方有很多,例如jpush,友盟,個推,騰訊信鴿等。但是由於大部分第三方只支援原生環境,再加上考慮到ionic平臺下網上已經提供了一套jpush的整合方案,所以我只是針對在jpush下ionic app推送做一些簡要的整理。 廢話不多說,直入主題。

Android極光通過不同的通知內容跳入不同的頁面

1、在註冊清單中加入 <receiver android:name="your receiver全路徑" android:enabled="true"> <intent-filter> <!-- 以下是要

Android訊息叨逼叨

         最近在搞即時訊息推送。瞭解了推送服務實現的基本原理。通過長連線去實現及時的推送,或者通過輪詢的方式去實現偽及時的推送。當然,通常我們選擇前者。如果實現長連線就要用到socket,所以簡單瞭解了下socket程式設計。又因為伺服器端需要考慮大併發、效能方面的