*【四大组件】Service

1.定义:
(1)后台运行,不可见,没有界面
(2)优先级高于Activity
2.用途:
播放音乐、记录地理信息位置的改变、监听某种动作
3.注意:
运行在主线程,不能用于耗时的请求或者动作
可以在服务中开一个线程,在线程中做耗时动作

类型:
1.本地服务(Local Service)应用程序内部
( 1 ) startService / stopService / stopSelf / stopSelfResult
( 2 ) bindService / unbindService

Start方式的特点:
服务跟启动源没有任何联系
无法得到服务对象

Bind方式特点:
通过IBinder接口实例,返回一个ServiceConnection对象给启动源
通过ServiceConnection对象的相关方法可以得到Service对象

2.远程服务(Remote Service)Android系统内部的应用程序之间
定义IBinder接口

服务分两种:本地服务和远程服务
本地服务是程序内的服务有两套启动机制(startService、stopService、stopSelf、stopSelfResult)和(bindService、unbindService)
远程服务是同一个Android系统中的应用程序间的服务。有IBinder接口


StartService
1. 使用方法:
(1)写一个MyStartService.class继承自Service,重写它的各种方法onCreate()onStartCommand()onDestory()
(2)在AndroidManifest.xml中注册这个Service以及name
(3)在主线程Activity中通过startSerice(intent)方式启动
(4)通过stopService(intent)方式停止
2. 关于StartService
(1)启动方式是通过启动intent方式实现
(2)启动之后该Service和启动源没有关系,即使主线程退出了,service还会继续运行
//@Service启动与停止

public void doClick(View v){
    switch (v.getId()) {
    case R.id.start:
        intent1=new Intent(MainActivity.this, MyStartService.class);
        startService(intent1);
        break;

    case R.id.stop:
        stopService(intent1);
        break;
    }
}
//另类
public class MyStartService extends Service {

    public void onCreate() {
        Log.i("TAG", "Service_onCreate");
        super.

    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("TAG", "Service_onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    public void onDestroy() {
        Log.i("TAG", "Service_onDestroy");
        super.onDestroy();
    }

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

//Ps:开启后onCreate只会调用一次,再点击StartService不会再调用,直接调用onStartCommand。

public void doClick(View v){
    switch (v.getId()) {
    case R.id.start:
        intent1=new Intent(MainActivity.this, MyStartService.class);
        startService(intent1);
        break;

    case R.id.stop:
        stopService(intent1);
        break;

    case R.id.bind:
        intent2=new Intent(MainActivity.this,MyBindService.class);
        startService(intent2);//有必要时推荐:结合使用
        //↓↓↓第三个参数:是自动创建↓↓↓
        bindService(intent2, conn, BIND_AUTO_CREATE);
        break;

    case R.id.play:
        bindservice.play();
        break;
    //...//其他三个类似

    case R.id.unbind:
        unbindService(conn);
        break;
    }
}

//Ps1:而BindService开启后onCreate和onBind都只调用一次,再点击也不会调用。

//Ps2:StopService点击多次,只调用一次,但是不会报错;而UnBindService点击多次,虽只调用一次,但是会报错。

//@启动源(个人理解:Activity):
//Start方式:可以不需要界面(UI),但是服务还存在,但是数据不能返回。
//Bind方式:与界面共存亡。
//**有必要推荐Start与Bind一起结合使用。
public class MainActivity extends Activity {
    Intent intent1;
    Intent intent2;
    MyBindService bindservice;
    ServiceConnection conn = new ServiceConnection() {

        @Override
        //当启动源跟Service的连接意外丢失的时候会调用这个方法
        //,但是当Service取消绑定是不会调用这个方法的。
        //如:当Service崩溃了或被强行杀死了。
        public void onServiceDisconnected(ComponentName name) {
            //Disconnected == 断开连接
        }

        @Override
        //当启动源跟Service成功连接之后将会自动调用这个方法
        public void onServiceConnected(ComponentName name, IBinder binder) {
            bindservice = ((MyBinder)binder).getService();
        }
    };
    @Override
    protected void onCreate(...) {
    ...
}

@Override
//如果结合使用startService(Intent intent),一定要调用这个重写这个方法。
protected void onDestroy() {
    super.onDestroy();
    stopService(intent2);
    unbindService(conn);
}
//具体步骤:1)
Intent intent = new Intent(上下文, 目标服务名.class);//连接
bindService(intent, conn, Service.BIND_AUTO_CREATE);//绑定

//2)在自定义的服务类中通过自定义一个内部类:来返回服务本身
public class MyBinder extends Binder {
    public MyBindService getService() {
        return MyBindService.this;// 获取服务
    }
}
//同时在自定义服务类重写父类Service的方法:该方法可返回服务本身.
public IBinder onBind(Intent intent) {
    return new MyBinder();
}

//3)初始化ServiceConnection接口,在接口方法中重写方法
public void onServiceConnected(ComponentName name, IBinder service) {
    //大类转化为自身的小类,获取内部类中的方法,从而获得服务本身
    myBindService = ((MyBinder)service).getService();
}

//4)在自定义的继承于Servic类的类中,添加需要的方法,在启动Service的Activity中可以直接调用服务中的方法。
public class MyBindService extends Service {

    @Override
    public void onCreate() {
        Log.i("TAG", "BindService_onCreate");
        super.onCreate();
    }

    @Override
    public void unbindService(ServiceConnection conn) {
        Log.i("TAG", "BindService_unbindService");
        super.unbindService(conn);
    }

    public class MyBinder extends Binder{
        public MyBindService getService(){
            return MyBindService.this;//返回当前服务对象
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.i("TAG", "BindService_onBind");
        return new MyBinder();//返回一个数据类
    }

    @Override
    public void onDestroy() {
        Log.i("TAG", "BindService_onDestroy");
        super.onDestroy();
    }

    public void play(){
        Log.i("TAG", "播放");
    }
    //其他三个类似
}

服务的两种启动方式:
1.通过startService(Intent intent)启动,stopService(Intent intent)停止,比较简单。服务启动后与启动源无关,也无返回服务本身。需注意要在配置文件中注册服务。
2.通过bindService(Intent intent,ServiceConnection conn,int flags)绑定服务启动,unbindService(ServiceConnection conn)去绑定停止,该方式可以返回服务本身,与启动源相关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值