Android 對接極光推送(詳細到令人髮指版+含源碼)

前言

發現現在的Android開發中很少有不用第三方SDK的,爲什麼呢?就是因爲實現一個功能的速度快呀,比如說客服、聊天、直播等一些功能,用第三方SDK可以最快解決問題,我在實際開發中也對接過很多SDK,不過仔細寫過這方便到的博客,前段時間我寫了一個關於udesk SDK的文章,實現IM的,寫的不算太詳細,不過你如果看了也夠用了,好了,進入正文。

正文

效果圖,源碼在文章最後
在這裏插入圖片描述
今天要對接的這個SDK是極光系列中的推送服務SDK,當然極光還有其他的服務,進入極光官網瞭解一下,我這裏放個圖說明一下
在這裏插入圖片描述
主要看我標註的這個,因爲主要講這個,爲什麼文章會說是詳細到令人髮指呢?下面你就明白了。

註冊極光賬號

無論你用什麼SDK,你都會需要註冊賬號的,爲了寫個博客我都重新註冊了一個賬號了,點擊註冊
在這裏插入圖片描述
進入註冊頁面
在這裏插入圖片描述
輸入個人信息,
在這裏插入圖片描述
然後提交
在這裏插入圖片描述
然後要進入郵箱去驗證一下,不然怎麼知道你這個郵箱有沒有用呢,點擊立即登錄郵箱,進入之後打開收件箱
在這裏插入圖片描述
可以看到最新的郵件是極光發過來的,打開這個郵件
在這裏插入圖片描述
然後進行郵箱驗證
在這裏插入圖片描述
有的電腦可能又會這根訪問攔截,點繼續訪問即可,沒出現的當我沒說過。
在這裏插入圖片描述
郵箱驗證成功,登錄極光吧!
在這裏插入圖片描述
輸入信息之後登錄
在這裏插入圖片描述
這個信息現在是可以隨便輸入的,不過如果你要升級爲開發者的話就要真實個人信息了。
在這裏插入圖片描述
進入開發者平臺
在這裏插入圖片描述
創建應用,需要名稱和圖標
在這裏插入圖片描述

這裏需要用到一個圖標
在這裏插入圖片描述
點擊確認,然後應用就創建好了
在這裏插入圖片描述
接下來進行推送設置
在這裏插入圖片描述
應用包名,現在去Android Studio創建一個項目
在這裏插入圖片描述

Next
在這裏插入圖片描述
Finish,等待項目創建完成,打開AndroidManifest.xml
在這裏插入圖片描述
複製包名在這裏插入圖片描述
保存
在這裏插入圖片描述
確認
在這裏插入圖片描述
查看集成文檔
在這裏插入圖片描述
主要看這個自動集成的,簡單快捷,So Easy!
文檔你可以自己去看,因爲我已經看過很多遍了,所以下面以項目的環境爲主。

步驟

①確認 android studio 的 Project 根目錄的主 gradle 中配置了 jcenter 支持。(新建 project 默認配置就支持)

在這裏插入圖片描述
在這裏插入圖片描述

②在 module 的 gradle 中添加依賴。

在這裏插入圖片描述

在這裏插入圖片描述
然後右上角Sync Now點擊同步一下剛纔改變的配置,否則改動不生效。

③然後新建兩個包,servicereceiver

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
然後在service包下創建一個PushService類,然後繼承JCommonService,代碼如下:

package com.llw.pushdemo.service;

import cn.jpush.android.service.JCommonService;

public class PushService extends JCommonService {

}

在receiver包下創建一個PushReceiver類,然後繼承JPushMessageReceiver,代碼如下:

package com.llw.pushdemo.receiver;

import cn.jpush.android.service.JPushMessageReceiver;

public class PushReceiver extends JPushMessageReceiver {
    
}

都只是簡單的繼承而已。

④配置AndroidManifest.xml

然後現在回到AndroidManifest.xml
在這裏插入圖片描述

		<!--極光推送 服務-->
        <service
            android:name=".service.PushService"
            android:enabled="true"
            android:exported="false"
            android:process=":pushcore">
            <intent-filter>
                <action android:name="cn.jiguang.user.service.action" />
            </intent-filter>
        </service>
        <!--極光推送 接收器-->
        <receiver
            android:name=".receiver.PushReceiver"
            android:enabled="true"
            android:exported="false" >
            <intent-filter>
                <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
                <category android:name="com.llw.pushdemo" />
            </intent-filter>
        </receiver>

這裏會用到一個工具類ExampleUtil.java,代碼如下:

