關(guān)于Android中點(diǎn)擊通知欄的通知啟動(dòng)Activity問(wèn)題解決
前言
最近遇到一個(gè)很奇葩的問(wèn)題,終于解決了,所以想著記錄一下,方便大家或者自己以后有需要的時(shí)候可以參考學(xué)習(xí)。
問(wèn)題場(chǎng)景
用小米手機(jī)使用小米推送一條消息,然后點(diǎn)擊通知欄中的消息啟動(dòng)應(yīng)用,然后進(jìn)入會(huì)話的Activity。應(yīng)用啟動(dòng)后,如果當(dāng)前界面不是會(huì)話界面,那么新消息會(huì)在通知欄顯示消息提醒,然后點(diǎn)擊會(huì)話消息后卻進(jìn)不了會(huì)話的Activity,即點(diǎn)擊了通知欄通知后,系統(tǒng)都沒有啟動(dòng)指定Activity的意思,沒有看到系統(tǒng)啟動(dòng)Activity的Log,到是會(huì)看到系統(tǒng)處理這個(gè)Activity的影子。
這個(gè)指定的Activity不是會(huì)話的Activity,而是在AndroidManifest.xml文件中指定android.intent.category.LAUNCHER的Activity A。也就是說(shuō)有會(huì)話消息都是先從這個(gè)A開始,然后把數(shù)據(jù)往后面的Activity傳。
這里顯示通知有兩種方式,一種是由手機(jī)系統(tǒng)在通知欄彈出,比如小米手機(jī)上使用小米推送,華為手機(jī)上使用華為推送,另外一種是由應(yīng)用的遠(yuǎn)程進(jìn)程彈出。
啟動(dòng)應(yīng)用的第一個(gè)Activity A也有兩種方式,一種是直接通過(guò)new來(lái)構(gòu)造一個(gè)Intent,然后傳入Activity A的class;另外一種是通過(guò)context.getPackageManager().getLaunchIntentForPackage(context.getPackageName())來(lái)獲取啟動(dòng)的Activity A的Intent。然后調(diào)用PendingIntent.getActivity()方法,將得到的intent傳入。
那么問(wèn)題來(lái)了,如果是點(diǎn)擊系統(tǒng)彈出的通知欄或者遠(yuǎn)程進(jìn)程彈出的通知欄,如果只是使用其中一種啟動(dòng)方式啟動(dòng)應(yīng)用,那么在應(yīng)用啟動(dòng)后,點(diǎn)擊通知欄中由后臺(tái)遠(yuǎn)程進(jìn)程彈出的新消息通知,這個(gè)時(shí)候就不能進(jìn)入會(huì)話的Activity。從系統(tǒng)的日志來(lái)看,沒有啟動(dòng)Activity,只是對(duì)Activity做了處理。
可能有人會(huì)想到是不是要加一個(gè)Intent.FLAG_ACTIVITY_NEW_TASK標(biāo)識(shí),因?yàn)樵?code>getLaunchIntentForPackage()方法中加了這個(gè)標(biāo)識(shí)。
最后測(cè)試發(fā)現(xiàn),只要應(yīng)用沒有被啟動(dòng),不管是點(diǎn)擊系統(tǒng)彈出的通知欄還是遠(yuǎn)程進(jìn)程彈出的通知欄,如果再收到新消息通知,再點(diǎn)擊通知欄,就能進(jìn)入會(huì)話Activity了。那只要判斷應(yīng)用中是否有Activity被啟動(dòng)就OK了,貌似問(wèn)題可以解決了。
問(wèn)題解決
于是用了下面的邏輯來(lái)判斷是否有前臺(tái)Activity在運(yùn)行。
/**
* 判斷UI進(jìn)程是否正在運(yùn)行
* @return 返回true表示正在運(yùn)行,否則沒有運(yùn)行
*/
public static boolean isForegroundRunning() {
ActivityManager am = (ActivityManager) EimCloud.getContext().getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> list = am.getRunningAppProcesses();
if (list != null) {
for (ActivityManager.RunningAppProcessInfo info : list) {
if (info.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
&& EimCloud.getContext().getPackageName().equals(info.processName)) {
return true;
}
}
}
return false;
}
拓展
但是上面的方法在小米手機(jī)上湊效了,但在華為手機(jī)上還是有問(wèn)題,即使同樣的場(chǎng)景。華為又坑爹了!
于是開始從上面的ActivityManager.RunningAppProcessInfo類中的importance變量的狀態(tài)入手,然后測(cè)試各種場(chǎng)景可能出現(xiàn)的變量值,結(jié)果發(fā)現(xiàn)效果不盡人意,有些場(chǎng)景問(wèn)題依舊。
最后,又換種思路:不從Activity A開始啟動(dòng)應(yīng)用,換個(gè)Activity B,也就是在調(diào)用PendingIntent.getActivity()方法傳入Intent對(duì)象使用B的class。啟動(dòng)B會(huì)發(fā)現(xiàn)應(yīng)用沒有被初始化,則跳轉(zhuǎn)到A執(zhí)行初始化,然后再走正常流程。
再針對(duì)各種場(chǎng)景以及各種機(jī)型測(cè)試,發(fā)現(xiàn)問(wèn)題解決。從上面可以看出,雖然不懂背后原理,但解決問(wèn)題的思路一定要廣,特別是在急著發(fā)版本的時(shí)候,不要在一棵樹上吊死。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
- Android Fragment實(shí)現(xiàn)底部通知欄
- android實(shí)現(xiàn)常駐通知欄遇到的問(wèn)題及解決辦法
- Android通知欄前臺(tái)服務(wù)的實(shí)現(xiàn)
- Android App自動(dòng)更新之通知欄下載
- 適配Android 8.0版本更新安裝與通知欄的一些坑
- Android 下載文件通知欄顯示進(jìn)度條功能的實(shí)例代碼
- Android 8.0系統(tǒng)中通知欄的適配詳解
- Android 8.0系統(tǒng)中通知欄的適配微技巧
- Android開發(fā)實(shí)現(xiàn)判斷通知欄是否打開及前往設(shè)置頁(yè)面的方法
- Android 通知欄的使用方法
相關(guān)文章
Android關(guān)于Button背景或樣式失效問(wèn)題解決方法
大家好,本篇文章主要講的是Android關(guān)于Button背景或樣式失效問(wèn)題解決方法,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
Android中new Notification創(chuàng)建實(shí)例的最佳方法
這篇文章主要介紹了Android中new Notification創(chuàng)建實(shí)例的最佳方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08
Android 自定義閃屏頁(yè)廣告倒計(jì)時(shí)view效果
這篇文章主要介紹了Android 自定義閃屏頁(yè)廣告倒計(jì)時(shí)view效果,需要的朋友可以參考下2017-05-05
Android Lock鎖實(shí)現(xiàn)原理詳細(xì)分析
這篇文章主要介紹了Android Lock鎖實(shí)現(xiàn)原理,Lock接口的實(shí)現(xiàn)類提供了比使用synchronized關(guān)鍵字更加靈活和廣泛的鎖定對(duì)象操作,而且是以面向?qū)ο蟮姆绞竭M(jìn)行對(duì)象加鎖2023-02-02
Android 給應(yīng)用程序的icon添加未讀消息個(gè)數(shù)提示(紅圈內(nèi)數(shù)字)
本文主要介紹了Android 給應(yīng)用程序的icon添加未讀消息個(gè)數(shù)提示(紅圈內(nèi)數(shù)字)的方法。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04
Android數(shù)據(jù)加密之SHA安全散列算法
這篇文章主要為大家詳細(xì)介紹了Android數(shù)據(jù)加密之SHA安全散列算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Android Studio 創(chuàng)建自定義控件的方法
這篇文章主要介紹了Android Studio 創(chuàng)建自定義控件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Android啟動(dòng)內(nèi)置APK和動(dòng)態(tài)發(fā)送接收自定義廣播實(shí)例詳解
這篇文章主要介紹了Android啟動(dòng)內(nèi)置APK和動(dòng)態(tài)發(fā)送接收自定義廣播實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06

