- 在OPPO开放平台 注册OPPO企业开发者账号,添加应用并开通oppo推送服务,目前应用需满足:1.在oppo市场上架,2.评级为A,才能使用推送服务,具体政策可咨询oppo客服,最终以oppo要求为准。同样需要在控制台
应用配置
设置你的OppoAppkey和OppoMasterSecret。
-
在 VIVO开放平台 注册账号及创建应用(注:vivo需要企业开发者账号),审核通过后,能够得到应用的AppID、AppKey和AppSecret。在控制台
应用配置
中设置你的VIVO应用AppID、AppKey以及AppSecret。 -
在 Flyme 开放平台 注册账号及创建应用,审核通过后,能够得到应用的AppID和AppSecret。在控制台
应用配置
中设置你的应用AppID和AppSecret,同时一定要在Flyme控制台上设置回执地址为:http://agoo-ack.m.taobao.com/mz/ 及 https://agoo-ack.m.taobao.com/mz/ ,否则可能会收不到推送消息。
3.1 手动集成
建议使用maven集成。
将辅助通道扩展包下载解压后拷贝到你项目的Lib目录下,下载地址。如果使用辅助通道扩展包v3.2.0及以上版本,需要将推送SDK升级到v3.2.0及以上版本。新版辅助通道扩展包以aar形式透出,省却manifest文件配置,减少出错概率。
将辅助通道扩展包放置到app module的libs路径下,并在app module的build.gradle文件中添加如下配置:
-
repositories {
-
flatDir {
-
dirs 'libs' //this way we can find the .aar file in libs folder
-
}
-
}
-
...
-
dependencies {
-
......
-
compile(name: 'alicloud-android-third-push-3.1.0', ext: 'aar')
-
}
3.2 Maven集成
- 项目顶层build.gradle中添加Maven仓库地址:
-
allprojects {
-
repositories {
-
maven {
-
url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
-
}
-
}
-
}
- gradle添加依赖:
-
dependencies {
-
compile 'com.aliyun.ams:alicloud-android-third-push:3.2.0'
-
}
OPPO、魅族、VIVO 通道 需使用 v3.0.10 或以上版本,另外每个平台对应用接入的要求不同,请查看各平台官网说明。
注意:如果只添加alicloud-android-third-push,而不添加华为通道依赖时,会报错找不到一些文件和值,比如@string/error_over_original_size @string/error_over_original_count @style/upsdkDlDialog,如要使用华为通道,请看下文华为依赖,添加上即可,如不使用通道,您自行写上这些值即可。
3.3 Firebase依赖
如需配置GCM/GCM通道还需要添加Firebase SDK依赖:
-
dependencies {
-
......
-
compile ('com.google.firebase:firebase-messaging:17.6.0')
-
}
3.4 Huawei依赖
如需配置华为通道还需要添加华为推送SDK依赖:
-
dependencies {
-
......
-
compile 'com.aliyun.ams:huawei-push:2.6.3.305'
-
compile 'com.aliyun.ams:huawei-push-base:2.6.3.305'
-
}
同时在AndroidManifest文件中添加如下配置:
-
<meta-data
-
android:name="com.huawei.hms.client.appid"
-
android:value="appid=华为开放平台申请的ID信息" />
3.5 魅族依赖
如需配置魅族通道还需要添加魅族推送SDK依赖:
-
dependencies {
-
......
-
compile 'com.aliyun.ams:meizu-push:3.8.7.1'
-
}
3.6 VIVO依赖
如需配置VIVO通道还需要添加VIVO推送SDK依赖:
-
dependencies {
-
......
-
compile 'com.aliyun.ams:third_vivopush:2.9.0.1'
-
}
在AndroidManifest文件中添加如下配置:
-
<meta-data
-
android:name="com.vivo.push.api_key"
-
android:value="请填写vivo平台上注册应用的appKey" />
-
<meta-data
-
android:name="com.vivo.push.app_id"
-
android:value="请填写vivo平台上注册应用的appID" />
- 如果集成推送SDK的工程开启代码混淆,在Proguard配置的基础上,需要添加以下辅助通道的Proguard配置。
-
# 小米通道
-
-keep **class** com.xiaomi.** {*;}
-
-dontwarn com.xiaomi.**
-
# 华为通道
-
-keep **class** com.huawei.** {*;}
-
-dontwarn com.huawei.**
-
# GCM/FCM通道
-
-keep **class** com.google.firebase.**{*;}
-
-dontwarn com.google.firebase.**
-
# OPPO通道
-
-keep **public** **class** * **extends** android.app.Service
-
# VIVO通道
-
-keep **class** com.vivo.** {*;}
-
-dontwarn com.vivo.**
-
# 魅族通道
-
-keep **class** com.meizu.cloud.** {*;}
-
-dontwarn com.meizu.cloud.**
将以下代码加入你application.onCreate()方法中初始通道。注意:辅助通道注册务必在Application中执行且放在推送SDK初始化代码之后,否则可能导致辅助通道注册失败
-
// 注册方法会自动判断是否支持小米系统推送,如不支持会跳过注册。
-
MiPushRegister.**register**(applicationContext, "小米AppID", "小米AppKey");
-
// 注册方法会自动判断是否支持华为系统推送,如不支持会跳过注册。
-
HuaWeiRegister.**register**(application);
-
//GCM/FCM辅助通道注册
-
GcmRegister.**register**(**this**, sendId, applicationId); //sendId/applicationId为步骤获得的参数
-
// OPPO通道注册
-
OppoRegister.**register**(applicationContext, appKey, appSecret); // appKey/appSecret在OPPO开发者平台获取
-
// 魅族通道注册
-
MeizuRegister.**register**(applicationContext, "appId", "appkey"); // appId/appkey在魅族开发者平台获取
-
// VIVO通道注册
-
VivoRegister.**register**(applicationContext);
本方法会自动判断是否支持小米系统推送,如不支持会跳过注册。
华为通道初始化成功,可以看到以下日志:(如不成功,检查是否在华为控制台配置SHA256指纹证书,目前华为需要配置)
GCM/FCM通道初始化成功,可以看到以下日志:
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:****
相关日志, 否则检查参数是否正确填入;
收到小米通道下行的消息:(需要将sdk日志等级设置到DEBUG)
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通道下发的消息:
05-19 19:20:04.900 19153-20391/com.alibaba.push2 D/MPS:GcmRegister: onReceiveMessage payload msg:[......]
若小米通道注册失败(未看到小米注册成功日志),请查看系统日志(logcat设置NoFilters),以PushService|BroadcastQueue
为正则式进行过滤,示例如下图:
注1:如果控制台配置了小米/华为
的信息,app需要加对应的jar包依赖,不然会有crash的风险。
客户端接入完毕,服务端推送时如果设备无法收到推送,可先查看 移动推送Android SDK:Android辅助通道和弹窗排查步骤
-
当前部分国产品牌设备管控严格,接入推送功能的App进程在后台被清理后,收不到推送通知;接入辅助弹窗后,可以借助对应品牌的系统通道,保证App后台被清理后,仍能收到推送通知;
-
当前辅助弹窗已接入小米、华为、OPPO、VIVO、魅族(小米辅助弹窗:
v2.3.0及以上支持
;华为辅助弹窗:v3.0.8及以上支持
;OPPO辅助弹窗:v3.1.4及以上支持
); -
当前华为辅助弹窗仅支持Emotion UI(华为定制ROM)4.1级以上版本的设备;
7.1 客户端
-
该功能的使用需要接入推送辅助通道,确保使用
最新
的辅助通道扩展包,具体参考上文; -
辅助弹窗送达的通知展示效果,和普通通知相同;
-
服务端指定辅助弹窗通道推送时,一定要指定通知点击后要打开的Activity,该Activity需继承自抽象类
AndroidPopupActivity
(MiPushSystemNotificationActivity
已废弃,小米、华为、OPPO等厂商通道弹窗统一继承AndroidPopupActivity
),否则无法获取到通知的相关信息,并且会影响通知到达率的统计; -
AndroidPopupActivity
中提供抽象方法onSysNoticeOpened()
,实现该方法后可获取到辅助弹窗通知的标题
、内容
和额外参数
,在通知点击时触发,原本的通知回调onNotification()
和onNotificationOpened()
不适用于辅助弹窗; -
指定打开的托管弹窗Activity在AndroidManifest.xml中注册时需要声明属性:
android:exported=true
-
接入如下所示:
-
**import** com.alibaba.sdk.android.push.AndroidPopupActivity;
-
**public** **class** PopupPushActivity **extends** AndroidPopupActivity {
-
**static** **final** String TAG = "PopupPushActivity";
-
@Override
-
**protected** **void** onCreate(Bundle savedInstanceState) {
-
**super**.onCreate(savedInstanceState);
-
}
-
/**
-
* 实现通知打开回调方法,获取通知相关信息
-
* @param title 标题
-
* @param summary 内容
-
* @param extMap 额外参数
-
*/
-
@Override
-
**protected** **void** onSysNoticeOpened(String title, String summary, Map<String, String> extMap) {
-
Log.d("OnMiPushSysNoticeOpened, title: " + title + ", content: " + summary + ", extMap: " + extMap);
-
}
-
}
7.2 服务端
-
OpenAPI 2.0的推送高级接口提供了
AndroidPopupActivity
、AndroidPopupTitle
和AndroidPopupBody
三个参数,分别用于设置辅助弹窗通知打开时跳转的Activity、通知标题以及通知内容(注意:StoreOffline
参数也需要设置为true); -
辅助弹窗仅对后台进程被清理的小米/华为/VIVO/OPPO/魅族 设备生效,对非接入厂商通道设备和在线的设备不生效;
-
当辅助弹窗生效时,推送接口的
Title
、Body
、AndroidActivity
以及额外参数设置中的功能性设置(如声音、震动等)都不起作用; -
PushRequest pushRequest = **new** PushRequest();
-
// 其余设置省略
-
// 通知
-
pushRequest.setPushType("NOTICE");
-
// 标题
-
pushRequest.setTitle(dateFormat.format(**new** Date()));
-
// 内容
-
pushRequest.setBody("PushRequest body");
-
// 额外参数
-
pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");
-
// 设置辅助弹窗打开Activity
-
pushRequest.setAndroidPopupActivity("*****");
-
// 设置辅助弹窗通知标题
-
pushRequest.setAndroidPopupTitle("*****");
-
// 设置辅助弹窗通知内容
-
pushRequest.setAndroidPopupBody("*****");
7.3 场景解析
以下几种普通推送结合辅助弹窗推送的场景,帮助您快速理解辅助弹窗功能的配置。
客户端有Main、Second两个Activity,MainActivity为App打开主页面,SecondActivity extends AndroidPopupActivity;
- 普通通知回调配置:
-
**public** **class** MyMessageReceiver **extends** MessageReceiver {
-
/**
-
* 推送通知的回调方法
-
* @param context
-
* @param title
-
* @param summary
-
* @param extraMap
-
*/
-
@Override
-
**public** **void** onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
-
Log.d(TAG, "Receive notification, title: " + title + ", content: " + summary + ", extraMap: " + extraMap);
-
}
-
}
- MainActivity定义:
-
**package** com.alibaba.push.testdemo;
-
**public** **class** MainActivity **extends** Activity {
-
@Override
-
**protected** **void** onCreate(Bundle savedInstanceState) {
-
Log.d(TAG, "Main");
-
}
-
}
- SecondActivity定义:
-
**package** com.alibaba.push.testdemo;
-
**import** com.alibaba.sdk.android.push.AndroidPopupActivity;
-
**public** **class** SecondActivity **extends** AndroidPopupActivity {
-
/**
-
* 辅助弹窗指定打开Activity回调
-
* @param title 标题
-
* @param content 内容
-
* @param extraMap 额外参数
-
*/
-
@Override
-
**protected** **void** onSysNoticeOpened(String title, String content, Map<String, String> extraMap) {
-
Log.d(TAG, "Receive XiaoMi notification, title: " + title + ", content: " + content + ", extraMap: " + extraMap);
-
}
-
}
场景1:普通推送打开App + 辅助弹窗
服务端配置如下:
-
PushRequest pushRequest = **new** PushRequest();
-
// 其余设置省略
-
// 通知
-
pushRequest.setPushType("NOTICE");
-
// 标题
-
pushRequest.setTitle("hello");
-
// 内容
-
pushRequest.setBody("PushRequest body");
-
// 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转
-
pushRequest.setAndroidOpenType("APPLICATION");
-
// 设置辅助弹窗打开Activity
-
pushRequest.setAndroidPopupActivity("com.alibaba.push.testdemo.SecondActivity");
-
// 设置辅助弹窗通知标题
-
pushRequest.setAndroidPopupTitle("hello2");
-
// 设置辅助弹窗通知内容
-
pushRequest.setAndroidPopupBody("PushRequest body2");
-
// 设定android类型设备通知的扩展属性
-
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 + 辅助弹窗
服务端配置如下:
-
PushRequest pushRequest = **new** PushRequest();
-
// 其余设置省略
-
// 通知
-
pushRequest.setPushType("NOTICE");
-
// 标题
-
pushRequest.setTitle("hello");
-
// 内容
-
pushRequest.setBody("PushRequest body");
-
// 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转
-
pushRequest.setAndroidOpenType("ACTIVITY");
-
// 指定普通推送要打开的Activity
-
pushRequest.setAndroidActivity("com.alibaba.push.testdemo.SecondActivity");
-
// 设置辅助弹窗打开Activity
-
pushRequest.setAndroidPopupActivity("com.alibaba.push.testdemo.SecondActivity");
-
// 设置辅助弹窗通知标题
-
pushRequest.setAndroidPopupTitle("hello2");
-
// 设置辅助弹窗通知内容
-
pushRequest.setAndroidPopupBody("PushRequest body2");
-
// 设定android类型设备通知的扩展属性
-
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
服务端需要配置通知chinalId
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/12afdfd7ba149de9c00caf8e47131573.jpeg)
最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
上面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。
【Android思维脑图(技能树)】
知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。
【Android高级架构视频学习资源】
**Android部分精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
roid)**
![](https://i-blog.csdnimg.cn/blog_migrate/12afdfd7ba149de9c00caf8e47131573.jpeg)
最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
上面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。
【Android思维脑图(技能树)】
知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。
[外链图片转存中…(img-gR0lB3E1-1712536129634)]
【Android高级架构视频学习资源】
**Android部分精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!