Android 3分鐘帶你集成極光推送

話不多說 首先申請極光的賬號凹髓,(官方地址:https://www.jiguang.cn

1561710140829.png

登錄完成之后植影,先看到這個(gè)地方 攒磨,我個(gè)人比較喜歡用舊版本本橙,這里點(diǎn)擊舊版
1561710235064.png

點(diǎn)擊這個(gè)創(chuàng)建應(yīng)用
1561710626969.png

注意這個(gè)地方應(yīng)用名稱是必填項(xiàng)候生,圖標(biāo)是選填提澎,這里我就只填一個(gè)應(yīng)用名稱(這里的名稱就是Mainface里面的app_name)
1561710724862.png

1561710743741.png

填入名字之后 點(diǎn)擊創(chuàng)建我的應(yīng)用(這里我沒試過名字不一樣是否可以成功推送尾抑,個(gè)人覺得沒必要做這種嘗試)
1561710852958.png

看到創(chuàng)建成功字樣后點(diǎn)擊完成推送配置:
里面有Android IOS 和win 這里我只演示Android
1561711022205.png

取項(xiàng)目中app目錄下的build.gradle文件中的applicationId 對應(yīng)的值(一般在集成三方庫的時(shí)候用到包名的,我們都認(rèn)為這個(gè)applicationId 是應(yīng)用程序的包名)函筋,將這個(gè)包名復(fù)制粘貼到以下頁面的選項(xiàng)中并點(diǎn)擊保存:
1561711265137.png

點(diǎn)擊 下載Demo沙合,把Demo解壓到一個(gè)文件中如下:
1561711547102.png

很多博客寫到這里都是說把解壓之的文件以module的方式引入到項(xiàng)目中,經(jīng)過我自己的測試我發(fā)現(xiàn)這樣是行不通的跌帐,因?yàn)闃O光提供的這個(gè)Demo其實(shí)是一個(gè)eclipse項(xiàng)目首懈,所以在AS上跑是有問題的,經(jīng)過閱讀官方文檔和自己的摸索谨敛,發(fā)現(xiàn)其實(shí)這里面有用的就上面標(biāo)記的兩個(gè)地方究履,src里面存放了一些極光為我們生成的一套收消息的類,Mainface里面為我們配置了一些權(quán)限信息和其他的東西脸狸,這里首先需要按照官方文檔配置APP目錄下的build.gradle文件:

1561714344089.png

回到首頁查看極光推送的文檔(這里我只截取build.gradle里面的配置信息):


1561714447363.png

這一這個(gè)里面有個(gè)JPUSH_APPKEY:需要填入剛剛申請后的APPkey:


1561715348319.png

AS執(zhí)行以下 Sync Now 以便于下載極光的包

以下都是權(quán)限 沒什么好說的

<!-- Required  一些系統(tǒng)要求的權(quán)限最仑,如訪問網(wǎng)絡(luò)等-->
    <uses-permission android:name="com.yhb.pushdemo.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.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.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    
    <!-- Optional for location -->
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于開啟 debug 版本的應(yīng)用在6.0 系統(tǒng)上 層疊窗口權(quán)限 -->
    <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" />

