Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 系列 4.6在顯示其他應用程序的同時運行後台服務

Android 系列 4.6在顯示其他應用程序的同時運行後台服務

編輯:關於Android編程

4.6在顯示其他應用程序的同時運行後台服務

問題

您希望您的應用程序的一部分繼續在後台運行,而用戶切換到與其他應用程序交互。

創建一個Service類來做後台工作;從您的主應用程序啟動服務。可選地提供通知圖標,以允許用戶停止正在運行的服務或恢復主應用程序。

討論

服務類(android.app.Service)作為與主應用程序相同的進程的一部分運行,但具有一個屬性,即使用戶切換到另一個應用程序或轉到主屏幕並啟動一個新的應用程序。

正如你現在所知道的,Activity類可以通過與其內容提供者匹配的意圖啟動,或者通過按類名稱提及它們的意圖啟動。服務也是如此。這個菜譜著重於直接啟動服務;配方4.1涵蓋了隱式啟動服務。以下示例取自JPSTrack,Android的GPS跟蹤程序。一旦您開始跟蹤,您不希望跟蹤停止,如果你接聽電話或必須看地圖(!),所以我們使它成為一個服務。如示例4-10所示,當您單擊開始跟蹤按鈕時,服務由主活動啟動,並由停止按鈕停止。注意,這是非常普遍的,startService()和stopService()被內置到Activity類中。

實例4-10。 onCreate方法

@Override
public void onCreate(Bundle savedInstanceState) {
...
Intent theIntent = new Intent(this, TrackService.class);
Button startButton = (Button) findViewById(R.id.startButton);
startButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startService(theIntent);
Toast.makeText(Main.this, "Starting", Toast.LENGTH_LONG).show();
}
});
Button stopButton = (Button) findViewById(R.id.stopButton);
stopButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
stopService(theIntent);
Toast.makeText(Main.this, "Stopped", Toast.LENGTH_LONG).show();
}
});
...
}

TrackService類直接擴展了Service,所以它必須實現抽象的onBind()方法。這是在類直接啟動時不使用的,所以它可以是一個存根方法。您通常會至少覆蓋onStartCommand()和onUnbind()方法,以開始和結束某些活動。例4-11啟動GPS服務向我們發送通知,我們保存到磁盤,我們希望它繼續運行,因此這個Service類。

實例4-11。 TrackService(使用GPS的服務)類
public class TrackService extends Service {
private LocationManager mgr;
private String preferredProvider;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
initGPS(); // sets up the LocationManager mgr
if (preferredProvider != null) {
mgr.requestLocationUpdates(preferredProvider, MIN_SECONDS * 1000,
MIN_METRES, this);
return START_STICKY;
}
return START_NOT_STICKY;
}
@Override
public boolean onUnbind(Intent intent) {
mgr.removeUpdates(this);
return super.onUnbind(intent);
}

您可能已經注意到onStartCommand()的不同返回值。如果您返回START_STICKY,Android會在服務終止後重新啟動您的服務。如果您返回START_NOT_STICKY,該服務將不會自動重新啟動。這些值在Service類的聯機文檔中有更詳細的討論(請參見http://developer.android.com/reference/android/app/Service.html)。請記住在AndroidManifest.xml的應用程序部分中聲明Service子類:
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved