Service(服務)是能夠在後臺執行長時間運行操作並且不提供用戶界面的應用程序組件。Service從本質上可以分爲兩類:
- Started Service(啓動)
應用程序組件(例如Activity)通過其他調用 startService()方法啓動服務時,服務處於“started”狀態。
這種service可以無限地運行下去,即使啓動它的組件已經被銷燬,必須調用stopSelf()方法或者其他組件調用stopService()方法來停止它。
當服務停止時,系統將會將其銷燬 - Bound Service(綁定)
當其他組件調用bindService()方法時,服務被創建。接着客戶端通過IBinder接口與服務通信。客戶端通過unbindService()方法關閉連接。多個客戶端能綁定到同一個服務並且當它們都解綁定時,系統銷燬服務(服務不需要被停止)。
這兩條路徑並不是完全分開的。即是說,你可以和一個已經調用了 startService()而被開啓的service進行綁定。比如,一個後臺音樂service可能因調用 startService()方法而被開啓了,稍後,可能用戶想要控制播放器或者得到一些當前歌曲的信息,可以通過bindService()將一個activity和service綁定。這種情況下,stopService()或 stopSelf()實際上並不能停止這個service,除非所有的客戶都解除綁定。
服務的生命週期如下:
Service類中的重要方法
- onCreate():當Service第一次被創建時將立即被調用。如果服務已經運行,該方法不被調用。
- onStartCommand(Intent intent,int flags,int startId):每次客戶端調用startService(Intent)方法啓動Service時都會回調該方法。一旦該方法執行,服務就啓動並在後臺無限期運行。
- onDestroy():當該Service被關閉前將立即回調該方法。
- onBinder(Intent intent):當其他組件調用bindService()方法與服務綁定時,系統調用該方法,返回一個IBinder對象,應用程序可以通過該對象和Service組件進行通信。如果系統不想允許綁定,則應該返回null。
- onUnbind(Intent intent):當Service上綁定的所有客戶端都斷開連接時將回調該方法。
Service的聲明
類似Activity和其他組件,開發人員必須在應用程序配置文件中聲明全部的Service。在 < application > 標籤中增加< Service >子標籤。
<service android:name="EchoService"></service>
例子,獲取Service的成員變量i的值
創建EchoService類如下:
package com.example.usingservice;
import java.util.Timer;
import java.util.TimerTask;
import android.R.integer;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
public class EchoService extends Service {
private final EchoServiceBinder echoServiceBinder = new EchoServiceBinder();
private Timer timer = null;
private TimerTask task = null;
private int i = 0;
public class EchoServiceBinder extends Binder{//內部類
public EchoService getService() {//取得服務的實例
return EchoService.this;
}
}
@Override
public IBinder onBind(Intent arg0) {
System.out.println("onBind");
return echoServiceBinder;
}
@Override
public void onCreate() {
System.out.println("onCreate");
startTimer();//啓動定時器
super.onCreate();
}
@Override
public void onDestroy() {
System.out.println("onDestroy");
stopTimer();//停止定時器
super.onDestroy();
}
public void startTimer() {//啓動timer
if (timer == null) {
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
i++;
System.err.println("i is "+i);
}
};
timer.schedule(task, 1000, 1000);//啓動timer,延遲1s,週期1s
}
}
public void stopTimer() {//停止timer
if (timer != null) {
task.cancel();
timer.cancel();
task = null;
timer = null;
}
}
public int getCurrentNum() {//取得i的值
return i;
}
}
MainActivity類如下:
package com.example.usingservice;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener, ServiceConnection {
private Button btnStartService, btnStopService, btnBindService, btnUnbindService, btnGetCurNum;
private Intent serviceIntent;
private EchoService echoService = null;//服務
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
serviceIntent = new Intent(this, EchoService.class);
btnStartService = (Button) findViewById(R.id.startService); //啓動服務button
btnStopService = (Button) findViewById(R.id.stopService);//停止服務button
btnBindService = (Button) findViewById(R.id.bindService); //綁定服務button
btnUnbindService = (Button) findViewById(R.id.unbindServie);//un綁定服務button
btnGetCurNum = (Button) findViewById(R.id.getCurrentNum);//獲取當前service成員變量i數值的button
btnStartService.setOnClickListener(this);
btnStopService.setOnClickListener(this);
btnBindService.setOnClickListener(this);
btnUnbindService.setOnClickListener(this);
btnGetCurNum.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.startService:
startService(serviceIntent);//啓動服務
break;
case R.id.stopService:
stopService(serviceIntent);//停止服務
break;
case R.id.bindService:
bindService(serviceIntent, this, Context.BIND_AUTO_CREATE);//綁定服務
break;
case R.id.unbindServie:
unbindService(this);//解綁服務
echoService = null;
break;
case R.id.getCurrentNum:
if (echoService != null) {
System.out.println("當前的i是:"+echoService.getCurrentNum());
}
break;
default:
break;
}
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder binder) {//成功綁定服務調用
System.out.println("onServiceConnected");
echoService = ((EchoService.EchoServiceBinder)binder).getService();//獲取服務實例
}
@Override
public void onServiceDisconnected(ComponentName arg0) {//綁定服務Disconneted
System.out.println("onServiceDisconnected");
}
}
轉載自:http://blog.csdn.net/u014084081/article/details/44134125