這里主要是要查看Mainface里面的配置信息,備注信息很清楚炊甲,這里我就做過多贅述了:

   //參照集成文檔中來的文檔中
        <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.yhb.pushdemo">

    <!-- Required  一些系統(tǒng)要求的權(quán)限泥彤,如訪問網(wǎng)絡(luò)等-->
    <uses-permission android:name="com.yhb.pushdemo.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.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.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />


    <!-- Optional for location -->
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于開啟 debug 版本的應(yīng)用在6.0 系統(tǒng)上 層疊窗口權(quán)限 -->
    <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" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        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>

        <!-- For test only 測試狀態(tài)通知欄,需要打開的Activity -->
        <activity android:name="com.example.jpushdemo.TestActivity" android:exported="false">
            <intent-filter>
                <action android:name="jpush.testAction" />
                <category android:name="jpush.testCategory" />
            </intent-filter>
        </activity>

        <!-- Rich push 核心功能 since 2.0.6-->
        <activity
            android:name="cn.jpush.android.ui.PopWinActivity"
            android:theme="@style/MyDialogStyle"
            android:exported="false">
        </activity>

        <!-- 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="com.yhb.pushdemo" />
            </intent-filter>
        </activity>

        <!-- Required SDK 核心功能-->
        <!-- 可配置android:process參數(shù)將PushService放在其他進(jìn)程中 -->
        <service
            android:name="cn.jpush.android.service.PushService"
            android:process=":pushcore"
            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="com.yhb.pushdemo.DataProvider"
            android:name="cn.jpush.android.service.DataProvider"
            android:process=":pushcore"
            android:exported="false"
            />

        <!-- since 1.8.0 option 可選項(xiàng)卿啡。用于同一設(shè)備中不同應(yīng)用的JPush服務(wù)相互拉起的功能吟吝。 -->
        <!-- 若不啟用該功能可刪除該組件,將不拉起其他應(yīng)用也不能被其他應(yīng)用拉起 -->
        <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="com.yhb.pushdemo" />
            </intent-filter>

        </service>
        <!-- since 3.1.0 Required SDK 核心功能-->
        <provider
            android:authorities="com.yhb.pushdemo.DownloadProvider"
            android:name="cn.jpush.android.service.DownloadProvider"
            android:exported="true"
            />
        <!-- 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="com.yhb.pushdemo" />
            </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"/>

        <!--since 3.3.0 Required SDK核心功能-->
        <activity
            android:name="cn.jpush.android.service.JNotifyActivity"
            android:exported="true"
            android:taskAffinity="jpush.custom"
            android:theme="@android:style/Theme.Translucent.NoTitleBar">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.JNotifyActivity" />
                <category android:name="com.yhb.pushdemo" />
            </intent-filter>
        </activity>

        <!-- Since JCore2.0.0 Required SDK核心功能-->
        <!-- 這個(gè)Service要繼承JCommonService -->
        <service android:name="com.example.jpushdemo.PushService"
            android:process=":pushcore">
            <intent-filter>
                <action android:name="cn.jiguang.user.service.action" />
            </intent-filter>
        </service>


        <!-- User defined.  For test only  用戶自定義的廣播接收器-->
        <receiver
            android:name="com.example.jpushdemo.MyReceiver"
            android:exported="false"
            android:enabled="true">
            <intent-filter>
                <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  用戶接收SDK通知欄信息的intent-->
                <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> <!--Required  用戶打開自定義通知欄的intent-->
                <action android:name="cn.jpush.android.intent.CONNECTION" /><!-- 接收網(wǎng)絡(luò)變化 連接/斷開 since 1.6.3 -->
                <category android:name="com.yhb.pushdemo" />
            </intent-filter>
        </receiver>

        <!-- User defined.  For test only  用戶自定義接收消息器,3.0.7開始支持,目前新tag/alias接口設(shè)置結(jié)果會在該廣播接收器對應(yīng)的方法中回調(diào)-->
        <receiver android:name="com.example.jpushdemo.MyJPushMessageReceiver">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
                <category android:name="com.yhb.pushdemo"></category>
            </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="af286405fb9a70a376ad2669" /> <!--  </>值來自開發(fā)者平臺取得的AppKey-->

    </application>

</manifest>

復(fù)制上去之后颈娜,會有以下幾處報(bào)錯(cuò)爸黄,這幾處報(bào)錯(cuò)只需要把src下面對應(yīng)的類拷貝過來,然后修改Mainface里面的路徑名即可


image.png

image.png

image.png

image.png

新增完后的項(xiàng)目目錄:


image.png

可看到還有兩個(gè)類報(bào)錯(cuò)揭鳞,這個(gè)時(shí)候,看看一看里面需要的東西梆奈,差什么拷貝什么
最后剩下一個(gè)MainActivity里面需要添加?xùn)|西野崇,這里我直接拷貝過來

package com.yhb.pushdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {


    public static boolean isForeground = false;

    private MessageReceiver mMessageReceiver;
    public static final String MESSAGE_RECEIVED_ACTION = "com.example.jpushdemo.MESSAGE_RECEIVED_ACTION";
    public static final String KEY_TITLE = "title";
    public static final String KEY_MESSAGE = "message";
    public static final String KEY_EXTRAS = "extras";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void registerMessageReceiver() {
        mMessageReceiver = new MessageReceiver();
        IntentFilter filter = new IntentFilter();
        filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
        filter.addAction(MESSAGE_RECEIVED_ACTION);
        LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, filter);
    }

    public class MessageReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            try {
                if (MESSAGE_RECEIVED_ACTION.equals(intent.getAction())) {
                    String messge = intent.getStringExtra(KEY_MESSAGE);
                    String extras = intent.getStringExtra(KEY_EXTRAS);
                    StringBuilder showMsg = new StringBuilder();
                    showMsg.append(KEY_MESSAGE + " : " + messge + "\n");
                    if (!ExampleUtil.isEmpty(extras)) {
                        showMsg.append(KEY_EXTRAS + " : " + extras + "\n");
                    }
                    Toast.makeText(context, showMsg.toString(), Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e){
            }
        }
    }

    @Override
    protected void onResume() {
        isForeground = true;
        super.onResume();
    }


    @Override
    protected void onPause() {
        isForeground = false;
        super.onPause();
    }
}

最后一步,初始化極光推送:

package com.yhb.pushdemo;

import android.app.Application;

import cn.jpush.android.api.JPushInterface;

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        JPushInterface.setDebugMode(true);
        JPushInterface.init(this);
    }
}

