1. 程式人生 > >Android 中使用極光推送訊息詳細介紹(一)

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,兩個模擬器共有的標籤,看下效果:
這裡寫圖片描述

這回兩個模擬器就都收到了通知

好了,這一章就講到這裡,後面會深入講解自定義訊息