Android 推送點(diǎn)擊跳轉(zhuǎn)與華為推送神坑

????實(shí)現(xiàn)Android推送功能,選擇了接入華為推送和小米推送班挖,結(jié)果步入了華為推送的一個神坑??鲁捏,需求其實(shí)很簡單,就是服務(wù)器發(fā)個消息萧芙,客戶端收到后顯示给梅,用戶點(diǎn)擊跳轉(zhuǎn)到對應(yīng)界面,應(yīng)用未啟動則啟動應(yīng)用跳轉(zhuǎn)到對應(yīng)界面

需求有了双揪,開始實(shí)現(xiàn)吧动羽,因?yàn)槠胀ㄏ⒑笈_是調(diào)用的華為和小米平臺的普通應(yīng)用,所有通知欄的彈框華為和小米的SDK已經(jīng)集成好渔期,會根據(jù)后臺給的字段彈出运吓,需要處理的只是通知的點(diǎn)擊事件渴邦,這部分其實(shí)很簡單,點(diǎn)擊通知后先跳轉(zhuǎn)到首頁拘哨,再根據(jù)傳遞過去的數(shù)據(jù)跳轉(zhuǎn)到詳情頁谋梭,因?yàn)橛脩艨赡墚?dāng)前停留在首頁,所有首頁activity的lauchModel要設(shè)置成為singletask,不了解singletask的可以去看看activity的四種啟動方式倦青,singletask啟動為如果棧內(nèi)有activity實(shí)例瓮床,則不重新創(chuàng)建而走onNewIntent方法,并把棧中activity之上的其他activity全部清退(劃重點(diǎn))姨夹,跳轉(zhuǎn)代碼:

Intent intent = new Intent();

intent.setClass(context,MainActivity.class);

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);//創(chuàng)建新的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">

這樣纤垂,點(diǎn)擊推送會挑戰(zhàn)到主頁,然后再在mainactivity的 oncreate和onnewintent中根據(jù)傳遞的是數(shù)據(jù)是否未空來判斷是否需要跳轉(zhuǎn)到下一個頁面

protected voidonCreate(@NullableBundlesavedInstanceState) {

????super.onCreate(savedInstanceState);

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

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

????????????????NotificationUtil.notifyToNewsDetails(model,mContext);//跳轉(zhuǎn)到對應(yīng)Activity

????????}

}

@Override

protected voidonNewIntent(Intentintent) {

????super.onNewIntent(intent);

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

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

????????NotificationUtil.notifyToNewsDetails(model,mContext);//跳轉(zhuǎn)到對應(yīng)Activity

????}

}

如果應(yīng)用處于未啟動則走onCreate磷账,處于啟動則走onNewIntent,這樣就實(shí)現(xiàn)了推送點(diǎn)擊跳轉(zhuǎn)到對應(yīng)頁面峭沦。

寫好了,開始測試逃糟,小米沒問題吼鱼,按照流程跳轉(zhuǎn),然后開始測試華為绰咽,點(diǎn)擊通知菇肃,跳轉(zhuǎn)到首頁,跳轉(zhuǎn)到對應(yīng)界面取募,木有問題琐谤,哎,等等玩敏,怎么 對應(yīng)的頁面自己關(guān)閉了斗忌?什么情況?為毛對應(yīng)的界面會關(guān)閉旺聚?發(fā)生了什么织阳?what ?

為什么小米可以華為會自己關(guān)閉頁面?哪里錯了砰粹?檢查代碼唧躲,沒問題啊然后再測試一遍,發(fā)現(xiàn)華為推送跳轉(zhuǎn)到了啟動頁碱璃,而小米沒有弄痹,怎么辦呢,看官方文檔嵌器,發(fā)現(xiàn)華為推送有三種推送模式:富媒體界酒,打開網(wǎng)頁,打開應(yīng)用嘴秸,而后臺發(fā)的普通通知的點(diǎn)擊事件是打開應(yīng)用毁欣,而小米的點(diǎn)擊事件是交給應(yīng)用去操作

然后我們打印華為推送點(diǎn)擊后各個activity的生命周期(啟動頁SplashActivity,主頁MainActivity,目標(biāo)頁TestActivity),華為推送的日志為

MainActivity:onNewIntent

TestActivity:onCreate

SplashActivity:onCreate

