前言
最近給公司項目集成推送,開始集成了極光推送,但是集成廠商後臺推送是要花錢的。老闆心疼錢,沒法子只能一個廠家一個廠家的對接推送了。廢話不多先從小米開始吧。
一、小米推送
創建應用,打開小米開放平臺點擊右上角進入登錄頁面。進入登陸界面後,輸入帳號、密碼並點擊登陸後進入小米開放平臺。
點擊移動開發服務中的消息推送按鈕進入推送後臺。
點擊“創建手機/平板應用”按鈕進入創建新應用界面。
接下來就是下載小米的sdk有一個MiPush_SDK_Client_... .jar,吧jar包放在libs下 下載地址
配置AndroidManifest.xml文件
1、推送服務需要的權限列表:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.VIBRATE"/>
<permission android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE"
android:protectionLevel="signature" /> <!--這裏com.xiaomi.mipushdemo改成app的包名-->
<uses-permission android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE" /><!--這裏com.xiaomi.mipushdemo改成app的包名-->
2、推送服務需要配置的service和receiver:
<service android:enabled="true" android:process=":pushservice" android:name="com.xiaomi.push.service.XMPushService"/>
<service android:name="com.xiaomi.push.service.XMJobService" android:enabled="true" android:exported="false" android:permission="android.permission.BIND_JOB_SERVICE" android:process=":pushservice" /> <!--注:此service必須在3.0.1版本以後(包括3.0.1版本)加入-->
<service android:enabled="true" android:exported="true" android:name="com.xiaomi.mipush.sdk.PushMessageHandler" />
<service android:enabled="true" android:name="com.xiaomi.mipush.sdk.MessageHandleService" /> <!--注:此service必須在2.2.5版本以後(包括2.2.5版本)加入--> <receiver android:exported="true" android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<receiver android:exported="false" android:process=":pushservice" android:name="com.xiaomi.push.service.receivers.PingReceiver" >
<intent-filter>
<action android:name="com.xiaomi.push.PING_TIMER" />
</intent-filter>
</receiver>
3、 自定義一個BroadcastReceiver類
public class DemoMessageReceiver extends PushMessageReceiver {
private String mRegId;
private long mResultCode = -1;
private String mReason;
private String mCommand;
private String mMessage;
private String mTopic;
private String mAlias;
private String mUserAccount;
private String mStartTime;
private String mEndTime;
@Override
public void onReceivePassThroughMessage(Context context, MiPushMessage message) {
mMessage = message.getContent();
if(!TextUtils.isEmpty(message.getTopic())) {
mTopic=message.getTopic();
} else if(!TextUtils.isEmpty(message.getAlias())) {
mAlias=message.getAlias();
} else if(!TextUtils.isEmpty(message.getUserAccount())) {
mUserAccount=message.getUserAccount();
}
}
@Override
public void onNotificationMessageClicked(Context context, MiPushMessage message) {
mMessage = message.getContent();
if(!TextUtils.isEmpty(message.getTopic())) {
mTopic=message.getTopic();
} else if(!TextUtils.isEmpty(message.getAlias())) {
mAlias=message.getAlias();
} else if(!TextUtils.isEmpty(message.getUserAccount())) {
mUserAccount=message.getUserAccount();
}
}
@Override
public void onNotificationMessageArrived(Context context, MiPushMessage message) {
mMessage = message.getContent();
if(!TextUtils.isEmpty(message.getTopic())) {
mTopic=message.getTopic();
} else if(!TextUtils.isEmpty(message.getAlias())) {
mAlias=message.getAlias();
} else if(!TextUtils.isEmpty(message.getUserAccount())) {
mUserAccount=message.getUserAccount();
}
}
@Override
public void onCommandResult(Context context, MiPushCommandMessage message) {
String command = message.getCommand();
List<String> arguments = message.getCommandArguments();
String cmdArg1 = ((arguments != null && arguments.size() > 0) ? arguments.get(0) : null);
String cmdArg2 = ((arguments != null && arguments.size() > 1) ? arguments.get(1) : null);
if (MiPushClient.COMMAND_REGISTER.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
mRegId = cmdArg1;
}
} else if (MiPushClient.COMMAND_SET_ALIAS.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
mAlias = cmdArg1;
}
} else if (MiPushClient.COMMAND_UNSET_ALIAS.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
mAlias = cmdArg1;
}
} else if (MiPushClient.COMMAND_SUBSCRIBE_TOPIC.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
mTopic = cmdArg1;
}
} else if (MiPushClient.COMMAND_UNSUBSCRIBE_TOPIC.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
mTopic = cmdArg1;
}
} else if (MiPushClient.COMMAND_SET_ACCEPT_TIME.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
mStartTime = cmdArg1;
mEndTime = cmdArg2;
}
}
}
@Override
public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
String command = message.getCommand();
List<String> arguments = message.getCommandArguments();
String cmdArg1 = ((arguments != null && arguments.size() > 0) ? arguments.get(0) : null);
String cmdArg2 = ((arguments != null && arguments.size() > 1) ? arguments.get(1) : null);
if (MiPushClient.COMMAND_REGISTER.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
mRegId = cmdArg1;
}
}
}
}
將自定義的BroadcastReceiver註冊到AndroidManifest.xml文件中
<receiver
android:exported="true"
android:name="com.xiaomi.mipushdemo.DemoMessageReceiver">
<!--這裏com.xiaomi.mipushdemo.DemoMessageRreceiver改成app中定義的完整類名-->
<intent-filter>
<action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
</intent-filter>
<intent-filter>
<action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
</intent-filter>
<intent-filter>
<action android:name="com.xiaomi.mipush.ERROR" />
</intent-filter>
</receiver>
正式代碼開始
在 Application 中的 onCreate 方法初始化
//APP_ID APP_KEY 是開始創建小米應用獲取過來的值
MiPushClient.registerPush(this, APP_ID, APP_KEY);
目前爲止小米推送算是集成完畢了。我的項目中和用到了UserAccount,個人覺得它比別名更加適合我們公司的項目,就沒有用別名。
後臺根據 "該用戶的唯一識別" 這個字段來推送
//小米設置UserAccount
MiPushClient.setUserAccount(this,"該用戶的唯一識別",null);
//用戶退出登錄時要刪除UserAccount
MiPushClient.unsetUserAccount(this,"該用戶的唯一識別",null);
在接廠商推送的時候,都應該有接入跳轉指定activity,我也簡單介紹一下這個吧
//我指定跳轉的是登錄頁
<activity
android:name=".ui.acticity.login.LoginActivity">
//intent-filter 是必須加的 小米文檔可能沒寫 其他廠家推送又是有用到的
//hwpush_detail piccscheme 可以自己心情來修改
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="包名"
android:path="/hwpush_detail"
android:scheme="piccscheme" />
</intent-filter>
</activity>
在LoginActivity中onCreate加入
Intent intent = getIntent();
//uriString 這個值給後臺 後臺根據它來跳轉
//該uriString就Constants.EXTRA_PARAM_INTENT_URI對應的值
//intent:#Intent;component. ... .LoginActivity;end 這個是我返回來的值
//在頁面接收值的話 我是叫後臺吧數據 直接寫在intent:後 #前
//intent:url=123#Intent;........
//url 就是後臺給傳的值 123
String uriString = intent.toUri(Intent.URI_INTENT_SCHEME);
String url = uriString.substring(uriString.indexOf("url=") + 4,uriString.lastIndexOf("#"));
二、華爲推送
華爲推送挺坑的,我也是文檔加博客才弄清楚的廢話不多,開始了
創建應用
登錄【華爲開發者聯盟】https://developer.huawei.com/consumer/cn/
申請PUSH服務
註冊完成以後
1、在項目根目錄下打開build.gradle
allprojects {
repositories {
jcenter()
maven {url 'http://developer.huawei.com/repo/'}
}
}
下項目app下的build.gradle寫入
//華爲Push通道
implementation 'com.huawei.android.hms:push:2.6.3.306'
implementation 'com.meizu.flyme.internet:push-internal:3.8.3'
implementation 'org.jsoup:jsoup:1.12.1'
2、下載SDK
https://obs.cn-north-2.myhwclouds.com/hms-ds-wf/sdk/HMSAgent_2.6.3.306.zip
減壓文件 雙擊 GetHMSAgent_cn.bat文件 根據彈窗口提示 輸入自己應用到的內容
完成後生成一個copysrc文件夾,AppManifestConfig.xml配置文件就根據 copysrc文件夾下的AppManifestConfig.xml來配置
然後把java文件中的hms直接複製到自己項目中,修改一下包名就好了
3、初始化Agent 後臺根據token來進行單個用戶推送
/**
* 初始化HMS Agent
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
HMSAgent.init(this);
}
/**
* SDK連接HMS
*/
HMSAgent.connect(this, new ConnectHandler() {
@Override
public void onConnect(int rst) {
showLog("HMS connect end:" + rst);
}
});
/**
* 獲取token
*/
private void getToken() {
showLog("get token: begin");
HMSAgent.Push.getToken(new GetTokenHandler() {
@Override
public void onResult(int rtnCode, TokenResult tokenResult) {
showLog("get token: end" + rtnCode);
}
});
}
}
4、然後就是跳轉指定界面了
//我指定跳轉的是登錄頁
<activity
android:name=".ui.acticity.login.LoginActivity">
//intent-filter 是必須加的 小米文檔可能沒寫 其他廠家推送又是有用到的
//hwpush_detail piccscheme 可以自己心情來修改
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="包名"
android:path="/hwpush_detail"
android:scheme="piccscheme" />
</intent-filter>
</activity>
在LoginActivity中onCreate加入
Intent intent = getIntent();
//uriString 這個值給後臺 後臺根據它來跳轉
//該uriString就Constants.EXTRA_PARAM_INTENT_URI對應的值
//intent:#Intent;....LoginActivity;end 這個是我返回來的值
//在頁面接收值的話 我是叫後臺吧數據 直接寫在intent:後 #前
//intent:url=123#Intent;........
//url 就是後臺給傳的值 123
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
String intentUri = intent.toUri(Intent.URI_INTENT_SCHEME);
String url = uriString.substring(uriString.indexOf("url=") + 4,uriString.lastIndexOf("#"));
三、vivo推送