Android 阿里推送正常推送以及辅助通道走过的坑,2024年最新字节跳动内部学习资料泄露

本文介绍了Android应用在阿里推送中遇到的问题及解决方案,特别是针对Android 8+的适配。内容包括客户端和服务端的配置,如辅助通道的初始化、日志检查以及不同品牌设备的特殊处理。同时,分享了如何规划Android学习方向和获取最新学习资料的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

  1. -dontwarn com.vivo.**

  2. # 魅族通道

  3. -keep **class** com.meizu.cloud.** {*;}

  4. -dontwarn com.meizu.cloud.**

5. 在应用中初始化辅助通道


将以下代码加入你application.onCreate()方法中初始通道。注意:辅助通道注册务必在Application中执行且放在推送SDK初始化代码之后,否则可能导致辅助通道注册失败

  1. // 注册方法会自动判断是否支持小米系统推送,如不支持会跳过注册。

  2. MiPushRegister.**register**(applicationContext, "小米AppID", "小米AppKey");

  3. // 注册方法会自动判断是否支持华为系统推送,如不支持会跳过注册。

  4. HuaWeiRegister.**register**(application);

  5. //GCM/FCM辅助通道注册

  6. GcmRegister.**register**(**this**, sendId, applicationId); //sendId/applicationId为步骤获得的参数

  7. // OPPO通道注册

  8. OppoRegister.**register**(applicationContext, appKey, appSecret); // appKey/appSecret在OPPO开发者平台获取

  9. // 魅族通道注册

  10. MeizuRegister.**register**(applicationContext, "appId", "appkey"); // appId/appkey在魅族开发者平台获取

  11. // VIVO通道注册

  12. VivoRegister.**register**(applicationContext);

本方法会自动判断是否支持小米系统推送,如不支持会跳过注册。

6. 在日志中查看初始化情况


华为通道初始化成功,可以看到以下日志:(如不成功,检查是否在华为控制台配置SHA256指纹证书,目前华为需要配置)华为.jpg

小米通道初始化成功,可以看到以下日志:小米.jpg

GCM/FCM通道初始化成功,可以看到以下日志:

  1. 05-19 19:18:44.530 19153-19177/com.xxx D/MPS:GcmRegister: token from register:eWIXLYCNP0Q:APA91bFUAgxj6XYf5okyoCBnRPw1UwITndzXrvPDgbdI2N44PYm17hFEBiNXNQJrJ8bOG_xjw3c3UPDAhzNMTLNjlAKcjUanKyLA6E3k4wEmgZuhgUT02UMmMvH2LVA1L2Z4-l-cT_Ug

OPPO通道是否注册成功, 可以通过过滤MPS:oppo关键字查看, 注册成功会打印onRegister regid=****相关日志, 否则检查参数是否正确填入;

VIVO通道是否注册成功, 可以通过过滤MPS:vivo关键字查看, 注册成功会打印getRegId regId:****相关日志, 否则检查参数是否正确填入;

魅族通道初始化成功,可以看到以下日志:魅族.jpg