SplashActivity:onDestroy

MainActivity:onCreate

TestActivity:onDestroy

what?TestActivity為什么會走到onDestroy?why?

為什么小米沒問題呢庇谆?檢查代碼,我們看到了MainActivity的lauchMode是singleTask凭疮,這樣就說的通了饭耳,華為通知點(diǎn)擊后activity的啟動順序是 MainActivity →SplashActivity→TestActivity→MainActivity

而小米的是MainActivity→TestActivity

為什么會不一樣呢?因?yàn)槿A為的推送點(diǎn)擊自帶了啟動應(yīng)用??执解,而不帶啟動應(yīng)用只能走透傳寞肖,而小米可以交給客戶端自己去處理,看文檔衰腌,華為只提供3中推送方式新蟆,普通通知并不能讓客戶端自己處理點(diǎn)擊事件,必須啟動應(yīng)用??右蕊,想不通為什么華為要這么干

而我們之前說了琼稻,singelTask的Activity會把a(bǔ)ctivity棧中在它之上的所有activity清棧,所以我們的目標(biāo)Activity就走到了onDestroy,原因找到,怎么解決呢饶囚?本著自己解決不去改后臺的原因帕翻,我們來自己解決

我們看到,因?yàn)槿A為多啟動了一次應(yīng)用萝风,所有棧內(nèi)的activitiy變成了這樣




而在SplashActivity中嘀掸,因?yàn)闀舆t跳轉(zhuǎn)MainActivity,所以當(dāng)MainActivity再次加入棧中時,會把MainActivity之上的Activity全部清退规惰,這樣就造成了TestActivity自動銷毀睬塌,如何解決呢?

我們可以把SplashActivity也設(shè)置為SingleTask歇万,并且在從SplashActivity跳轉(zhuǎn)到首頁的時候不去銷毀它衫仑,在MainActivity的onDestroy中去銷毀棧內(nèi)所有Activity,這樣點(diǎn)擊華為推送后啟動順序?yàn)椋簡覯ainActiviy,啟動SplahsActivity,因?yàn)镾plashActivity已經(jīng)在棧內(nèi)堕花,所有要清退在它上面的所有Activity,然后MainActivity唄銷毀,之后重新創(chuàng)建MainActivity,跳轉(zhuǎn)到TestActivity

日志為這樣:

MainActivity:onNewIntent

SplashActivity:onNewIntent

MainActivity:onDestroy

MainActivity:onCreate

TestActivity:onCreate

這個時候的Activity棧:




而在SplashActivity中粥鞋,如果MainActivity被啟動而SplashActivity中的延遲加載未加載完缘挽,則要去掉SplashActivity中的延遲加載,這樣就解決了華為推送啟動應(yīng)用后跳轉(zhuǎn)到指定頁面的問題呻粹,當(dāng)然最簡單的還是直接使用透傳而不用華為提供的推送

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末壕曼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子等浊,更是在濱河造成了極大的恐慌腮郊,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筹燕,死亡現(xiàn)場離奇詭異轧飞,居然都是意外死亡衅鹿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門过咬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來大渤,“玉大人,你說我怎么就攤上這事掸绞”萌” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵衔掸,是天一觀的道長烫幕。 經(jīng)常有香客問我,道長敞映,這世上最難降的妖魔是什么较曼? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮驱显,結(jié)果婚禮上诗芜,老公的妹妹穿的比我還像新娘。我一直安慰自己埃疫,他們只是感情好伏恐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著栓霜,像睡著了一般翠桦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胳蛮,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天销凑,我揣著相機(jī)與錄音,去河邊找鬼仅炊。 笑死斗幼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抚垄。 我是一名探鬼主播蜕窿,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呆馁!你這毒婦竟也來了桐经?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤浙滤,失蹤者是張志新(化名)和其女友劉穎阴挣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纺腊,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡畔咧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年茎芭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盒卸。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡骗爆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔽介,到底是詐尸還是另有隱情摘投,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布虹蓄,位于F島的核電站犀呼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏薇组。R本人自食惡果不足惜外臂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望律胀。 院中可真熱鬧宋光,春花似錦、人聲如沸炭菌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽黑低。三九已至赘艳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間克握,已是汗流浹背蕾管。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留菩暗,地道東北人掰曾。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像停团,于是被迫代替她去往敵國和親旷坦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容