android service总结

一.Service 简介

Service是android 系统中的四大组件之一,是一种可以在后台执行长时间运行操作而没有用户界面的应用组件。Service通常总是称之为“后台服务”,它的运行不依赖于任何用户界面,适用于去执行那些不需要和用户交互而且还要求长期运行的任务。

  1. Service不依赖于用户可视的UI界面并不是绝对的,如前台Service就是与Notification界面结合使用的
  2. Service的后台运行并不是子线程,Service的运行是在主线程中进行的,只是它没有界面显示而已,它的耗时操作同样需要开启子线程,否者会跟Activity一样出现ANR
二.Service 的分类
  1. 本地服务(Local)
    Service 服务依附在主进程(App所在的进程)上而不是独立的进程,进程(App)被Kill后,服务便会终止。使用本地服务因为是在同一进程,因此不需要进程间通信(IPC、AIDL)。
  2. 远程服务(Remote)
    服务为独立的进程,属于常驻性服务,对应进程名格式为所在包名加上你指定的android:process字符串。由于是独立的进程,当Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,通信时,需要使用AIDL进行IPC进程通信
三.Service 的启动模式

创建一个 TestService 服务

public class TestService extends Service {

 private MyBinder mBinder=new MyBinder();

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
  //自定义一个Binder 
 public class MyBinder extends Binder {
      //定义一个方法,用于返回TestService的实例
      public TestService getService() {
          return TestService.this;
      }
  }
}

在AndroidManifest中注册服务 TestService

    <service
            android:name=".service.TestService"
            //远程服务需要添加 android:process属性
            android:process=":remote" />

startService 启动的服务

Intent intent = new Intent(this, TestService.class);
//开启服务
startService(intent);
//停止服务
stopService(intent);

启动服务startService : –>onCreate()–> onStart()
停止服务stopService : –>onDestroy()

//开启service
onCreate()
onStartCommand()
onStart()
//停止service
onDestroy()
  • onCreate()
    1.如果service没被创建过,调用startService()后会执行onCreate()
    2.如果service已处于运行中,调用startService()不会执行onCreate()方法,也就是说,onCreate()只会
    在第一次创建service时候调用,多次执行startService()不会重复调用onCreate(),此方法适合完成一
    些初始化工作。
  • onStartCommand()、 onStart()(已过时)
    如果多次调用startService()方法,那么Service的onStartCommand()和onStart()方法也会相应的多次调用。onStartCommand()方法很重要,我们在该方法中根据传入的Intent参数进行实际的操作,比如会在此处创建一个线程用于下载数据或播放音乐等
  • onDestory()
    1.如果service没有销毁,调用startService()或者service的stopSelf()方法,调用onDestory()方法
    2.如果service已销毁,service不会调用任何方法

bindService 启动的服务

    private boolean isBind = false;
    private Intent intent;
    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.e(TAG,"the service connected");
            isBind = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            isBind=false;
            Log.e(TAG,"the service disconnected");
        }
    };
   // 绑定服务
  intent = new Intent(this, TestService.class);
  bindService(intent, connection, BIND_AUTO_CREATE);
  //解除绑定
  unbindService(connection);

1.绑定bindService : –> onCreate() –> onBind()
2.解绑unbindService: –>onUnbind() –>onDestroy()

//绑定服务
onCreate()
onBind()
the service connected
//解除绑定
onUnbind()
onDestroy()
  • onCreate()
    如果service没被创建过,调用bindService ()后会执行onCreate()
  • onBind()
    1.如果service没被创建过且没有调用bindService ()过,调用bindService ()后会执行onBind()
    2.如果已调用bindService ()过,onBind()将不会执行
  • onUnbind()
    如果已调用bindService () 过,调用unbindService ()方法会执行onUnbind()方法
  • onDestroy()
    如果service没有销毁,调用unbindService ()方法会执行onDestory()方法

注意:
1.在没有调用bindService()之前,调用unbindService()会报” Service not registered ” 错误,所以 bindService 启动的服务时,要使用服务绑定标记isBind 避免这一情况
2.调用bindService()时,如果 service 的onBind() 方法结果返回null,ServiceConnection 中重写的
onServiceConnected()方法将不会执行
3.调用unbindService()方法时,ServiceConnection 中的onServiceDisconnected()方法正常情况下会执行,Service服务被异外销毁时会执行,例如内存的资源不足时这个方法才被自动调用。
4.在两种服务混合使用时,会出现以下情况
(1)先用startService()启动服务,会执行onCreate()–> onStart() ,然后调用bindService()方法,会执行onBind()方法,现在调用stopService()方法,service不会被销毁,只有调用unbindServcie()方法,service才会被销毁,执行onUnbind() –>onDestroy()
(2) 先用bindService()启动服务,会执行onCreate()–> onBind() ,然后调用startService()方法,会执行onStartCommand()–>onStart() 方法,现在调用stopService()方法,service不会执行任何方法,只有调用unbindServcie()方法,service才会被销毁,执行onUnbind() –>onDestroy()
(3)先调用startService()启动服务,然后调用unbindServcie()方法,service不会执行任何方法。或者,先调用bindService()方法启动服务,然后调用stopServcie()方法,service不会执行任何方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值