收到小米通道下行的消息:(需要将sdk日志等级设置到DEBUG)

  1. 12-09 22:24:34.065 19566-25042/com.xxx D/MPS:MiPushReceiver: onReceiveMessage,msg=[{"f":262,"b":"{\"content\"\ ... ... ,"i":"f__-rnje3_OH74gE|VG0g3kwMnGADAGrXZku1FFW5"}]

收到GCM/FCM通道下发的消息:

  1. 05-19 19:20:04.900 19153-20391/com.alibaba.push2 D/MPS:GcmRegister: onReceiveMessage payload msg:[......]

若小米通道注册失败(未看到小米注册成功日志),请查看系统日志(logcat设置NoFilters),以PushService|BroadcastQueue为正则式进行过滤,示例如下图:

  • MiPushBroadcastReceiver未配置:MiPushBroadcastReceiver

  • MIPUSH_RECEIVE权限未配置:MIPUSH_RECEIVE

注1:如果控制台配置了小米/华为的信息,app需要加对应的jar包依赖,不然会有crash的风险。

客户端接入完毕,服务端推送时如果设备无法收到推送,可先查看 移动推送Android SDK:Android辅助通道和弹窗排查步骤

7. 辅助弹窗


  • 当前部分国产品牌设备管控严格,接入推送功能的App进程在后台被清理后,收不到推送通知;接入辅助弹窗后,可以借助对应品牌的系统通道,保证App后台被清理后,仍能收到推送通知;

  • 当前辅助弹窗已接入小米、华为、OPPO、VIVO、魅族(小米辅助弹窗:v2.3.0及以上支持;华为辅助弹窗:v3.0.8及以上支持;OPPO辅助弹窗:v3.1.4及以上支持);

  • 当前华为辅助弹窗仅支持Emotion UI(华为定制ROM)4.1级以上版本的设备;

7.1 客户端

  • 该功能的使用需要接入推送辅助通道,确保使用最新的辅助通道扩展包,具体参考上文;

  • 辅助弹窗送达的通知展示效果,和普通通知相同;

  • 服务端指定辅助弹窗通道推送时,一定要指定通知点击后要打开的Activity,该Activity需继承自抽象类AndroidPopupActivityMiPushSystemNotificationActivity已废弃,小米、华为、OPPO等厂商通道弹窗统一继承AndroidPopupActivity),否则无法获取到通知的相关信息,并且会影响通知到达率的统计;

  • AndroidPopupActivity中提供抽象方法onSysNoticeOpened(),实现该方法后可获取到辅助弹窗通知的标题内容额外参数,在通知点击时触发,原本的通知回调onNotification()onNotificationOpened()不适用于辅助弹窗;

  • 指定打开的托管弹窗Activity在AndroidManifest.xml中注册时需要声明属性:android:exported=true

  • 接入如下所示:

  1. **import** com.alibaba.sdk.android.push.AndroidPopupActivity;

  2. **public** **class** PopupPushActivity **extends** AndroidPopupActivity {

  3. **static** **final** String TAG = "PopupPushActivity";

  4. @Override

  5. **protected** **void** onCreate(Bundle savedInstanceState) {

  6. **super**.onCreate(savedInstanceState);

  7. }

  8. /**

  9. * 实现通知打开回调方法,获取通知相关信息

  10. * @param title 标题

  11. * @param summary 内容

  12. * @param extMap 额外参数

  13. */

  14. @Override

  15. **protected** **void** onSysNoticeOpened(String title, String summary, Map<String, String> extMap) {

  16. Log.d("OnMiPushSysNoticeOpened, title: " + title + ", content: " + summary + ", extMap: " + extMap);

  17. }

  18. }

7.2 服务端

  • OpenAPI 2.0的推送高级接口提供了AndroidPopupActivityAndroidPopupTitleAndroidPopupBody三个参数,分别用于设置辅助弹窗通知打开时跳转的Activity、通知标题以及通知内容(注意:StoreOffline参数也需要设置为true);

  • 辅助弹窗仅对后台进程被清理的小米/华为/VIVO/OPPO/魅族 设备生效,对非接入厂商通道设备和在线的设备不生效;

  • 当辅助弹窗生效时,推送接口的TitleBodyAndroidActivity以及额外参数设置中的功能性设置(如声音、震动等)都不起作用;

    1. PushRequest pushRequest = **new** PushRequest();
  1. // 其余设置省略

  2. // 通知

  3. pushRequest.setPushType("NOTICE");

  4. // 标题

  5. pushRequest.setTitle(dateFormat.format(**new** Date()));

  6. // 内容

  7. pushRequest.setBody("PushRequest body");

  8. // 额外参数

  9. pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");

  10. // 设置辅助弹窗打开Activity

  11. pushRequest.setAndroidPopupActivity("*****");

  12. // 设置辅助弹窗通知标题

  13. pushRequest.setAndroidPopupTitle("*****");

  14. // 设置辅助弹窗通知内容

  15. pushRequest.setAndroidPopupBody("*****");

7.3 场景解析

以下几种普通推送结合辅助弹窗推送的场景,帮助您快速理解辅助弹窗功能的配置。

客户端配置

客户端有Main、Second两个Activity,MainActivity为App打开主页面,SecondActivity extends AndroidPopupActivity;

  • 普通通知回调配置:
  1. **public** **class** MyMessageReceiver **extends** MessageReceiver {

  2. /**

  3. * 推送通知的回调方法

  4. * @param context

  5. * @param title

  6. * @param summary

  7. * @param extraMap

  8. */

  9. @Override

  10. **public** **void** onNotification(Context context, String title, String summary, Map<String, String> extraMap) {

  11. Log.d(TAG, "Receive notification, title: " + title + ", content: " + summary + ", extraMap: " + extraMap);

  12. }

  13. }

  • MainActivity定义:
  1. **package** com.alibaba.push.testdemo;

  2. **public** **class** MainActivity **extends** Activity {

  3. @Override

  4. **protected** **void** onCreate(Bundle savedInstanceState) {

  5. Log.d(TAG, "Main");

  6. }

  7. }

  • SecondActivity定义:
  1. **package** com.alibaba.push.testdemo;

  2. **import** com.alibaba.sdk.android.push.AndroidPopupActivity;

  3. **public** **class** SecondActivity **extends** AndroidPopupActivity {

  4. /**

  5. * 辅助弹窗指定打开Activity回调

  6. * @param title 标题

  7. * @param content 内容

  8. * @param extraMap 额外参数

  9. */

  10. @Override

  11. **protected** **void** onSysNoticeOpened(String title, String content, Map<String, String> extraMap) {

  12. Log.d(TAG, "Receive XiaoMi notification, title: " + title + ", content: " + content + ", extraMap: " + extraMap);

  13. }

  14. }

场景1:普通推送打开App + 辅助弹窗

服务端配置如下:

  1. PushRequest pushRequest = **new** PushRequest();

  2. // 其余设置省略

  3. // 通知

  4. pushRequest.setPushType("NOTICE");

  5. // 标题

  6. pushRequest.setTitle("hello");

  7. // 内容

  8. pushRequest.setBody("PushRequest body");

  9. // 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转

  10. pushRequest.setAndroidOpenType("APPLICATION");

  11. // 设置辅助弹窗打开Activity

  12. pushRequest.setAndroidPopupActivity("com.alibaba.push.testdemo.SecondActivity");

  13. // 设置辅助弹窗通知标题

  14. pushRequest.setAndroidPopupTitle("hello2");

  15. // 设置辅助弹窗通知内容

  16. pushRequest.setAndroidPopupBody("PushRequest body2");

  17. // 设定android类型设备通知的扩展属性

  18. pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");

推送结果:

  • 非小米、华为等厂商通道设备和在线设备

  • 收到普通推送通道弹出的通知,点击后打开App,进入首页MainActivity,如果设备在前台,保持当前界面不变;

  • onNotification()回调输出Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}

  • 清理进程后的小米、华为等厂商通道设备

  • 辅助弹窗通道弹出通知,点击后跳转到SecondActivity

  • onSysNoticeOpened()回调输出Receive XiaoMi notification, title: hello2, content: PushRequest body2, extraMap: {k1=android, k2=v2}

