android 四大组件之Service

一、开启服务的方式:

1)startService

Intent intent = new Intent(MainActivity.this, MyService.class);
startService(intent);

当然,还有关闭Service:

stopService(new Intent(MainActivity.this, MyService.class));

也可以在onStartCommand()方法内部调用stopSelf()方法,但是这样会导致每次调用onCreate()方法中的代码走完Service就会被销毁掉。

MyService里面重写onCreate() 、onDestroy() 、onStartCommand()方法,onBind() 方法是Service的抽象方法,暂时用不到。

public class MyService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("myService is Created");
       
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("myService is Destroyed");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("myService is onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }
}

一般的生命周期:

onCreate

onStartCommand

onDestroy

当多次startService时MyService会跳过onCreate()方法,直接执行onStartCommand()方法。生命周期:

onCreate

onStartCommand

onStartCommand

onDestroy

startService创建的Service需要手动停止,在做完一次操作之后需要stopSelf(),so  IntentService可以实现这种需求,创建自定义的Service,实现IntentService 并实现他的onHandleIntent()方法,当方法里面的代码执行完毕后就会自动调用onDestroy()。

2)bindService()

Intent intent = new Intent(MainActivity.this, MyService.class);
ServiceConnection connection = new ServiceConnection() {
     @Override
     public void onServiceConnected(ComponentName name, IBinder service) {

     }

     @Override
     public void onServiceDisconnected(ComponentName name) {

     }
};
bindService(intent,connection,Context.BIND_AUTO_CREATE);

需要在MyService中创建一个binder对象,并在onBind()方法中返回创建的binder对象。

class MyBinder extends Binder{

}
MyBinder mBinder = new MyBinder();

在bindService()之后,其生命周期为:

onCreate()

onBind()

onUnbind()

onDestroy()

在MyService中自定义的MyBinder就是Service与activity进行信息交互的一个桥梁,在MyBinder类中定义方法,activity通过调用MyBinder中的方法将参数传递到activity中。

二、远程连接服务(跨进程通信):通过AIDL(Android Interface Definition Language)

远程连接可参考:https://www.jianshu.com/p/34326751b2c6

本地创建远程服务客户端

1)创建AIDL文件

2)创建AIDL.Stub的实现类

3)在自定义的Service中添加实现类对象并在onBind()中返回该对象

4)binfService(),在ServiceConnection的实现方法中操作。

连接远程服务器 Service:

1)将服务器AIDL文件夹复制到本地,不做修改

2)Manifests中注册Service

3)开启服务(通过action和package实现)

例:

//参数与服务器端的action要一致,即"服务器包名.aidl接口文件名"
Intent intent = new Intent("scut.carson_ho.service_server.AIDL_Service1");
 //Android5.0后无法只通过隐式Intent绑定远程Service
 //需要通过setPackage()方法指定包名
 intent.setPackage("scut.carson_ho.service_server");
 //绑定服务,传入intent和ServiceConnection对象
 bindService(intent, connection, Context.BIND_AUTO_CREATE);

参考:https://www.jianshu.com/p/34326751b2c6

你可能感兴趣的:(android 四大组件之Service)