前提:产品投放于国外市场,投放于Google Paly,开发在国内。运营只需要在小米控制台进行小米推送,不需要服务器配合。
遇到问题:
①(一开始对接问题) 一直不展示通知消息
② 在通知栏只展示一条通知信息
③ 小米推送部分手机不展示,部分手机展示
④ 在接收消息的广播里设置打开新界面,发现没有作用
⑤ 探究小米推送,在彻底关闭应用后,小手机接收到通知栏消息后是否激活了APP
解答:
① 对于第一个问题,基本是自己没有按照文档里的介绍,一步一步的写下去,比如 :
(1)在build.gradle中applicationId没改
(2) AndroidManifest.xml文件中permission和receiver没有按照对应的包名修改
② 小米在管理控制台,创建推送消息时
通知类别 没有添加,我们都知道,自定义通知栏是 notificationId如果不设置,消息就会覆盖之前的,这个功能是一样的。不填写一直就是同一个。
在这里说一下个人对通知栏消息和透传消息的理解,
通知栏消息:如果服务器不修改,当客户端收到消息时,通知栏是自动生成的,客户端是不能自定义通知了的。而自定义设置和展示多个通知栏效果是由服务器控制的,详情请看服务器java SDK ,有关于展示多个通知栏和自定义通知栏的介绍
透传消息:
通过测试效果看是小米广播的
onNotificationMessageArrived()
onNotificationMessageArrived()方法接收到控制台的消息后,不会展示通知栏信息,只能通过客户端自己自定义通知栏。
③ 部分手机收不到消息,这个真的让我浪费了好长时间,联系客服,发邮件,加QQ群,都没有解决,好像小米推送对于客服这块真的没有极光推送做的好,基本联系不上人。
原因 因为我们公司的产品投放到国外市场,所以有部分测试机是国外买回来的,也有一部分是国产的,在demo测试时我用的中文推送运营平台发送的通知,只有国内手机可以接收到,国外手机是接收不到的,在连接外网,当语言设置成英文,再次推送是只有国外购置的手机可以接收推送消息,国内手机反而收不到了,真是神奇了。
④ 这个就是我个人技术不到家了
我们在 广播BroadcastReceiver或者服务里设置Intent 跳转
不能直接简单的 start 一个 new 出来的 Activity
需要设置 setFlags 同时还要兼顾跳转出新的Activity后能够在返回时不会返回到原来的界面。因此需要如下设计:
Intent intent = new Intent(context, MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);
同时在AndroidManifest.xml 中的MainActivity类中设置启动模式:android:launchMode=“singleTask”
动态设置了之后静态的设置就不执行了
如此的话我们就可以在MainActivity下
@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);// 执行新数据操作}
稍微介绍下android 的四种启动模式,巩固一下知识:
- Standard 标准模式 默认情况下就是这个,不setFlags就一直的创建新的实例入栈 <<A-B-C 创建A activity后 A-B-C-A>>
- SingleTop 栈顶复用模式 ①如果跳转的Activity已存在,并在栈顶,启动模式为SingleTop 模式,则直接复用,onCreate、onStart不会被系统调用,会调用新的方法 onNewIntent,在这里可以进行一系列操作在<<A-B-C C activity里再创建C activity A-B-C>> ② 如果跳转的Activity已存在,但不在栈顶,启动模式为SingleTop 模式,会又一次创建一个新的Activity入栈,同Standard模式一样 <<A-B-C C activity里再创建a activity A-B-C -A >>
- SingleTask 栈内复用模式 若须要创建的Activity已经处
于栈中时,此时不会创建新的Activity,而是将存在栈中的Activity上面的其他Activity所有销毁,使它成为栈顶。
①如果跳转的Activity已存在,并在栈顶,启动模式为SingleTask 模式,直接用栈顶的C 的activity <<A-B-C C activity里再创建C activity A-B-C>>
② 如果跳转的Activity已存在,但不在栈顶,启动模式为SingleTask 模式,则会跳转到指定的Activity,并把其上面的Activity都销毁 <<D activity里再创建B activity A-B-C-D 变为 A-B >> - SingleInstance 单实例模式 具有此模式的Activity仅仅能单独位于一个任务栈中,例如 – A Activity是该模式,启动A后。系统会为它创建一个单独的任务栈,由于栈内复用的特性。兴许的请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁。
上面的结果里有setFlags(),我们或许还见过 addFlags(),到底setFlags()和addFlags()有什么区别,如何使用么?
两个方法的区别是
setflag是直接给intent设置新的flag,
addflag是在已有flag上添加新的flag
稍微介绍下 onNewIntent(Intent intent)方法
当我们在activity的启动模式中设置为栈内唯一时,也就是android:launchMode=”singleTask”或android:launchMode=”signleTop”时,会用到这个方法。
比如说在一个应用中A activity 跳转至 B activity 在跳转至 C activity 然后C做了一定的操作之后再返回A 界面。这样在A activity的启动模式设置为singleTask后。C界面跳转至A界面时,就会去判断栈内是否有改Activity实例,如果有就直接执行A界面的onNewIntent()方法,我们就可以把逻辑处理放在改生命周期方法中,如果没有就会走Activity的oncrate方法去创建实例。在内存吃紧的情况下,系统可能会kill掉后台运行的 Activity ,如果不巧要启动的那个activity实例被系统kill了,那么系统就会调用 onCreate 方法,而不调用 onNewIntent 方法。
⑤ 经测试,在小米手机上,彻底杀死应用时,推送通知栏消息,在小米接收广播的onNotificationMessageArrived()方法中,没有查看到设置的log信息,只有在APP运行的情况下才能打印出log信息,推测通知栏信息的获取应该是类似系统级别的,不能通过发送通知消息来激活APP