场景2:普通推送打开Activity + 辅助弹窗

服务端配置如下:

  1. PushRequest pushRequest = **new** PushRequest();

  2. // 其余设置省略

  3. // 通知

  4. pushRequest.setPushType("NOTICE");

  5. // 标题

  6. pushRequest.setTitle("hello");

  7. // 内容

  8. pushRequest.setBody("PushRequest body");

  9. // 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转

  10. pushRequest.setAndroidOpenType("ACTIVITY");

  11. // 指定普通推送要打开的Activity

  12. pushRequest.setAndroidActivity("com.alibaba.push.testdemo.SecondActivity");

  13. // 设置辅助弹窗打开Activity

  14. pushRequest.setAndroidPopupActivity("com.alibaba.push.testdemo.SecondActivity");

  15. // 设置辅助弹窗通知标题

  16. pushRequest.setAndroidPopupTitle("hello2");

  17. // 设置辅助弹窗通知内容

  18. pushRequest.setAndroidPopupBody("PushRequest body2");

  19. // 设定android类型设备通知的扩展属性

  20. pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");

推送结果:

  • 非小米、华为等厂商通道设备和在线设备

  • 收到普通推送通道弹出的通知,点击后跳转到SecondActivity

  • onNotification()回调输出Receive notification, title: hello, content: PushRequest body, extraMap: {k1=android, k2=v2}

  • 清理进程后的小米、华为等厂商通道设备

  • 辅助弹窗通道弹出通知,点击后跳转到SecondActivity

  • onSysNoticeOpened()回调输出Receive XiaoMi notification, title: hello2, content: PushRequest body2, extraMap: {k1=android, k2=v2}

其它坑说明:

