服务,作为Android四大组件之一,必然是重点。我们今天就来讲解一下有关服务的生命周期、两种开启方式以及相关用法。
服务有两种开启方式,一种是正常开启, 一种是以绑定的方式开启,当然,这两种方式可以组成混合开启。
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");
}
}
}
<service android:name="com.example.servicedemo.TestService" >
</service>
intent = new Intent(getBaseContext(), TestService.class); startService(intent);
stopService(intent);
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();
} class Mycon implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName arg0, IBinder binder) {
Iservice = (IService) binder;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
}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;
package com.example.servicedemo;
interface IService {
void method();
} class Mybinder extends IService.Stub {
public void method() {
System.out.println("serviceDemomethod");
}
}
将之前的接口文件修改之后,我们直接继承接口文件自动生成的.Stub类即可 <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();
}
}
});
原文:http://blog.csdn.net/victorfreedom/article/details/43617503