Android 中使用極光推送消息詳細介紹

簡介

在Android開發中,服務器有時候會向客戶端推送一些用戶可能感興趣的消息,比如:淘寶,網易新聞,美團等都會向我們客戶端推送消息.今天我就介紹一個第三方免費推送消息的服務:極光推送

官方資源

官方文檔: 
http://docs.jiguang.cn/client/android_sdk/ 
3 分鐘快速集成 JPush Android SDK: 
http://docs.jiguang.cn/guideline/android_3m/ 
Android SDK集成: 
http://docs.jiguang.cn/guideline/android_guide/

具體使用

效果

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

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

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


發佈了41 篇原創文章 · 獲贊 72 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章