Service的两种创建方式(startService和bindService)的使用

来源:互联网 发布:淘宝外卖确认送达失败 编辑:程序博客网 时间:2024/05/16 17:17
一、startService的实现步骤:
1.创建一个自定义类继承Service类(如此方为服务类)
2.在配置清单文件里的<application>下注册. (忘记注册,不会报异常,只会有一个黄色警报,no found)
    <service android:name="包名.类名" ></service>
(可以配 <intent-filter>,像Activity一样有隐式启动,显式启动)
3.复写onCreate方法,服务开启时调用此方法进行操作.(主要是在此方法里编写服务初始化的逻辑代码)
    public void onCreate() {...super.onCreate();}//一般自己的代码写在super.onCreate这段代码上面,可以减少bug.
4:复写onStartCommand方法,服务被创建或再次点击开启服务时调用此方法进行操作.(对服务进行操作的逻辑代码,比如音乐暂停,播放等)
    其中的intent参数就是,Activity里的开启服务时携带的Intent参数,传到了onStartCommand里,可进行Activity与Service的数据传递
    public int onStartCommand(Intent intent, int flags, int startId)
5.复写onDestroy方法,服务销毁时调用此方法释放内存.
    public void onDestroy() {........super.onDestroy();}

注意:即使应用程序退出,如果没有执行onDestroy方法,服务依然不会关闭,除非结束当前线程。另外,服务是运行在主线程里面(main),而主线程不能进行耗时的操作,在服务里的耗时操作要放到子线程中。

在Activity里开启服务(使用的是显示意图):
   创建意图对象
   Intent intent= new Intent();
   调用意图对象,加载服务类到意图中.
   intent.setClass(this,服务类.class);
   运行意图(实际上也不能算开启服务,只是执行了服务的onCreate方法)
   startService(intent);//开启Activity就是startActivity()方法
   简写模式:startService(new Intent(this,服务类.class));

在Activity里关闭服务(使用的是显示意图):
   创建意图意图对象
   Intent intent= new Intent();
   调用意图对象,加载服务类到意图中.
   intent.setClass(this,服务类.class);
   运行意图(实际上也不能算开启服务,只是执行了服务的onDestroy方法
   stopService(intent);

注意:服务的开启,关闭都要在Activity里去完成,他自身是不可以开启或关闭,由此可以看出服务依赖于应用程序.

二、bindService的实现步骤:
首先,在Service里创建Binder步骤
1.自定义一个类继承Binder(是IBinder的子类),之所以不实现接口IBinder,是因为要复写其太多抽象方法.
    class xxx extends Binder{}
2.在xxx(继承Binder的自定义类)里,自定义方法,这些方法主要是为了调用Service里的方法,故方法所需参数要包含Service里的方法所需参数
        class xxx extends Binder{
        public void 自定义方法(String name){
            服务里自定义的方法(name);}               }
3.在服务类里必有的onBind方法里,把继承Binder的自定义类,return返回回去.切记切记,最容易忘记.
    public IBinder onBind(Intent intent) {   
        return new xxx();}
4.在服务类还要复写onUnbind方法,用来解除绑定服务的方法.
  public boolean onUnbind(Intent intent) {        return super.onUnbind(intent);    }

其后,在Activity里使用Binder步骤:
1.定义好Intent意图.
        Intent intent = new Intent(上下文,Service类.class);
2.使用Activity里的静态方法,bindService绑定服务.(核心一步,实际是调用Service里的onBind方法)
sercice:一个有上下文,及要使用到的Service.class数据的Intent    conn:通讯频道.实现ServiceConnection的自定义类对象.
        bindService(Intent  , conn, flags)//flags:参数一般是BIND_AUTO_CREATE,表示如果服务不存在,会自动把服务创建出来.

3.创建通讯频道,以便传给bindService,自定义一个类实现ServiceConnection
    private class conn implements ServiceConnection{}

4.复写实现ServiceConnection的自定义类的两个方法,
    private class conn implements ServiceConnection{
        //当服务被成功连接的时候调用的方法,参数是一个IBinder
        public void onServiceConnected(ComponentName name, IBinder service) {
        继承Binder类的自定义类    继承Binder类的自定义类对象= (局长女儿名字,也就是继承Binder类的自定义类) service;
        }//最好把继承Binder类的自定义类提升为全局变量.方便调用.
        //当服务失去连接的时候调用的方法.       
        public void onServiceDisconnected(ComponentName name) {}
    }
5.通过继承Binder类的自定义类对象,调用其方法,间接调用Service里方法.

6.使用Activity里的静态方法unbindService()解除绑定服务.(核心一步,实际是调用Service里的onUnbind方法)
    
三、绑定服务的优化
绑定服务的一种特殊情况(使用接口,是固定模式的优化):当在继承Binder类的自定义类,有了一些不想让Activity调用的方法,把类权限改为private时,怎么在Activity调用Binder类想要暴露出去的方法呢?

1.定义一个接口,public interface 名字自定义();

2.在接口类里写Binder类需要暴露出去的抽象方法,和Binder类想要暴露出去的方法名,参数,返回值类型一致.

3.在Service类里的Binder类不仅继承(extends)Binder还要实现(implements)自定义的接口.

4.Activity里所有所用到Binder的类型都要改为自定义接口的类型,这要就可以只调用Binder类里暴露方法,而无法调用Binder类没有暴露的方法



0 0
原创粉丝点击