android service理解

来源:互联网 发布:教师网络课程心得 编辑:程序博客网 时间:2024/06/06 00:25

关于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关联又处理停止状态的时候才会被销毁。