阿里文档地址:https://help.aliyun.com/knowledge_detail/57105.html

https://emas.console.aliyun.com/?spm=5176.13194971.0.0.4ff3cb3coyVKHq#/product/3619196/push/25233908/2

服务端需要配置通知chinalId

1.华为地址:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/android-intelligent-classification-0000001050040120-V5?spm=a2c4g.11186623.2.26.779f708fmtlOup  通知chinalId =HIGH

2.VIVO https://dev.vivo.com.cn/documentCenter/doc/359?spm=a2c4g.11186623.2.25.779f708fmtlOup   VIVO通知chinalId =1

3.小米 通知chinalId =pre54

4.OPPO  通道id=1

PopupPushActivity(接收辅助通道的act) 在xml里面一定要设置,这个包名路径要传给后台,后台也得设置一下

1.json文件,这个我们直接在阿里云的应用配置里面下载就可以了(有个下载配置文件)

2.动态形式来获取需要配置的参数

//阿里推送动态注册AppKey,AppSecret

if (BuildConfig.APPLICATION_ID.equals(“xxxxxx”)) {

mPushService.register(applicationContext, “xxxxxx”, “xxxxxxx”, mPushRegisterCallback);

}

else if (BuildConfig.APPLICATION_ID.equals(“com.xxxxxx.xxx.debug”)) {

mPushService.register(applicationContext, “xxxx”, “xxxx”, mPushRegisterCallback);

}

//动态获取华为和vivo的值

ApplicationInfo appInfo = null;

// String value=null;

try {

appInfo = mContext.getPackageManager().getApplicationInfo(

mContext.getPackageName(), PackageManager.GET_META_DATA);

// appInfo.metaData.putString(“com.huawei.hms.client.appid”, “appid=xxxxx”);

// value = appInfo.metaData.getString(“com.huawei.hms.client.appid”);

} catch (PackageManager.NameNotFoundException e) {

e.printStackTrace();

}

//辅助通道动态注册

if (BuildConfig.APPLICATION_ID.equals(“com.xxxxx”)) {

//小米

MiPushRegister.register(applicationContext, “xx”, “xx”);

//魅族

MeizuRegister.register(applicationContext, “xx”, “xx”);

//oppo

OppoRegister.register(applicationContext, “xx”,

“xx”);

//vivo

appInfo.metaData.putString(“com.vivo.push.api_key”, “xx”);

appInfo.metaData.putString(“com.vivo.push.app_id”, “xx”);

//华为

appInfo.metaData.putString(“com.huawei.hms.client.appid”, “appid=xx”);

} else if (BuildConfig.APPLICATION_ID.equals(“com.xxxx.xxxx”)) {

//小米

MiPushRegister.register(applicationContext, “xxxx”, “xxxxxx”);

//魅族

MeizuRegister.register(applicationContext, “xxxxx”, “xxxx”);

//oppo

OppoRegister.register(applicationContext, “xxxx”,

“xxxxx”);

//vivo

appInfo.metaData.putString(“com.vivo.push.api_key”, “xxxx”);

appInfo.metaData.putString(“com.vivo.push.app_id”, “xxxxx”);

//华为

appInfo.metaData.putString(“com.huawei.hms.client.appid”, “appid=xxxxx”);

}

3.各种机型的小坑

说明:一定要在各大平台注册,将应用加入

1.0PPO

oppo阿里AppKey 对应的是key,但是MasterSecret 对应的是oppo平台的appserversecret ,不是appsecret,切记,在APPlication里面填写的是appsecret,OPPO有时候会接收不到消息,请打开设置,在进入应用管理,找到当前的应用,强制停止,这样就离线了,在辅助通道推送就有通知了

还必须配置下面的内容

2.Xiaomi

Android 8+适配

自Android 8.0(API Level 26)起,Android推出了NotificationChannel机制,旨在对通知进行分类管理。如果用户App的targetSdkVersion大于等于26,且并未设置NotificaitonChannel,那么创建的通知是不会弹出显示。

如何做好面试突击,规划学习方向?

面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。

学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。

同时我还搜集整理2020年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节

image

在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多。

image

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。

学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。

同时我还搜集整理2020年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节

[外链图片转存中…(img-I06SeqRO-1713689943858)]

在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多。

[外链图片转存中…(img-YW3hvgRz-1713689943858)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-zK9gjz71-1713689943859)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值