Android 推送点击跳转与华为推送神坑

    实现Android推送功能,选择了接入华为推送和小米推送,结果步入了华为推送的一个神坑😂,需求其实很简单,就是服务器发个消息,客户端收到后显示,用户点击跳转到对应界面,应用未启动则启动应用跳转到对应界面

需求有了,开始实现吧,因为普通消息后台是调用的华为和小米平台的普通应用,所有通知栏的弹框华为和小米的SDK已经集成好,会根据后台给的字段弹出,需要处理的只是通知的点击事件,这部分其实很简单,点击通知后先跳转到首页,再根据传递过去的数据跳转到详情页,因为用户可能当前停留在首页,所有首页activity的lauchModel要设置成为singletask,不了解singletask的可以去看看activity的四种启动方式,singletask启动为如果栈内有activity实例,则不重新创建而走onNewIntent方法,并把栈中activity之上的其他activity全部清退(划重点),跳转代码:

Intent intent = new Intent();

intent.setClass(context,MainActivity.class);

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);//创建新的activity并清除栈顶activity

Bundle bundle = new Bundle();

bundle.putSerializable(NEWS_MODEL, data);

intent.putExtras(bundle);

context.startActivity(intent);

AndroidMainfest

<android:name=".ui.activity.MainActivity"

android:configChanges="keyboardHidden|orientation|screenSize|locale"

android:windowSoftInputMode="adjustResize|stateAlwaysHidden"

android:screenOrientation="portrait"

android:launchMode="singleTask"

android:theme="@style/AppTheme">

这样,点击推送会挑战到主页,然后再在mainactivity的 oncreate和onnewintent中根据传递的是数据是否未空来判断是否需要跳转到下一个页面

protected voidonCreate(@NullableBundlesavedInstanceState) {

    super.onCreate(savedInstanceState);

        if(getIntent().getExtras()!=null){

                model= (NewsDetailsModel)getIntent().getExtras().getSerializable(NEWS_MODEL);

                NotificationUtil.notifyToNewsDetails(model,mContext);//跳转到对应Activity

        }

}

@Override

protected voidonNewIntent(Intentintent) {

    super.onNewIntent(intent);

    if(intent.getExtras()!=null){

        model= (NewsDetailsModel)intent.getExtras().getSerializable(NEWS_MODEL);

        NotificationUtil.notifyToNewsDetails(model,mContext);//跳转到对应Activity

    }

}

如果应用处于未启动则走onCreate,处于启动则走onNewIntent,这样就实现了推送点击跳转到对应页面。

写好了,开始测试,小米没问题,按照流程跳转,然后开始测试华为,点击通知,跳转到首页,跳转到对应界面,木有问题,哎,等等,怎么 对应的页面自己关闭了?什么情况?为毛对应的界面会关闭?发生了什么?what ?

为什么小米可以华为会自己关闭页面?哪里错了?检查代码,没问题啊然后再测试一遍,发现华为推送跳转到了启动页,而小米没有,怎么办呢,看官方文档,发现华为推送有三种推送模式:富媒体,打开网页,打开应用,而后台发的普通通知的点击事件是打开应用,而小米的点击事件是交给应用去操作

然后我们打印华为推送点击后各个activity的生命周期(启动页SplashActivity,主页MainActivity,目标页TestActivity),华为推送的日志为

MainActivity:onNewIntent

TestActivity:onCreate

SplashActivity:onCreate

SplashActivity:onDestroy

MainActivity:onCreate

TestActivity:onDestroy

what?TestActivity为什么会走到onDestroy?why?

为什么小米没问题呢?检查代码,我们看到了MainActivity的lauchMode是singleTask,这样就说的通了,华为通知点击后activity的启动顺序是 MainActivity →SplashActivity→TestActivity→MainActivity

而小米的是MainActivity→TestActivity

为什么会不一样呢?因为华为的推送点击自带了启动应用🤣,而不带启动应用只能走透传,而小米可以交给客户端自己去处理,看文档,华为只提供3中推送方式,普通通知并不能让客户端自己处理点击事件,必须启动应用🤣,想不通为什么华为要这么干

而我们之前说了,singelTask的Activity会把activity栈中在它之上的所有activity清栈,所以我们的目标Activity就走到了onDestroy,原因找到,怎么解决呢?本着自己解决不去改后台的原因,我们来自己解决

我们看到,因为华为多启动了一次应用,所有栈内的activitiy变成了这样




而在SplashActivity中,因为会延迟跳转MainActivity,所以当MainActivity再次加入栈中时,会把MainActivity之上的Activity全部清退,这样就造成了TestActivity自动销毁,如何解决呢?

我们可以把SplashActivity也设置为SingleTask,并且在从SplashActivity跳转到首页的时候不去销毁它,在MainActivity的onDestroy中去销毁栈内所有Activity,这样点击华为推送后启动顺序为:启动MainActiviy,启动SplahsActivity,因为SplashActivity已经在栈内,所有要清退在它上面的所有Activity,然后MainActivity呗销毁,之后重新创建MainActivity,跳转到TestActivity

日志为这样:

MainActivity:onNewIntent

SplashActivity:onNewIntent

MainActivity:onDestroy

MainActivity:onCreate

TestActivity:onCreate

这个时候的Activity栈:




而在SplashActivity中,如果MainActivity被启动而SplashActivity中的延迟加载未加载完,则要去掉SplashActivity中的延迟加载,这样就解决了华为推送启动应用后跳转到指定页面的问题,当然最简单的还是直接使用透传而不用华为提供的推送

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容