package com.llw.pushdemo;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Looper;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.widget.Toast;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import cn.jpush.android.api.JPushInterface;
import cn.jpush.android.helper.Logger;

public class ExampleUtil {
    public static final String PREFS_NAME = "JPUSH_EXAMPLE";
    public static final String PREFS_DAYS = "JPUSH_EXAMPLE_DAYS";
    public static final String PREFS_START_TIME = "PREFS_START_TIME";
    public static final String PREFS_END_TIME = "PREFS_END_TIME";
    public static final String KEY_APP_KEY = "JPUSH_APPKEY";

    public static boolean isEmpty(String s) {
        if (null == s)
            return true;
        if (s.length() == 0)
            return true;
        if (s.trim().length() == 0)
            return true;
        return false;
    }
    /**
     * 只能以 “+” 或者 數字開頭;後面的內容只能包含 “-” 和 數字。
     * */
    private final static String MOBILE_NUMBER_CHARS = "^[+0-9][-0-9]{1,}$";
    public static boolean isValidMobileNumber(String s) {
        if(TextUtils.isEmpty(s)) return true;
        Pattern p = Pattern.compile(MOBILE_NUMBER_CHARS);
        Matcher m = p.matcher(s);
        return m.matches();
    }
    // 校驗Tag Alias 只能是數字,英文字母和中文
    public static boolean isValidTagAndAlias(String s) {
        Pattern p = Pattern.compile("^[\u4E00-\u9FA50-9a-zA-Z_!@#$&*+=.|]+$");
        Matcher m = p.matcher(s);
        return m.matches();
    }

    // 取得AppKey
    public static String getAppKey(Context context) {
        Bundle metaData = null;
        String appKey = null;
        try {
            ApplicationInfo ai = context.getPackageManager().getApplicationInfo(
                    context.getPackageName(), PackageManager.GET_META_DATA);
            if (null != ai)
                metaData = ai.metaData;
            if (null != metaData) {
                appKey = metaData.getString(KEY_APP_KEY);
                if ((null == appKey) || appKey.length() != 24) {
                    appKey = null;
                }
            }
        } catch (NameNotFoundException e) {

        }
        return appKey;
    }

    // 取得版本號
    public static String GetVersion(Context context) {
		try {
			PackageInfo manager = context.getPackageManager().getPackageInfo(
					context.getPackageName(), 0);
			return manager.versionName;
		} catch (NameNotFoundException e) {
			return "Unknown";
		}
	}

    public static void showToast(final String toast, final Context context)
    {
    	new Thread(new Runnable() {

			@Override
			public void run() {
				Looper.prepare();
				Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
				Looper.loop();
			}
		}).start();
    }

    public static boolean isConnected(Context context) {
        ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = conn.getActiveNetworkInfo();
        return (info != null && info.isConnected());
    }

	public static String getImei(Context context, String imei) {
        String ret = null;
		try {
			TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            ret = telephonyManager.getDeviceId();
		} catch (Exception e) {
			Logger.e(ExampleUtil.class.getSimpleName(), e.getMessage());
		}
		if (isReadableASCII(ret)){
            return ret;
        } else {
            return imei;
        }
	}

    private static boolean isReadableASCII(CharSequence string){
        if (TextUtils.isEmpty(string)) return false;
        try {
            Pattern p = Pattern.compile("[\\x20-\\x7E]+");
            return p.matcher(string).matches();
        } catch (Throwable e){
            return true;
        }
    }

    public static String getDeviceId(Context context) {
        return JPushInterface.getUdid(context);
    }
}

在這裏插入圖片描述

⑤修改MainActivity.java

然後是MainActiviity.java

//for receive customer msg from jpush server
    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";
    private EditText msgText;

註冊消息接收和設置自定義消息

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");
                    }
                    setCostomMsg(showMsg.toString());
                }
            } catch (Exception e){
            }
        }
    }

    //設置自定義消息
    private void setCostomMsg(String msg){
        if (null != msgText) {
            msgText.setText(msg);
            msgText.setVisibility(View.VISIBLE);
        }
    }

然後在onCreate中初始化和調用

		JPushInterface.init(getApplicationContext());//極光接口初始化,否則用不了
        registerMessageReceiver();//註冊消息接收器

現在你就可以運行了
在這裏插入圖片描述

⑥發送通知