在Mainface中新增如下代碼:


image.png

這個(gè)時(shí)候在AndroidStudio中Rebuild一下亩钟,然后安裝app到手機(jī)上乓梨,注意這里最好使用真機(jī)(樓主使用的真機(jī)測試,不知道模擬器是否可以)
這個(gè)時(shí)候我們就可以開始在極光后臺給我們的手機(jī)推送數(shù)據(jù)了
推送數(shù)據(jù)第一步:


image.png

注意這個(gè)列表10分鐘刷新一次清酥,所有有時(shí)候我們看到的用戶數(shù)不對扶镀,是因?yàn)闆]有及時(shí)刷新,所以不必?fù)?dān)心
在這個(gè)頁面點(diǎn)擊相應(yīng)的應(yīng)用焰轻,這里我點(diǎn)擊極光測試用例然后進(jìn)入:


image.png

點(diǎn)擊這里的 “推送” 然后進(jìn)入:


image.png

可以看到當(dāng)前這個(gè)頁面中的推送歷史是什么都沒有的臭觉,然后點(diǎn)擊這里 “發(fā)送通知” 進(jìn)入發(fā)送通知頁面
左邊是發(fā)送的測試信息,右邊是接收的平臺,我這里是Android
(注意:如果右邊這個(gè)方框里面沒有如圖顯示)
image.png

或者以下這四個(gè)按鈕不可選的時(shí)候蝠筑,狞膘,說明在前面配置極光的時(shí)候少了一步


image.png

如果右邊的手機(jī)沒有出現(xiàn),或者是方框內(nèi)什么都沒有什乙,亦或是以上四個(gè)目標(biāo)平臺不可選的時(shí)候挽封,那么大概率是缺少以下配置:(方框內(nèi)有顯示的,可以忽略此步驟)


1561710852958.png

如果沒問題臣镣,選擇對應(yīng)的平臺辅愿,我這里選擇Android(選擇的平臺需要在推送配置里面配置好之后,才可以在這里選擇你想要推送的平臺)

以下目標(biāo)人群和發(fā)送時(shí)間我這邊都是默認(rèn)的忆某,這里需要注意的是 這個(gè)立即發(fā)送按鈕点待,如果顯示是藍(lán)色的,說明上面的信息都沒有問題褒繁,否則你需要再次檢查上面需要填寫的內(nèi)容


image.png

點(diǎn)擊立即發(fā)送亦鳞,在手機(jī)上看到如下效果,說明推送已經(jīng)集成成功


image.png

還可以在極光的控制臺看到詳細(xì)的數(shù)據(jù)如下棒坏,也說明推送集成成功燕差,一般情況下兩種都可以看到:
image.png

至此,推送的demo就完全集成完了坝冕,小伙伴們可以根據(jù)自己的業(yè)務(wù)在之前copy的接收器和TestActivity里面做自己的業(yè)務(wù)邏輯了徒探,當(dāng)然 我這里實(shí)現(xiàn)的只是最簡單的推送邏輯,更多詳細(xì)內(nèi)容請查看官方集成文檔喂窟。
如有問題测暗,可以在下方給博主留言哦,博主也是一位菜雞磨澡,希望各位大佬不喜輕噴碗啄,在這里先行謝謝各位!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末稳摄,一起剝皮案震驚了整個(gè)濱河市稚字,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厦酬,老刑警劉巖胆描,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異仗阅,居然都是意外死亡昌讲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門减噪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來短绸,“玉大人车吹,你說我怎么就攤上這事○矗” “怎么了礼搁?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長目尖。 經(jīng)常有香客問我馒吴,道長,這世上最難降的妖魔是什么瑟曲? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任饮戳,我火速辦了婚禮,結(jié)果婚禮上洞拨,老公的妹妹穿的比我還像新娘扯罐。我一直安慰自己,他們只是感情好烦衣,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布歹河。 她就那樣靜靜地躺著,像睡著了一般花吟。 火紅的嫁衣襯著肌膚如雪秸歧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天衅澈,我揣著相機(jī)與錄音键菱,去河邊找鬼。 笑死今布,一個(gè)胖子當(dāng)著我的面吹牛经备,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播部默,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼侵蒙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了傅蹂?” 一聲冷哼從身側(cè)響起纷闺,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贬派,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澎媒,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搞乏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了戒努。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片请敦。...
    茶點(diǎn)故事閱讀 40,438評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡镐躲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出侍筛,到底是詐尸還是另有隱情萤皂,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布匣椰,位于F島的核電站裆熙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏禽笑。R本人自食惡果不足惜入录,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佳镜。 院中可真熱鬧僚稿,春花似錦、人聲如沸蟀伸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啊掏。三九已至蠢络,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脖律,已是汗流浹背谢肾。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留小泉,地道東北人芦疏。 一個(gè)月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像微姊,于是被迫代替她去往敵國和親酸茴。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容