編輯:Android開發教程
App->Service->Foreground Service Controller
和Windows中的Service類似,Android系統也提供了一種稱為“Service”的組件通常在後台運行。Activity 可以用來啟動一 個Service,Service啟動後可以保持在後台一直運行,即使啟動它的Activity退出或是切換到別的應用Service也能保持運行狀 態。
Service 可以以兩種形式存在:
Started 當一個如Activity使用startService()來啟動一個Service,一旦Service啟動後,就不受啟動它的Activity控制, 可以在後台長期運行,通常這種Service在後台執行某個費時操作(如下載文件)不會向啟動它的Activity返回結果。
Bound 為Activity或是其它程序部件使用bindService()來啟動Service。Bound Service提供了一種Client/Service方法允許 調用Service的Activity與Service進行交互:發送請求,取得結果,並支持進程間通信。 一般Bound Service的生命周期和啟動 它的Activity相同,多個Activity可以同時綁定一個Service。 當所有Activity 都斷開與Service之間的綁定時。Service自動 結束。
雖然Service可以有上述兩種表現形式,這只是為了說明上的方便,實際上同一個Service可以同時以兩種方式存在,只要實 現兩種方法所定義的接口函數就可以了。
創建一個Service,首先需要定義一個Service的子類,然後根據需要重載 Service定義的一些核心方法:
onStartCommand() 當一個Activity調用startService時,Android系統會調用Service的onStartCommand()方法, 前面說過 使用startService啟動的Service會在後台長期運行,不受啟動它的Activity控制,因此應用程序有責任來停止Service, Service也可以調用stopSelf來停止自身。
onBind() 當一個Activity 使用bindService()來綁定Service時Android系統會調用Service的onBind方法,onBind需要返回 一個IBind對象給調用者(Client)。Client然後可以使用IBind提供的方法來使用Service。
onCreate() Service第一次創建時被調用,和Activity的onCreate類似。
onDestroy() Service退出時調用。
定義了Service類和實現相應方法後,和Activity一樣,也需要在AndroidManifest.xml中定義這個Service:
<manifest … >
…
<application … >
<service android:name=”.ExampleService” />
…
< /application>
< /manifest>
和Activity一樣,也可以為Service定義Intent Filter,如果你 不想共享這個Service,可以將android:exported屬性定義為false。
通常情況下Service在後台運行,當Android也支持 Service運行在前台,運行在前台的Service必須在屏幕頂端的Status Bar提供一個Notification以提示用戶有Service在運行。 比如提供個Media Player使用的Service運行在前台,而在標題欄顯示當前曲目。
本例Foreground Service Controller 就顯示了一個在前台運行的Service, 前台運行的Service可以通過調用startForeground()使Service在前台運行。 stopForeground停止前台運行,但Service本身不會停止。 startForeground,stopForeground是從2.0開始支持的,之前的版本 采用setForeground。
本例為了支持2.0之前和2.0之後的版本,采用了Reflection的方法來來查找當前版本是否含有 startForeground和stopForeground,如果有則調用,沒有則還是使用setForeground。
如果找到的話,以下的變量用來 存儲startForeground和stopForeground方法。和本例Service不相關,就不詳述了。只要知道startForegroundCompat 和 stopForegroundCompat的功能就是startForeground 和stopForeground就行了。
private static final Class[] mStartForegroundSignature = new Class[] {
int.class, Notification.class};
private static final Class[] mStopForegroundSignature = new Class[] {
boolean.class};
private Method mStartForeground;
private Method mStopForeground;
private Object[] mStartForegroundArgs = new Object[2];
private Object[] mStopForegroundArgs = new Object[1];
android app一般性架構設計一.UI層(Activity+Fragment基類設計+部分自定義控件)KJActivity(Activity繼承鏈的規范)I_KJA
在我的設備上面,默認的首選項名字是net.manoel.UsingPreferences_preferences.xml,這個名字是使 用包名作為前綴的。然而,給首選項定
使用Intent 啟動一個Activity,Service等時,可以通過putExtra 傳送數據 ,被觸發的Activity,Service可以使用getIntent(
Compass(羅盤)是一個定制的視圖, 繼承View類, 重寫了視圖的邊界(onMeasure)和內容(onDraw);如圖:以下是Compass的具體設計:1. 創建
創建好ApiDemo項目後,就可以逐個示例的來分析代碼,這裡假定讀者已對