很好,看到Hello World!了,現在打開極光的控制檯
在這裏插入圖片描述
點擊進入
在這裏插入圖片描述
因爲我已經安裝了應用,所以在平臺上可以看到新增了一個用戶。
設置推送消息
在這裏插入圖片描述
滑動到最下面,廣播所有人的意思就是只要是安裝了這個應用的人都會收到通知
在這裏插入圖片描述
然後預覽
在這裏插入圖片描述
然後你會看到預估人數1,就算你這裏是0也沒有關係,因爲這個平臺的數據有時候會有延時,不用擔心,大膽的勇敢的點擊確認發送通知吧!
在這裏插入圖片描述
發送成功!
而且手機上也收到了通知了
在這裏插入圖片描述

⑦拓展 應用通知開關監聽

你看,就這樣實現了。你以爲就完了嗎?
在這裏插入圖片描述
當然沒有完?注意到上面的圖是推送消息的記錄,目標1,成功1,當然有的手機會收不到通知,這是爲什麼呢?因爲國內的很多手機廠商對Android系統進行了自家系統開發,導致,Android的兼容比較難做,因爲有的手機默認應用就不允許接收通知,所以你收不到也不要覺得奇怪,在手機設置裏打開通知開關就可以了。我的是榮耀 20i,默認安裝應用就自動打開了這個開關的。
這裏就涉及到另一個知識點了,那就是通知開關的監聽。舉個例子,愛奇藝APP,平時老是給我推送通知,煩得很,然後我就給它關了通知,下次進入APP是會有一個提示
在這裏插入圖片描述
就像這樣,基本每個成熟的APP,都會有這個監聽的。下面來看看怎麼做吧。
無非就是兩個方法而已

//是否開啓通知接收
private boolean isNotificationEnabled(Context context) {
        boolean isOpened = false;
        try {
            isOpened = NotificationManagerCompat.from(context).areNotificationsEnabled();
        } catch (Exception e) {
            e.printStackTrace();
            isOpened = false;
        }
        return isOpened;

    }
	//去設置
    private void gotoSet() {
        Intent intent = new Intent();
        if (Build.VERSION.SDK_INT >= 26) {
            // android 8.0引導
            intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
            intent.putExtra("android.provider.extra.APP_PACKAGE", getPackageName());
        } else if (Build.VERSION.SDK_INT >= 21) {
            // android 5.0-7.0
            intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
            intent.putExtra("app_package", getPackageName());
            intent.putExtra("app_uid", getApplicationInfo().uid);
        } else {
            // 其他
            intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
            intent.setData(Uri.fromParts("package", getPackageName(), null));
        }
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);

    }

然後就是使用方法了
在這裏插入圖片描述

這個時候如果你的這個Demo通知是關閉的話,那麼你一打開這個頁面就會跳轉到通知開啓那裏去。OK,你以爲完了嗎?
真的完了!
最後貼一下MainActiviy.java的完整代碼

package com.llw.pushdemo;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationManagerCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

import cn.jpush.android.api.JPushInterface;

public class MainActivity extends AppCompatActivity {


    //for receive customer msg from jpush server
    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";
    private EditText msgText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        JPushInterface.init(getApplicationContext());//極光接口初始化,否則用不了
        registerMessageReceiver();//註冊消息接收器

        //判斷該app是否打開了通知,如果沒有的話就打開手機設置頁面
        if (!isNotificationEnabled(this)) {
            //開啓通知彈窗
            gotoSet();
        } else {
            //當前app允許消息通知
        }
    }



    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");
                    }
                    setCostomMsg(showMsg.toString());
                }
            } catch (Exception e){
            }
        }
    }

    //設置自定義消息
    private void setCostomMsg(String msg){
        if (null != msgText) {
            msgText.setText(msg);
            msgText.setVisibility(View.VISIBLE);
        }
    }

    //是否開啓通知接收
    private boolean isNotificationEnabled(Context context) {
        boolean isOpened = false;
        try {
            isOpened = NotificationManagerCompat.from(context).areNotificationsEnabled();
        } catch (Exception e) {
            e.printStackTrace();
            isOpened = false;
        }
        return isOpened;

    }
    //去設置
    private void gotoSet() {
        Intent intent = new Intent();
        if (Build.VERSION.SDK_INT >= 26) {
            // android 8.0引導
            intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
            intent.putExtra("android.provider.extra.APP_PACKAGE", getPackageName());
        } else if (Build.VERSION.SDK_INT >= 21) {
            // android 5.0-7.0
            intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
            intent.putExtra("app_package", getPackageName());
            intent.putExtra("app_uid", getApplicationInfo().uid);
        } else {
            // 其他
            intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
            intent.setData(Uri.fromParts("package", getPackageName(), null));
        }
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);

    }
}

Demo源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章