Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中程序的停止狀態詳細介紹

Android中程序的停止狀態詳細介紹

編輯:關於Android編程

很多人遇到過廣播收不到的問題,比如Google Play推廣安裝廣播沒有收到等,諸如這些問題,又都是什麼原因呢,這篇文章將進行回答.

從Android 3.1(HoneyComb) 也就是API 12開始,Android引入了一套新的啟動控制,這就是程序的停止狀態.那讓我們看一下Google對於程序的停止狀態的描述.

什麼是程序的停止狀態
復制代碼 代碼如下:
Starting from Android 3.1, the system's package manager keeps track of applications that are in a stopped state and provides a means of controlling their launch from background processes and other applications.

從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的目標處理者中不包含已經停止的程序.

當如果intnet中沒有或者設置了上面兩個flag,在目標處理者中是包含已經處於停止的程序.但是注意,系統會為所有的廣播intent增加FLAG_EXCLUDE_STOPPED_PACKAGES這個flag.

為什麼Android要引入這一狀態
復制代碼 代碼如下:
Note that the system adds FLAG_EXCLUDE_STOPPED_PACKAGES to all broadcast intents. It does this to prevent broadcasts from background services from inadvertently or unnecessarily launching components of stoppped applications. A background service or application can override this behavior by adding the FLAG_INCLUDE_STOPPED_PACKAGES flag to broadcast intents that should be allowed to activate stopped applications.

需要注意的是,系統會默認地對所有的廣播intent增加一個FLAG_EXCLUDE_STOPPED_PACKAGES的flag,這樣做的目的是為了阻止來自後台服務的廣播不慎或者啟動處於停止狀態的程序的不必要的組件.

通常的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之後,是在程序安裝後第一次打開時發送.

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved