Android蔽悄保活忠蝗,殺死app后收到推送,推送收不到漓拾。
其實(shí)指向的都是一個(gè)問題阁最,殺死app后,我還要能收到推送骇两。
用阿里推送的輔助通道功能可以實(shí)現(xiàn)
https://help.aliyun.com/document_detail/30067.html?spm=a2c4g.11186623.6.590.598b7fa8XmiUlS#h2-7-
輔助通道一般只接入速种,小米,華為低千,oppo配阵,vivo,魅族這5個(gè)廠商的示血,
其中的一些廠商需要額外的依賴闸餐。
阿里的文檔沒有給出正確的依賴,
正確的矾芙,包含5大廠商的依賴如下:
api 'com.aliyun.ams:alicloud-android-push:3.1.9@aar'
api 'com.aliyun.ams:alicloud-android-utils:1.1.5'
api 'com.aliyun.ams:alicloud-android-beacon:1.0.3'
api 'com.aliyun.ams:alicloud-android-ut:5.4.3'
api 'com.aliyun.ams:alicloud-android-third-push:3.0.8@aar'
api 'com.aliyun.ams:huawei-push:2.6.3.305'
api 'com.aliyun.ams:huawei-push-base:2.6.3.305'
api 'com.aliyun.ams:meizu-push:3.8.3-fix'
阿里sdk的使用主要通過這個(gè)類
public class PushService {
private static boolean IS_INIT_PUSH = false;
/**
* 初始化云推送通道
*
* @param applicationContext
*/
public static void registerPushService(Context applicationContext) {
PushServiceFactory.init(applicationContext);
final CloudPushService pushService = PushServiceFactory.getCloudPushService();
// pushService.setDebug(BuildConfig.DEBUG);
if (!IS_INIT_PUSH){
pushService.register(applicationContext, new CommonCallback() {
@Override
public void onSuccess(String response) {
Log.d("Push", "init cloudchannel success "+response);
IS_INIT_PUSH = true;
pushServiceBindAccount(applicationContext);
}
@Override
public void onFailed(String errorCode, String errorMessage) {
Log.d("Push", "init cloudchannel failed -- errorcode:" + errorCode + " -- errorMessage:" + errorMessage);
}
});
}
}
public static void pushServiceBindAccount(Context applicationContext) {
final CloudPushService pushService = PushServiceFactory.getCloudPushService();
String token = String.valueOf(PAccountManage.INSTANCE.getSp().getAccountId());
//需要綁定到賬號(hào)
if (IS_INIT_PUSH && !TextUtils.isEmpty(token)) {
pushService.bindAccount(token, new CommonCallback() {
@Override
public void onSuccess(String s) {
Log.d("Push", "bindAccount onSuccess");
initThirdPush(applicationContext);
}
@Override
public void onFailed(String s, String s1) {
Log.d("Push", "bindAccount onFailed");
}
});
}else {
Log.d("Push", "bindAccount onFailed2");
}
}
public static void pushServiceUnBindAccount(Context applicationContext) {
final CloudPushService pushService = PushServiceFactory.getCloudPushService();
if (IS_INIT_PUSH){
pushService.unbindAccount(new CommonCallback() {
@Override
public void onSuccess(String s) {
Log.d("Push", "unbindAccount onSuccess");
unRegisterThirdPush(applicationContext);
}
@Override
public void onFailed(String s, String s1) {
Log.d("Push", "unbindAccount onFailed");
}
});
}else {
Log.d("Push", "unbindAccount onFailed2");
}
}
private static void initThirdPush(Context applicationContext) {
// 注冊方法會(huì)自動(dòng)判斷是否支持小米系統(tǒng)推送舍沙,如不支持會(huì)跳過注冊。
MiPushRegister.register(applicationContext, "", "");
// 注冊方法會(huì)自動(dòng)判斷是否支持華為系統(tǒng)推送剔宪,如不支持會(huì)跳過注冊拂铡。
HuaWeiRegister.register((Application)applicationContext );
//GCM/FCM輔助通道注冊
// GcmRegister.register(applicationContext, "", ""); //sendId/applicationId為步驟獲得的參數(shù)
// OPPO通道注冊
OppoRegister.register(applicationContext, "", ""); // appKey/appSecret在OPPO通道開發(fā)者平臺(tái)獲取
// VIVO通道注冊
VivoRegister.register(applicationContext);
//魅族
MeizuRegister.register(applicationContext, "", ""); // appId/appkey在魅族開發(fā)者平臺(tái)獲取
}
private static void unRegisterThirdPush(Context applicationContext){
MiPushRegister.unregister(applicationContext);
// HuaWeiRegister.registerBundle((Application)applicationContext ,false);
OppoRegister.unregister(); // appKey/appSecret在OPPO通道開發(fā)者平臺(tái)獲取
VivoRegister.unregister();
// MeizuRegister.register(applicationContext, "", ""); // appId/appkey在魅族開發(fā)者平臺(tái)獲取
}
}
打開app需要初始化阿里sdk,Application里:
override fun onCreate() {
initPushModule()
}
private fun initPushModule() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
PushManager.initChannel()
}
if ( (isMainProcess(this@ParentApp) || isTargetProcess(this@ParentApp, "${applicationContext.packageName}:channel"))) {
PushService.registerPushService(this@ParentApp)
}
}
用戶登錄時(shí)調(diào)用:
PushService.pushServiceBindAccount(this)
退出登錄時(shí)調(diào)用:
PushService.pushServiceUnBindAccount(this)
創(chuàng)建通道的代碼:
// 通知渠道的id
var mChannelId = "aierman"
// 用戶可以看到的通知渠道的名字.
private var mChannelName = "哈嘍蘿博推送通知"
// 用戶可以看到的通知渠道的描述
private var mChannelDescription = "哈嘍蘿博推推送通知"
fun initChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationManager = BaseApp.app.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val channel = NotificationChannel(mChannelId, mChannelName, NotificationManager.IMPORTANCE_HIGH)
// 配置通知渠道的屬性
channel.description = mChannelDescription
// 設(shè)置通知出現(xiàn)時(shí)的閃燈(如果 android 設(shè)備支持的話)
channel.enableLights(true)
channel.lightColor = Color.RED
// 設(shè)置通知出現(xiàn)時(shí)的震動(dòng)(如果 android 設(shè)備支持的話)
channel.enableVibration(true)
channel.vibrationPattern = longArrayOf(100, 200, 300, 400, 500, 400, 300, 200, 400)
// 設(shè)置通知出現(xiàn)時(shí)聲音葱绒,默認(rèn)通知是有聲音的
channel.setSound(Settings.System.DEFAULT_NOTIFICATION_URI, Notification.AUDIO_ATTRIBUTES_DEFAULT);
channel.setShowBadge(true)//打開腳標(biāo)
notificationManager.createNotificationChannel(channel)
}
}
別忘了在清單文件加入以下配置:
<meta-data
android:name="com.huawei.hms.client.appid"
android:value="" />
<meta-data
android:name="com.vivo.push.api_key"
android:value="" />
<meta-data
android:name="com.vivo.push.app_id"
android:value="" />
<meta-data
android:name="com.alibaba.app.appkey"
android:value="" /> <!-- 阿里推送 appSecret -->
<meta-data
android:name="com.alibaba.app.appsecret"
android:value="" /> <!-- 消息接收監(jiān)聽器 (用戶可自主擴(kuò)展) -->
<activity
android:name="com.hellorobotedu.aiparent.push.PopupPushActivity"
android:exported="true"/>
對(duì)于PopupPushActivity感帅,記得:
class PopupPushActivity : AndroidPopupActivity()
最后一定要記得在阿里推送控制臺(tái)的應(yīng)用配置,配置你各個(gè)手機(jī)廠商的key地淀,不然輔助通道不會(huì)生效失球。
坑:
1.華為,記得配置SHA256帮毁,不然輔助通道不生效見圖
2.推送不到達(dá)的意外情況處理:
(1).殺死app后立即進(jìn)行推送是收不到的实苞,因?yàn)榘⒗锬沁叢恢繿pp已經(jīng)死了,
輔助彈窗和正式通道都推不過來烈疚。
比如殺死app后立即推送了一個(gè)“推送a”黔牵,那app肯定是收不到的,
那只能等下一次有效的推送(有效指的是離殺死app的時(shí)間足夠久的推送)爷肝,比如“推送b”猾浦,
“推送b”推送了之后陆错,“推送a”和”推送b”才可以一起收到.
(2).切換賬號(hào)問題,
舉例金赦,我已經(jīng)在oppo手機(jī)登錄音瓷,殺死app,
再在小米手機(jī)登錄夹抗,再殺死app
那么再次推送還是會(huì)推到oppo绳慎,因?yàn)閛ppo和阿里的綁定沒有解除,
如何解除?在oppo上執(zhí)行退出登錄兔朦,或者在小米手機(jī)上運(yùn)行app足夠久偷线。
end
如果你覺得這篇文章對(duì)你有所幫助磨确,不妨點(diǎn)一個(gè)贊沽甥,作者會(huì)非常高興的。