隨著Android系統(tǒng)不斷升級衣式,應用后臺存活時間一直受限制,所以通過應用進程的NotificationManager
彈出通知的方式并不可靠骡澈。
但是應用不存活罚勾,也要彈出通知的需求一直在珍策。Android不像IOS系統(tǒng)托启,IOS支持apns推送服務,所以天然是可靠的膛壹。為了解決這個問題驾中,各個手機廠商推出了自己的官方推送。
推送分為兩種:
- 透傳推送模聋,依賴應用進程的存活
- 官方推送肩民,由廠商推送,不依賴應用進程的存活
本文以 HUAWEI MI VIVO OPPO 四個手機廠商為例链方,分別貼出相應的接入須知和實現(xiàn)代碼持痰。
每個廠商都要由公司的運營或者專門的同學幫我們申請,當然祟蚀,如果公司規(guī)模較小工窍,那么只能由開發(fā)自己去申請。其他三家還好前酿,OPPO的官方推送申請是有條件患雏,其中有一條是即時通訊的APP不能接入。(大家接入時罢维,要仔細閱讀文檔)
HUAWEI
按照如上文檔淹仑,引入華為的sdk。
AndroidManifest
<!-- 接入HMSSDK PUSH模塊需要注冊肺孵,第三方相關(guān) :接收Push消息(注冊匀借、Push消息、Push連接狀態(tài))廣播平窘,
此receiver類需要開發(fā)者自己創(chuàng)建并繼承com.huawei.hms.support.api.push.PushReceiver類吓肋,
參考示例代碼中的類:com.huawei.hmsagent.HuaweiPushRevicer
Access to the HMSSDK push module requires registration:
Receive push message (registration, push message, push connection state) broadcast.
This receiver class requires the developer to create and inherit the com.huawei.hms.support.api.push.PushReceiver class.
Reference to class in sample code: Com.huawei.hmsagent.HuaweiPushRevicer-->
<receiver android:name=".push.HuaWeiPushReceiver">
<intent-filter>
<!-- 必須,用于接收token | Must, for receiving token -->
<action android:name="com.huawei.android.push.intent.REGISTRATION"/>
<!-- 必須瑰艘,用于接收消息 | Must是鬼, used to receive messages-->
<action android:name="com.huawei.android.push.intent.RECEIVE"/>
<!-- 可選肤舞,用于點擊通知欄或通知欄上的按鈕后觸發(fā)onEvent回調(diào) | Optional, click the button on the notification bar or the notification bar to trigger the onevent callback -->
<action android:name="com.huawei.android.push.intent.CLICK"/>
<!-- 可選,查看push通道是否連接屑咳,不查看則不需要 | Optional, query whether the push channel is connected or not -->
<action android:name="com.huawei.intent.action.PUSH_STATE"/>
</intent-filter>
</receiver>
HuaWeiPushReceiver
- 用來記錄華為推送的token萨赁,以便于告知自己的服務
- 接受透傳推送
public class HuaWeiPushReceiver extends PushReceiver {
private static final String TAG = "HuaWeiPushReceiver";
public static String getToken() {
return tokenStore.get();
}
private static final PreferenceStore.StringStore tokenStore = PreferenceStore.ofString("sun.push.huawei.token", "");
@Override
public void onToken(Context context, String token) {
super.onToken(context, token);
if (PushInit.PUSH_LOG) {
Log.i(TAG, "onToken() called with: context = [" + context + "], token = [" + token + "]");
}
Logger.i(true, "華為推送 token: %s", token);
if (!TextUtils.isEmpty(token)) {
tokenStore.set(token);
}
PushRegisterProxy.registerHuaWeiPush();
}
@Override
public boolean onPushMsg(Context context, byte[] msgBytes, Bundle extras) {
if (PushInit.PUSH_LOG) {
Log.i(TAG, "onPushMsg() called with: context = [" + context + "], msgBytes = [" + new String(msgBytes, Chars.UTF_8) + "], extras = [" + extras + "]");
}
final String msg = new String(msgBytes, Chars.UTF_8);
PassThroughPushCenter.onReceivePush(msg, PassThroughPushCenter.TYPE_HUAWEI);
return true;
}
@Override
public void onEvent(Context context, Event event, Bundle extras) {
super.onEvent(context, event, extras);
if (PushInit.PUSH_LOG) {
Log.i(TAG, "onEvent() called with: context = [" + context + "], event = [" + event + "], extras = [" + extras + "]");
}
}
@Override
public void onPushState(Context context, boolean pushState) {
super.onPushState(context, pushState);
if (PushInit.PUSH_LOG) {
Log.i(TAG, "onPushState() called with: context = [" + context + "], pushState = [" + pushState + "]");
}
}
}
HuaWeiPushDispatcher
當點擊華為的官方推送,會顯示此Activity兆龙,點擊后的操作,都由HuaWeiPushDispatcher
觸發(fā)敲董。
public class HuaWeiPushDispatcher extends Activity {
private static final String TAG = "HuaWeiPushDispatcher";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_NO_TITLE);
final Intent intent = getIntent();
final String data = intent.getStringExtra("data");
final BasePushMsgEntity model = Jsons.parseJson(data, BasePushMsgEntity.class);
Log.i(TAG, "onCreate: " + data);
if (model == null || !model.isValid()) {
finish();
return;
}
NotifyPushCenter.onNotifyPush(this, data, model, NotifyPushCenter.NotifyPushChannel.HwPush);
new Handler().post(new Runnable() {
@Override
public void run() {
finish();
}
});
}
}
很簡單紫皇,我們通過intent獲取到推送過來的數(shù)據(jù),然后處理腋寨。最后將此Activity關(guān)掉即可
小米
AndroidManifest
<receiver
android:name=".push.MiPushReceiver"
android:exported="true">
<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>
MiPushReceiver
實現(xiàn)PushMessageReceiver聪铺,在onNotificationMessageClicked
處理點擊事件即可
public class MiPushReceiver extends PushMessageReceiver {
private static final String TAG = "MiPushReceiver";
public static final String APP_ID = "*****";
public static final String APP_KEY = "*****";
@Override
public void onReceivePassThroughMessage(Context context, MiPushMessage message) {
if (DEBUG) {
Logger.d("接收到消息推送透傳消息 message: %s", message);
}
PassThroughPushCenter.onReceivePush(message.getContent(), PassThroughPushCenter.TYPE_MI_PUSH);
}
@Override
public void onNotificationMessageArrived(Context context, MiPushMessage miPushMessage) {
super.onNotificationMessageArrived(context, miPushMessage);
Log.d(TAG, "onNotificationMessageArrived() called with: context = [" + context + "], miPushMessage = [" + miPushMessage + "]");
}
@Override
public void onNotificationMessageClicked(Context context, MiPushMessage miPushMessage) {
super.onNotificationMessageClicked(context, miPushMessage);
NotifyPushCenter.onNotifyPush(context, miPushMessage.getContent(), NotifyPushCenter.NotifyPushChannel.MiPush);
}
@Override
public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
String command = message.getCommand();
List<String> arguments = message.getCommandArguments();
String regId = ((arguments != null && arguments.size() > 0) ? arguments.get(0) : null);
if (MiPushClient.COMMAND_REGISTER.equals(command)) {
if (message.getResultCode() == ErrorCode.SUCCESS) {
if (DEBUG) {
Logger.d("小米推送回調(diào) regId:%s", regId);
}
PushRegisterProxy.registerMiPush();
}
}
}
}
OPPO
暫缺
VIVO
AndroidManifest
<receiver android:name="com.iksocial.queen.push.VivoPushMessageReceiver">
<intent-filter>
<!--接受push消息-->
<action android:name="com.vivo.pushclient.action.RECEIVE"/>
</intent-filter>
</receiver>
VivoPushMessageReceiver
,同樣的萄窜,onNotificationMessageClicked點擊事件處理即可铃剔。
public class VivoPushMessageReceiver extends OpenClientPushMessageReceiver {
@Override
public void onNotificationMessageClicked(Context context, UPSNotificationMessage message) {
NotifyPushCenter.onNotifyPush(context, message.getSkipContent(), NotifyPushCenter.NotifyPushChannel.VPush);
}
@Override
public void onReceiveRegId(Context context, String s) {
Log.i(TAG, "onReceiveRegIdvivopush: " + s);
PushRegisterProxy.registerVivoPush();
}
}