91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android應用中點擊通知欄中的通知會自動啟動Activity如何解決

發布時間:2020-11-25 16:25:20 來源:億速云 閱讀:410 作者:Leah 欄目:移動開發

Android應用中點擊通知欄中的通知會自動啟動Activity如何解決?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

應用啟動后,如果當前界面不是會話界面,那么新消息會在通知欄顯示消息提醒,然后點擊會話消息后卻進不了會話的Activity,即點擊了通知欄通知后,系統都沒有啟動指定Activity的意思,沒有看到系統啟動Activity的Log,到是會看到系統處理這個Activity的影子。

這個指定的Activity不是會話的Activity,而是在AndroidManifest.xml文件中指定android.intent.category.LAUNCHER的Activity A。也就是說有會話消息都是先從這個A開始,然后把數據往后面的Activity傳。

這里顯示通知有兩種方式,一種是由手機系統在通知欄彈出,比如小米手機上使用小米推送,華為手機上使用華為推送,另外一種是由應用的遠程進程彈出。

啟動應用的第一個Activity A也有兩種方式,一種是直接通過new來構造一個Intent,然后傳入Activity A的class;另外一種是通過context.getPackageManager().getLaunchIntentForPackage(context.getPackageName())來獲取啟動的Activity A的Intent。然后調用PendingIntent.getActivity()方法,將得到的intent傳入。

那么問題來了,如果是點擊系統彈出的通知欄或者遠程進程彈出的通知欄,如果只是使用其中一種啟動方式啟動應用,那么在應用啟動后,點擊通知欄中由后臺遠程進程彈出的新消息通知,這個時候就不能進入會話的Activity。從系統的日志來看,沒有啟動Activity,只是對Activity做了處理。

可能有人會想到是不是要加一個Intent.FLAG_ACTIVITY_NEW_TASK標識,因為在getLaunchIntentForPackage()方法中加了這個標識。

最后測試發現,只要應用沒有被啟動,不管是點擊系統彈出的通知欄還是遠程進程彈出的通知欄,如果再收到新消息通知,再點擊通知欄,就能進入會話Activity了。那只要判斷應用中是否有Activity被啟動就OK了,貌似問題可以解決了。

問題解決

于是用了下面的邏輯來判斷是否有前臺Activity在運行。

/**
 * 判斷UI進程是否正在運行
 * @return 返回true表示正在運行,否則沒有運行
 */
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;
}

拓展

但是上面的方法在小米手機上湊效了,但在華為手機上還是有問題,即使同樣的場景。華為又坑爹了!

于是開始從上面的ActivityManager.RunningAppProcessInfo類中的importance變量的狀態入手,然后測試各種場景可能出現的變量值,結果發現效果不盡人意,有些場景問題依舊。

最后,又換種思路:不從Activity A開始啟動應用,換個Activity B,也就是在調用PendingIntent.getActivity()方法傳入Intent對象使用B的class。啟動B會發現應用沒有被初始化,則跳轉到A執行初始化,然后再走正常流程。

再針對各種場景以及各種機型測試,發現問題解決。從上面可以看出,雖然不懂背后原理,但解決問題的思路一定要廣,特別是在急著發版本的時候,不要在一棵樹上吊死。

看完上述內容,你們掌握Android應用中點擊通知欄中的通知會自動啟動Activity如何解決的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

北宁市| 伊金霍洛旗| 白银市| 丹东市| 象州县| 灵石县| 富平县| 临颍县| 韩城市| 呼玛县| 永宁县| 扬州市| 黑水县| 富宁县| 芒康县| 湾仔区| 根河市| 江山市| 莱芜市| 荣成市| 怀远县| 嘉义市| 陕西省| 雅江县| 桐乡市| 武清区| 台东市| 保康县| 闻喜县| 新龙县| 湘西| 烟台市| 长阳| 右玉县| 晋宁县| 象山县| 黄龙县| 定西市| 海宁市| 扬州市| 镶黄旗|