关于Service最基本的用法是如何启动一个Service,启动Service的方法和启动Activity很类似,都需要借助Intent来实现,下面我们就通过一个具体的例子来看一下。
新建一个Android项目,项目名就叫ServiceStudy
然后新建一个MyService继承自Service,并重写父类的onCreate()、onStartCommand()和onDestroy()方法,新建一个Activity类来操作启动结束Service,并且控制和Service的绑定和解绑Activity
public class ServiceActivity extends Activity {
MyServiceConn coon;
MyService.MyBinder mb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_service);
coon =new MyServiceConn();
}
public void openService(View v){
Intent intent =new Intent(ServiceActivity.this, MyService.class);
startService(intent);
}
public void stopService(View v){
Intent intent =new Intent(ServiceActivity.this, MyService.class);
stopService(intent);
}
public void bindService(View view){
Intent intent =new Intent(ServiceActivity.this, MyService.class);
bindService(intent,coon, Service.BIND_AUTO_CREATE);
}
public void unbindService(View view){
unbindService(coon);
}
public void show(View view){
mb.fangfa();
}
public class MyServiceConn implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mb = (MyService.MyBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}
我们的Activity写好,里边有四个按钮方法分别是启动、销毁、绑定、解绑Service;通过Button的点击事件控制Service 的状态,我们来看看Service里的逻辑代码
public class MyService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { Log.d("onB","绑定服务"); return new MyBinder(); } @Override public boolean onUnbind(Intent intent) { Log.d("onUnbind","解绑服务"); return super.onUnbind(intent); } @Override public void onCreate() { super.onCreate(); Log.d("onCreate","创建"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("onStart","开启"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.d("onDestroy","销毁"); } public void fangfa1(){ Toast.makeText(this, "访问到service", Toast.LENGTH_SHORT).show(); } public class MyBinder extends Binder{ public void fangfa(){ fangfa1(); } } }
当启动一个Service的时候,会调用该Service中的onCreate()和onStartCommand()方法。如果当前Service已经被创建过了,不管怎样调用start()方法,onCreate()方法都不会再执行。每次都只会有onStartCommand()方法中的打印日志。
然后点击一下StopService按钮就可以将MyService停止掉了。
2.Activity和MyService之间建立关联
bindService()方法接收三个参数,第一个参数就是刚刚构建出的Intent对象,第二个参数是前面创建出的ServiceConnection的实例,第三个参数是一个标志位,这里传入BIND_AUTO_CREATE表示在Activity和Service建立关联后自动创建Service,这会使得MyService中的onCreate()方法得到执行,但onStartCommand()方法不会执行。
然后如何我们想解除Activity和Service之间的关联怎么办呢?调用一下unbindService()方法就可以了,这也是Unbind Service按钮的点击事件里实现的逻辑。
那么如果我们既点击了Start Service按钮,又点击了Bind Service按钮会怎么样呢?这个时候你会发现,不管你是单独点击Stop Service按钮还是Unbind Service按钮,Service都不会被销毁,必要将两个按钮都点击一下,Service才会被销毁。也就是说,点击Stop Service按钮只会让Service停止,点击Unbind Service按钮只会让Service和Activity解除关联,一个Service必须要在既没有和任何Activity关联又处理停止状态的时候才会被销毁。