溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android應(yīng)用中點(diǎn)擊通知欄中的通知會(huì)自動(dòng)啟動(dòng)Activity如何解決

發(fā)布時(shí)間:2020-11-25 16:25:20 來(lái)源:億速云 閱讀:408 作者:Leah 欄目:移動(dòng)開(kāi)發(fā)

Android應(yīng)用中點(diǎn)擊通知欄中的通知會(huì)自動(dòng)啟動(dòng)Activity如何解決?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

應(yīng)用啟動(dòng)后,如果當(dāng)前界面不是會(huì)話界面,那么新消息會(huì)在通知欄顯示消息提醒,然后點(diǎn)擊會(huì)話消息后卻進(jìn)不了會(huì)話的Activity,即點(diǎn)擊了通知欄通知后,系統(tǒng)都沒(méi)有啟動(dòng)指定Activity的意思,沒(méi)有看到系統(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開(kāi)始,然后把數(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)看,沒(mé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)用沒(méi)有被啟動(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)行,否則沒(méi)有運(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)景。華為又坑爹了!

于是開(kāi)始從上面的ActivityManager.RunningAppProcessInfo類(lèi)中的importance變量的狀態(tài)入手,然后測(cè)試各種場(chǎng)景可能出現(xiàn)的變量值,結(jié)果發(fā)現(xiàn)效果不盡人意,有些場(chǎng)景問(wèn)題依舊。

最后,又換種思路:不從Activity A開(kāi)始啟動(dòng)應(yīng)用,換個(gè)Activity B,也就是在調(diào)用PendingIntent.getActivity()方法傳入Intent對(duì)象使用B的class。啟動(dòng)B會(huì)發(fā)現(xiàn)應(yīng)用沒(méi)有被初始化,則跳轉(zhuǎn)到A執(zhí)行初始化,然后再走正常流程。

再針對(duì)各種場(chǎng)景以及各種機(jī)型測(cè)試,發(fā)現(xiàn)問(wèn)題解決。從上面可以看出,雖然不懂背后原理,但解決問(wèn)題的思路一定要廣,特別是在急著發(fā)版本的時(shí)候,不要在一棵樹(shù)上吊死。

看完上述內(nèi)容,你們掌握Android應(yīng)用中點(diǎn)擊通知欄中的通知會(huì)自動(dòng)啟動(dòng)Activity如何解決的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI