很多人遇到過廣播收不到的問題,比如Google Play推廣安裝廣播沒有收到等,諸如這些問題,又都是什么原因呢,這篇文章將進行回答.
從Android 3.1(HoneyComb) 也就是API 12開始,Android引入了一套新的啟動控制,這就是程序的停止狀態.那讓我們看一下Google對于程序的停止狀態的描述.
什么是程序的停止狀態
從Android 3.1開始,系統的包管理器開始跟蹤處理停止狀態的程序.并且提供了方法來控制從后臺進程或者其他程序對它們的啟動.
Note that an application's stopped state is not the same as an Activity's stopped state. The system manages those two stopped states separately.
注意 程序的停止狀態和Activity的停止狀態不同,系統會單獨處理這兩種狀態.
The platform defines two new intent flags that let a sender specify whether the Intent should be allowed to activate components in stopped application. Android平臺提供了兩個intent flags,用來讓發送廣播的一方決定廣播是否需要同時發送給已經停止的程序.
FLAG_INCLUDE_STOPPED_PACKAGES ― Include intent filters of stopped applications in the list of potential targets to resolve against. 將已經支持的程序加入到能處理intent的目標處理者.
FLAG_EXCLUDE_STOPPED_PACKAGES ― Exclude intent filters of stopped applications from the list of potential targets. 在能處理intent的目標處理者中不包含已經停止的程序.
為什么Android要引入這一狀態
通常的intnet廣播,處于停止狀態的程序的receiver是無法接受到的.那么怎么才能讓這些停止狀態的程序接受到呢?可以這樣做,在后臺服務或者應用中發送廣播時,增加一個FLAG_INCLUDE_STOPPED_PACKAGES 的flag,意思是包含處于停止狀態的程序.這樣就可以激活停止狀態的程序.
正如上述引用指出,系統默認阻止廣播intent發送給處于停止狀態的程序包,實際上這是為了保證安全和省電需要.比如說網絡變化的廣播,如果某些程序注冊監聽,并且它在得到廣播時,做一系列的網絡操作,這樣必然是很耗能源的.
激活狀態和停止狀態的切換
當程序第一次安裝并且沒有啟動,或者用戶手動從程序管理將其停止后,程序都會處于停止狀態.
如何變為停止狀態
1.在設置應用管理中的應用詳情頁點擊強制停止
2.使用adb shell adb shell am force-stop package-name
3.使用ActivityManager的隱藏方法forceStopPackages,并且向manifest加入申請權限<uses-permission android:name=“android.permission.FORCE_STOP_PACKAGES”/>
如何脫離停止狀態
1.手動啟動程序
2.使用adb激活應用組件,如activity或者receiver
發送廣播intent給處于停止狀態的應用
1.在Java代碼發送Intent時,加入flag FLAG_INCLUDE_STOPPED_PACKAGES
2.如果使用adb,同樣是加入FLAG_INCLUDE_STOPPED_PACKAGES(其具體值為32),如adb shell am broadcast -a com.android.vending.INSTALL_REFERRER -f 32
檢查是否處于停止狀態
1.進入設置―應用管理―某個應用的詳細頁,如果強制停止按鈕不可用,則說明程序已經處于停止狀態.
2.進入設備終端,查看系統文件cat /data/system/packages-stopped.xml
問答環節
提問:如果我的程序沒有activity只有一個receiver,我改如何激活才能接收到正常的廣播intent呢
回答:實際上,如果是上面所述的情況,該應用在安裝之后不是處于停止狀態,因為它沒有任何用戶可以直接點擊的行為去將它移除停止狀態.你可以正常接收廣播intent,除非你人為地將它強制停止.
提問:系統的程序剛安裝會處于停止狀態么?
回答:系統的程序通常會存放在 /system/app目錄下,在一開始安裝之后不會處于停止狀態.
提問:Google Play的推廣廣播據說是在程序安裝完成之后發送,是不是3.1之后受影響么
回答:不受影響的.Google文檔說INSTALL_REFERRER會在程序安裝完成之后發送,據實際查看日志觀察,從3.1之后,是在程序安裝后第一次打開時發送.
新聞熱點
疑難解答
圖片精選