簡單的小例子,乙個是只有乙個receiver捕捉有網路改變的常駐廣播,另外乙個是在第乙個的基礎上增加了乙個activity。試驗證明,第一種情況是收不到廣播的! 第二種情況是可以收到廣播的。所以android程式中,不能只有乙個receiver元件,必須還要activity。據說這是google對android應用程式安全的考慮,防止流氓軟體潛水消耗資源,正所謂禁止潛水也!
一 、問題現象
最近專案上遇見這樣乙個需求,在程式安裝之後,需要收到特定廣播,我當時想到的方案是在androidmainfest檔案裡新增乙個靜態註冊的廣播,比如:
本以為這樣就完事了,但是在測試過程中發現如果程式曾經啟動過一次,那麼一切都正常,如果是新安裝應用,重來都沒啟動過,這個時候是收不到廣播的。
二、問題分析
一查發現這是因為android在3.1以後將新安裝的應用置為「stopped」狀態,此時應用無法收到其他應用的廣播,只有當應用啟動過一次之後這個狀態才會改變。
三、問題解決方法
這個問題我們需要修改兩個地方來解決,
1、在靜態註冊廣播的時候 指定exported = true
2、在傳送intent的地方加上flag_include_stopped_packages
intent intent = new intent();
intent.setaction("***.***");
intent.addflags(intent.flag_include_stopped_packages);
sendbroadcast(intent);
android 4 0以上無法收到開機廣播
前面的文章 android 開機廣播的使用 中已經提到android的開機啟動,但是在android 4.0 有時可以接收到開機啟動廣播,有時卻不可以。經過分析發現,如果應用程式安裝上始終沒有被開啟過,那麼在android啟動時,該應用無法接收到開機啟動廣播android.permission.re...
如何解決App無法收到android開機廣播
今天發現在android2.2時寫的一款程式執行在android4.0上的時候無法接受開機廣播 action boot completed 後來發現是沒有新增的問題。在3.1以前,android對自啟動管理不是很嚴格,只要你的broadcastreceiver的intentfilter宣告了就可以接...
無法收到redis訂閱訊息
現網程式執行一段時間後,經常發現收不到redis訂閱訊息。輸入client list查詢redis連線資訊,輸出如下資訊 id 2375018 addr 120.15.207.135 9159 fd 663 name subarea age 3324 idle 563 flags n db 0 su...