前言
安卓平臺現(xiàn)在很多廠商都有自己的推送服務提供給開發(fā)者集成,例如小米推送,oppo推送等。那如果我們都要去集成的話,那會比較繁瑣,因為流程基本是一致的,只要有人做好一個封裝,那客戶端就可以簡單調用了。
推送文檔集合
友盟推送:https://developer.umeng.com/docs/66632/detail/98581
OPPO推送:https://open.oppomobile.com/wiki/doc#id=10196
vivo推送:https://dev.vivo.com.cn/documentCenter/doc/158
接入流程
因為友盟推送里面,已經支持了小米、華為、魅族的推送,只需按照友盟文檔,配置下就好,今天我們只說友盟、oppo、vivo的集成。
1、引用相關sdk,jar包的話,我們公司的一般會傳到我們的maven庫,引用依賴。
2、繼承一個Handler,就是處理收到消息的點擊事件。
3、在AndroidManifest清單文件里面聲明一些服務廣播之類的東西。
4、在application里面注冊,注冊一般都需要key和秘鑰。
5、測試
開始接入
1、引用相關的依賴,以下是我們公司的依賴,具體依賴你們要去接入文檔找。
//友盟
api 'com.umeng.sdk:push:4.2.0'
//vivo
api 'com.mmc.push:vivo:2.3.4'
//oppo
api 'com.mmc.push:oppo:1.0.0'
2、繼承handler,處理收到推送的點擊事件,每個推送的繼承都不同,所以要弄3個。但處理的方法是一樣的,所以我們要定義好推送的格式。比如:
{
"action":110,
"actioncontent":"openXXX"
}
我們定義兩個鍵值對,在推送后臺,就是填上這對應的兩個值,然后客戶端接收來處理。第一個 action,可以說是類型,比如打開網頁,打開內置模塊等等,你們根據(jù)自己情況來定義,第二個,actioncontent,打開的具體處理,比如我要打開的某個模塊。
因為打開的處理是由每個客戶端處理的,我們組件需要暴露一個接口,然后讓APP實現(xiàn)處理的方法。
public interface IMessageHandlerBiz {
void dealPush(Context context , int action , String actioncontent);
}
接下來,再來實現(xiàn)點擊事件的處理,例如vivo的
public class VivoPushHandler extends OpenClientPushMessageReceiver {
@Override
public void onNotificationMessageClicked(Context context, UPSNotificationMessage upsNotificationMessage) {
Map<String, String> mParams = upsNotificationMessage.getParams();
String action = "";
String actioncontent = "";
if (mParams.containsKey("action")) {
action = mParams.get("action");
}
if (mParams.containsKey("actioncontent")) {
actioncontent = mParams.get("actioncontent");
}
if (TextUtils.isEmpty(action) || TextUtils.isEmpty(actioncontent)) {
return;
}
L.i("action:" + action);
L.i("actionContent:" + actioncontent);
//處理點擊事件,傳值
MMCPushAgent.getInstance().getCustomerMagHandler().dealPush(context, action , actioncontent);
}
@Override
public void onReceiveRegId(Context context, String regId) {
String responseString = "onReceiveRegId regId = " + regId;
L.i("vivo推送:" + responseString);
}
}
再來看oppo的,比較坑爹,繼承他文檔的,是沒用的,需要建一個Activity來中轉處理。
public class OPPOPushMessageActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 取參數(shù)值
if (getIntent().getExtras() != null) {
// 取參數(shù)值
Bundle bundle = getIntent().getExtras();
Set<String> set = bundle.keySet();
HashMap<String, String> hm = new HashMap<>();
if (set != null) {
for (String key : set) {
hm.put(key, bundle.getString(key));
}
}
L.i("oppo推送key的值是:" + hm.toString());
if (hm.size() > 0) {
//解析當前的HashMap對象,可以獲取具體的數(shù)據(jù)
String action = "";
String actionContent = "";
if (set.contains("action")) {
action = hm.get("action");
}
if (set.contains("actioncontent")) {
actionContent = hm.get("actioncontent");
}
if (TextUtils.isEmpty(action) || TextUtils.isEmpty(actionContent)) {
finish();
}
L.i("action:" + action);
L.i("actionContent:" + actionContent);
MMCPushAgent.getInstance().getCustomerMagHandler().dealPush(this, action , actioncontent);
finish();
}
}
}
}
然后,在oppo的后臺,填上跳轉的Activity名字,就是填這個。
3、聲明一些清單信息,看官方文檔配置就行,沒啥。
4、注冊
由于每個推送的注冊方式也不一樣,所以我們也定義一個接口
public interface IRegister {
void register(Context context);
}
然后讓每個推送都去實現(xiàn)他的方法,例如vivo的
public class VivoRegister implements IRegister {
@Override
public void register(final Context context, String resPackageName) {
PushClient.getInstance(context).initialize();
PushClient.getInstance(context).turnOnPush(new IPushActionListener() {
@Override
public void onStateChanged(int state) {
// TODO: 開關狀態(tài)處理
L.i("vivo推送打開狀態(tài):" + state);
}
});
}
}
好啦,最后來看功能類
public class MMCPushAgent {
private static final int[] S_LOCK = new int[0];
private static volatile MMCPushAgent INSTANCE;
private IMessageHandlerBiz mMsgHandlerBiz;
private MMCPushAgent() {
}
public static MMCPushAgent getInstance() {
if (null == INSTANCE) {
synchronized (S_LOCK) {
if (null == INSTANCE) {
INSTANCE = new MMCPushAgent();
}
}
}
return INSTANCE;
}
public void setCustomerMsgHandler(IMessageHandlerBiz handler) {
if (handler != null) {
this.mMsgHandlerBiz = handler;
}
}
public IMessageHandlerBiz getCustomerMagHandler() {
return mMsgHandlerBiz;
}
public void register(Context context,List<IRegister> mRegisters) {
for (IRegister register : mRegisters) {
register.register(context);
}
}
}
最后調用的話,就這樣
MMCPushAgent agent = MMCPushAgent.getInstance();
List<IRegister> list = new ArrayList<>();
list.add(new VivoRegister());
list.add(new OppoRegister());
agent.register(this, list);
agent.setCustomerMsgHandler(new IMessageHandlerBiz() {
@Override
public void dealPush(Context context , int action , String actioncontent);
//處理點擊事件
}
});
就這樣,ok啦。然后,因為集成了很多渠道的推送包,不能全部都集成吧,比如說,小米機,不需要oppo推送這些的。所以,要分渠道來依賴包,記得了。怎么分渠道依賴,自己搜索吧。大概思想就這樣,具體,你們試著去實現(xiàn)吧。88