先介紹下極光推送吧,想要實現推送功能,現在市場上主要的實現方式是維持一個長連接,服務端隨時發出一條通知或者一條自定義消息時,用戶可以實時的接受到該消息並進行相應處理。
極光推送(JPush)也不例外,就是這樣一個端到端的推送服務,使得服務器端消息能夠及時地推送到終端用戶手機上,讓開發者積極地保持與用戶的連接,從而提高用戶活躍度、提高應用的留存率。極光推送客戶端支持 Android, iOS 兩個平台。
本 Android SDK 方便開發者基於 JPush 來快捷地為 Android App 增加推送功能。
Android應用集成Jpush流程:
第一步肯定是注冊一個極光推送的賬號,之后添加應用,需要填寫包名等相關信息,添加之后如圖:
極光推送應用詳情頁面會展示應用的具體信息,其中包名是我們注冊應用時填寫的,而我們主要用到的就是AppKey這個屬性,稍候我會提到。
完成了應用的注冊,接下來就是集成流程:
SDK集成步驟
導入 SDK 開發包到你自己的應用程序項目
- 解壓縮 jpush-sdk_v1.x.y.zip 集成壓縮包
- 復制 libs/jpush-sdk-release1.x.y.jar 到工程 libs/ 目錄下
- 復制 libs/armeabi/libjpush1xy.so 到工程 libs/armeabi 目錄下
- 復制 libs/armeabi-v7a/libjpush.so 到工程 libs/armeabi-v7a 目錄下
如果您的項目有 libs/armeabi-v7a 這個目錄,請把 libs/armeabi-v7a下的so文件 也復制一份到這個目錄。
- 復制 res/drawable-hdpi 中的資源文件到工程的 res/drawable-hdpi/ 目錄下
- 復制 res/layout 中的布局文件到工程的 res/layout/ 目錄下
說明 1:若沒有drawable-xxxx/jpush_notification_icon這個資源默認使用應用圖標作為通知icon,在5.0以上系統將應用圖標作為statusbar icon可能顯示不正常,用戶可定義純色icon替換這個文件,文件名不要變。
說明 2:如果要在gradle中配置 shrinkResources true 用來清理多余資源,請在res/raw/ 中添加一個keep.xml來描述保留JPushSDK中的必要資源。示例請參考版本包中的 res/raw/keep.xml文件。(2.1.5版本以上)
ps:這幾行是從Jpush文檔上抄的,寫的很仔細,照着做就好
配置 AndroidManifest.xml
<permission android:name="com.dxf.org.webview.permission.JPUSH_MESSAGE" android:protectionLevel="signature" />
這行權限是為了給應用添加接受自定義消息,如果有接受自定義消息的需求的話,一定要添加
<uses-permission android:name="com.dxf.org.webview.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.WRITE_SETTINGS" /> <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.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
上述這些權限是為應用添加Jpush所需的權限,都添加上即可
接下來這些是很重要的,屬於JpushSDK中的主體部分,因為Jpush的實現方式就是注冊一個廣播來接受長連接中返回的數據,下面是廣播的生命和部分配置
<!-- Required SDK核心功能 --> <receiver android:name="cn.jpush.android.service.PushReceiver" android:enabled="true" android:exported="false"> <intent-filter android:priority="1000"> <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY"/> <!-- Required 顯示通知欄 --> <category android:name="org.yuwei.education"/> </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核心功能 --> <receiver android:name="cn.jpush.android.service.AlarmReceiver" android:exported="false"/>
然后是添加AppKey,下面列出的是我的JpushDemo的Appkey,替換成對應的即可,這也是不可缺少的部分
<meta-data android:name="JPUSH_APPKEY" android:value="3803be4c4fc5641e851f80c2"/>
至此,應用的清單文件就配置完成了,接下來是應用中的配置了
首先要在應用的Application文件中對Jpush進行初始化
JPushInterface.setDebugMode(true); // 設置開啟日志,發布時請關閉日志 JPushInterface.init(this); // 初始化 JPush
添加Jpush中的Receiver類,在該類中的onReceive()方法中處理對應的消息,處理注釋已經添加了
@Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); Log.d(TAG, "[MyReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle)); if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) { String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID); Log.d(TAG, "[MyReceiver] 接收Registration Id : " + regId); //send the Registration Id to your server... } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) { Log.d(TAG, "[MyReceiver] 接收到推送下來的自定義消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE)); processCustomMessage(context, bundle); } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) { Log.d(TAG, "[MyReceiver] 接收到推送下來的通知"); int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID); Log.d(TAG, "[MyReceiver] 接收到推送下來的通知的ID: " + notifactionId); } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) { Log.d(TAG, "[MyReceiver] 用戶點擊打開了通知"); //打開自定義的Activity Intent i = new Intent(context, TestActivity.class); i.putExtras(bundle); //i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP ); context.startActivity(i); } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) { Log.d(TAG, "[MyReceiver] 用戶收到到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); Log.w(TAG, "[MyReceiver]" + intent.getAction() +" connected state change to "+connected); } else { Log.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction()); } }