Android 中使用極光推送訊息詳細介紹(一)
簡介
在Android開發中,伺服器有時候會向客戶端推送一些使用者可能感興趣的訊息,比如:淘寶,網易新聞,美團等都會向我們客戶端推送訊息.今天我就介紹一個第三方免費推送訊息的服務:極光推送
官方資源
具體使用
效果
官方提供了Demo ,在3分鐘快速整合SDK文件裡面,可以下載,如果不瞭解極光推送,可以吧官方的Demo下載下來執行一遍,就可以看見效果了
這邊我已經下來過了,所以我就直接把效果圖貼出來,方便大家觀看
在極光推送的後臺輸入:JPushTest後,點擊發送,客戶端這便就會受到通知,這只是一個簡單的效果
實現
好了,看完效果之後,我們就一步一步實現這個效果把
註冊賬號拿到AppKey
第一步就是要去官網註冊賬號,之後點選開發者服務選極光推送
第二步就是點選立即使用
第三步 建立應用
第四步 填寫應用資訊
第五步 拿到AppKey
新建一個工程
把剛才下載好的SDK解壓出來
開啟libs資料夾
其中有兩部分,把jpush-android-2.1.7.jar這個jar包複製到我們工程的libs下面,之後在app/src/main資料夾下面新建一個資料夾,叫:jniLibs,把剛才除了jpush-android-2.1.7.jar這個以外所有的資料夾都放到這裡
然後找到我們的manifest.xml 修改其中的內容(我已經把必須的都複製過來了,可以直接複製我的程式碼,當然也可以去照著文件進行復制,推薦去照著官方文件進行修改)
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.example.hfs.jpushexample"
xmlns:android="http://schemas.android.com/apk/res/android">
<permission
android:name="${applicationId}.permission.JPUSH_MESSAGE"
android:protectionLevel="signature"/>
<!-- Required 一些系統要求的許可權,如訪問網路等-->
<uses-permission android:name="${applicationId}.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"/>
<!-- Optional for location -->
<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"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".TestActivity"/>
<!-- Required SDK核心功能-->
<activity
android:name="cn.jpush.android.ui.PushActivity"
android:configChanges="orientation|keyboardHidden"
android:exported="false"
android:theme="@android:style/Theme.NoTitleBar">
<intent-filter>
<action android:name="cn.jpush.android.ui.PushActivity"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="${applicationId}"/>
</intent-filter>
</activity>
<!-- Required SDK核心功能-->
<service
android:name="cn.jpush.android.service.DownloadService"
android:enabled="true"
android:exported="false">
</service>
<!-- 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 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="${applicationId}"/>
</intent-filter>
</service>
<!-- 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="${applicationId}"/>
</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"/>
<!-- User defined. For test only 使用者自定義的廣播接收器-->
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTRATION"/> <!--Required 使用者註冊SDK的intent-->
<action android:name="cn.jpush.android.intent.UNREGISTRATION"/>
<action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED"/> <!--Required 使用者接收SDK訊息的intent-->
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED"/> <!--Required 使用者接收SDK通知欄資訊的intent-->
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED"/> <!--Required 使用者開啟自定義通知欄的intent-->
<action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK"/> <!--Optional 使用者接受Rich Push Javascript 回撥函式的intent-->
<action android:name="cn.jpush.android.intent.CONNECTION"/><!-- 接收網路變化 連線/斷開 since 1.6.3 -->
<category android:name="${applicationId}"/>
</intent-filter>
</receiver>
<!-- Required . Enable it you can get statistics data with channel -->
<meta-data
android:name="JPUSH_CHANNEL"
android:value="developer-default"/>
<meta-data
android:name="JPUSH_APPKEY"
android:value="665d69121981502b7929625c"/> <!-- </>值來自開發者平臺取得的AppKey-->
</application>
</manifest>
好了,manifest.xml配置完之後,其實程式碼很簡單,兩句程式碼就可以實現推送功能了
在MainActivity的onCreate方法中加入這兩句程式碼:
JPushInterface.setDebugMode(true);//如果時正式版就改成false
JPushInterface.init(this);
這樣,最基本的功能完成了,我們看下效果
修改通知標題
極光推送預設的通知標題是我們在建立應用時輸入的應用名字,這有時不符合我們的要求,所以我們就要自己設定標題了,那麼怎麼設定呢?
極光推送已經為我們考慮到了這個問題了,我們只要在推送時輸入我們要推送的標題即可,在立即傳送上面有一個可選設定,開啟就可以自定義標題了
這回我們修改下標題,再看下效果
傳送訊息
這個傳送訊息和上面的傳送通知還是有區別的.傳送通知可以直接展示在客戶端上,但是傳送訊息客戶端那邊雖然接收到了,但是並不顯示(不明覺厲???看下效果)
我在後臺傳送一個訊息,我們觀察下模擬器的變化
好吧,模擬器什麼都沒有….
那怎麼知道我們傳送成功呢?
我們可以看Log啊(哈哈),開啟AndroidStudio看下log日誌
07-30 12:33:00.917 19470-19470/com.example.hfs.jpushexample I/System.out: 收到了通知
07-30 12:36:45.621 19470-19493/com.example.hfs.jpushexample D/JPush: [NetworkingClient] Received bytes - len:157, connection:-1205476664, pkg:com.example.hfs.jpushexample
07-30 12:36:45.621 19470-19493/com.example.hfs.jpushexample D/JPush: [NetworkingClient] Action - receivedCommand - cmd:3
07-30 12:36:45.621 19470-19493/com.example.hfs.jpushexample D/JPush: [NetworkingClient] Network listening...
07-30 12:36:45.621 19470-19470/com.example.hfs.jpushexample D/MyReceiver: onReceive - cn.jpush.android.intent.MESSAGE_RECEIVED
07-30 12:36:45.621 19470-19470/com.example.hfs.jpushexample I/System.out: 收到了自定義訊息。訊息內容是:JpushMessage
這回看到了吧
那麼問題來了,這個推送訊息有什麼用呢?
那就解釋下把:
自定義訊息是極光推送自己的概念。
自定義訊息不是通知,所以不會被SDK展示到通知欄上。其內容完全由開發者自己定義。
自定義訊息主要用於應用的內部業務邏輯。一條自定義訊息推送過來,有可能沒有任何介面顯示。
傳送訊息或通知到特定的人群
有時我們並不是想把內容都發送給所有的使用者,比如有的使用者喜歡玩遊戲,我們就把跟遊戲有關的內容推送給他們即可,那麼怎麼實現呢?
在推送物件裡面有個目標人群,在那裡我們可以選擇我們要推送的目標人群
Registration ID
這個是隻要有客戶端使用,極光推送就會生成一個Registration ID 因為這個時極光推送生成的,我們用起來不是很方便,所以基本上不用
別名
之後再看裝置別名,這個就是你可以為客戶端設定別名,這樣在你推送的時候,你就推送到和你設定別名匹配的客戶端上,使用直接呼叫setAlias()方法即可(比如使用者登入完,你可以把使用者名稱作為該使用者的別名)
舉例:
package com.example.hfs.jpushexample;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.HashSet;
import java.util.Set;
import cn.jpush.android.api.JPushInterface;
import cn.jpush.android.api.TagAliasCallback;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
JPushInterface.setDebugMode(true);
JPushInterface.init(this);
JPushInterface.setAlias(this, //上下文物件
"test123456", //別名
new TagAliasCallback() {//回撥介面,i=0表示成功,其它設定失敗
@Override
public void gotResult(int i, String s, Set<String> set) {
Log.d("alias", "set alias result is" + i);
}
});
}
}
好了,我們執行下程式,再看下效果
######標籤(TAG)
這個和上面別名區別在於,這個可以傳送好多個客戶端,只要匹配這個標籤即可
這裡為了實現這個功能,我這邊開兩個模擬器,方便大家看下效果
方法是呼叫setTag()這個方法
說下這個方法把,這個方法的第二個引數是個set集合,為什麼呢?因為每個人可能有好多個興趣愛好,這樣就可能有多個標籤.這裡我們假設第一個使用者的TAG是sport和game;第二個使用者的TAG是music和game
package com.example.hfs.jpushexample;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.HashSet;
import java.util.Set;
import cn.jpush.android.api.JPushInterface;
import cn.jpush.android.api.TagAliasCallback;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
JPushInterface.setDebugMode(true);
JPushInterface.init(this);
// JPushInterface.setAlias(this, "test123456", new TagAliasCallback() {
// @Override
// public void gotResult(int i, String s, Set<String> set) {
// Log.d("alias", "set alias result is" + i);
// }
// });
//
Set<String> sets = new HashSet<>();
sets.add("sport");//執行第二個模擬器上時把這個注掉
sets.add("game");
// sets.add("music");//執行第二個模擬器上時把這個開啟
JPushInterface.setTags(this, sets, new TagAliasCallback() {
@Override
public void gotResult(int i, String s, Set<String> set) {
Log.d("alias", "set tag result is" + i);
}
});
}
}
我們分別執行程式碼到兩個模擬器上,之後我去後臺推送一個通知,看下兩個模擬器通知欄的變化
第一次推送標籤選擇sport,看下效果:
只有第二個模擬器收到了通知
第二次推送標籤選擇music,看下效果:
這有第一個模擬器收到了通知
第三次我們選擇game,兩個模擬器共有的標籤,看下效果:
這回兩個模擬器就都收到了通知
好了,這一章就講到這裡,後面會深入講解自定義訊息