1.service的两种生命周期

android server服务 android services_内部类

1.1startservice


特点: 把服务启动起来后, 就不管服务的事了,即activity和服务没有关系

startService, 生命周期执行的过程:onCreate -> onStart/onStartCommand 服务正在运行中

stopService, 生命周期执行的过程:onDestory 服务销毁了


若Service已经运行,则再次开启时仅重新调用onStart/onStartCommand

使用startService方式开启的服务, 只能用stopService关闭服务


1.2 bindservice


特点: 当绑定服务的activity被销毁时,服务也随之销毁

bindService, 生命周期执行的过程:onCreate -> onBind        

unbindService, 生命周期执行的过程:onUnbind -> onDestory 

   

onRebind 方法:只有在onUnbind方法返回true的情况下, 才会被调用





2.service中方法的调用

开发者拿不到service的实例对象,所以无法通过service对象调用服务里面的方法。需要通过其他方法调用。


2.1本地服务调用(以播放器为例)




2.1.1定义一个服务,继承service,重写oncreate方法,在oncreate方法中,创建MediaPlayer对象


2.1.2在自定义的服务类中,添加播放、暂停、重播等方法


2.1.3在服务中,定义一个内部类MediaController,在该类中提供两个方法,通过这两个方法间接调用服务中的方法。该类相当于中间人。


2.1.4在服务的onBind方法中,返回MediaController对象。


2.1.5在activity中,创建一个用来连接服务的对象,Myconnection,该连接对象,用来接收中间人,即MediaController


2.1.6在bindservice的方法调用的时候,将Myconnection对象到服务中去。服务绑定时,会回调Myconnection对象中的onServiceConnect方法,返回中间人MediaController对象。之后通过MediaController对象,可以间接调用服务中的方法了。




service类:


public class MediaPlayerService extends Service {
    private MediaPlayer mediaPlayer;

    @Override
    public void onCreate() {
        mediaPlayer = new MediaPlayer();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return new MediaController();
    }

    public void play() {
        mediaPlayer.start();
    }

    public void pause() {
        mediaPlayer.pause();
    }

    public class MediaController extends Binder {
        public void forwardPlay() {
            play();
        }

        public void forwardPause() {
            pause();
        }
    }
}

activity类:


class MyConnection implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            MediaPlayerService.MediaController mediaController = (MediaPlayerService.MediaController) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }

    public void bind() {
        Intent intent = new Intent(this, MediaPlayerService.class);
        bindService(intent, new MyConnection(), Context.BIND_AUTO_CREATE);
    }




2.2远程服务调用(aidl)




2.2.1定义一个接口文件


声明一个方法,把修饰词去掉,将该接口文件的后缀名修改为.aidl


android server服务 android services_ide_02

android server服务 android services_ide_03




2.2.2在服务中定义一个内部类


继承Stub,并且把接口文件中的抽象方法实现


android server服务 android services_内部类_04


2.2.3在service的onBind方法中,将2.2.2中定义的内部类返回






2.2.4在另一个工程的activity中,将服务中的aidl文件,拷贝到自己的工程中。文件目录格式一致


android server服务 android services_ide_05


2.2.5 定义并创建连接桥对象


android server服务 android services_ide_06




2.2.6使用隐式的方式绑定服务,并且将连接桥对象传递过去


android server服务 android services_ide_07




注意:使用隐式方式跳转服务,需要在服务所在工程的清单文件中配置intentfilter


android server服务 android services_android_08