服務,作爲Android四大組件之一,必然是重點。我們今天就來講解一下有關服務的生命週期、兩種開啓方式以及相關用法。
服務有兩種開啓方式,一種是正常開啓, 一種是以綁定的方式開啓,當然,這兩種方式可以組成混合開啓。
一、服務的正常開啓
1、編寫一個類,繼承Service類。
public class TestService extends Service {
@Override
public IBinder onBind(Intent arg0) {
System.out.println("onBind");
return new Mybinder();
}
@Override
public void onCreate() {
System.out.println("create");
super.onCreate();
}
@Override
public void onDestroy() {
System.out.println("onDestroy");
super.onDestroy();
}
@Override
@Deprecated
public void onStart(Intent intent, int startId) {
System.out.println("start");
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("onUnbind");
return super.onUnbind(intent);
}
class Mybinder extends Binder implements IService {
public void method() {
System.out.println("serviceMethod");
}
}
}
2、清單文件中註冊服務
<service android:name="com.example.servicedemo.TestService" >
</service>
3、正常開啓服務
intent = new Intent(getBaseContext(), TestService.class);
startService(intent);
4、正常關閉服務
stopService(intent);
這裏我們值得注意的是,一般服務的意圖對象會做成全局變量,便於在退出的時候銷燬服務。這是服務正常使用的步驟。正常使用的時候,服務的生命週期是這樣的:
二、服務的綁定開啓
1、binder類的實現
class Mybinder extends Binder implements IService {
public void method() {
System.out.println("serviceMethod");
}
}
@Override
public IBinder onBind(Intent arg0) {
System.out.println("onBind");
return new Mybinder();
}
2、拿到代理binder
class Mycon implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName arg0, IBinder binder) {
Iservice = (IService) binder;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
}
3、服務的綁定與調用服務方法和解綁
intent = new Intent(getBaseContext(), TestService.class);
conn = new Mycon();
bindService(intent, conn, BIND_AUTO_CREATE);
當這樣綁定服務後,服務的生命週期執行是這樣的:onCreate-->onBind,不會執行onStartCommand方法,拿到代理類後,我們可以執行服務裏的方法了。 findViewById(R.id.test).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//startService(intent);
Iservice.method();
}
});
這樣,就調用了服務裏的方法。unbindService(conn);
執行這行代碼,就可以解綁服務了。執行的生命週期函是:onUnBind-->onDestory三、服務的混合開啓
intent = new Intent(getBaseContext(), TestService.class);
startService(intent);
conn = new Mycon();
bindService(intent, conn, BIND_AUTO_CREATE);
unbindService(conn);
stopService(intent);
conn=null;
intent=null;
四、調用遠程服務的方法
1、將接口文件重命名爲.aidl文件
package com.example.servicedemo;
interface IService {
void method();
}
2、在新的應用中,新建一個與之前存放.aidl文件包名一樣的包。
3、修改之前服務類裏的binder實現方法
class Mybinder extends IService.Stub {
public void method() {
System.out.println("serviceDemomethod");
}
}
將之前的接口文件修改之後,我們直接繼承接口文件自動生成的.Stub類即可4、定義服務的隱試意圖開啓方式,並採用隱式意圖開啓服務
<service android:name="com.example.servicedemo.TestService" >
<intent-filter>
<action android:name="com.example.servicedemo.TestService.action" />
</intent-filter>
</service>
在綁定服務之前,需要重寫一下代理接口實現類,這裏不再採用強制轉換了。 class Mycon implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName arg0, IBinder binder) {
Iservice = IService.Stub.asInterface(binder);
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
}
<span style="white-space:pre"> </span>Intent intent = new Intent();
intent.setAction("com.example.servicedemo.TestService.action");
bindService(intent, new Mycon(), BIND_AUTO_CREATE);
findViewById(R.id.test).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
Iservice.method();
} catch (RemoteException e) {
e.printStackTrace();
}
}
});