Android中的Service

介绍Service

Service不需要显示用户界面,它在后台运行。默认情况下,它运行在主线程(UI线程)中,这时在Service中不宜进行耗时操作,否则可能出现ANR异常。如果需要执行耗时任务,可以创建单独的线程,或者将Service分配到新进程中;也可以使用IntentService。

Service的使用

1.创建Service子类,重写Service中比较重要的方法,如onCreate,onStartCommand,onBind,onUnbind,onDestory;
2.创建该Service的显示Intent(为了确保启动对应的Service,不要使用隐式Intent);
3.通过startService或者bindService启动Service,这两种启动方法是有区别的,后面介绍。

//创建Service子类
public class MyService extends Service {
    private final static String TAG = "MyService";

    public MyService() {
    }

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

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

    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG, "onBind");
        return null;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.i(TAG, "onUnbind");
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestroy");
    }
}
  //启动Service
  Intent intent = new Intent(MainActivity.this, MyService.class);
  startService(intent);//bindService(intent, conn, BIND_AUTO_CREATE);

Service的生命周期

Android中的Service_第1张图片
Service 生命周期

  上图是官方给出的Service生命周期图,从图中可以很明显看出调用不同的启动方法启动Service生命周期是有不同的。主要生命周期如下:

  • onCreate:在生命周期内,该方法只会调用一次,即在首次启动Service的时候,调用该方法。
  • onStartCommand:仅通过startService启动Service时会调用该方法,而且每次启动都会被调用!
  • onBind:通过bindService启动Service时将调用该方法,意味着组件与服务绑定起来了,多次调用onBind并不会重复调用onBind。
  • onUnbind:当调用unbindService时,这个方法会被调用,解除Service与组件之间的绑定。
  • onDestory:当系统调用了该方法,意味着Service被销毁。当Service自己停止或者被启动它的组件停止时,该方法被调用,而且在生命周期内只被调用一次!如果Service被多次启动,无论是startService还是bindService启动,只有在最后一个组件与Service解除关联以后,系统才会调用onDestory方法将Service销毁。在onDestory方法中一般进行资源的回收,如Thread、Listener和Reciver等。

startService和bindService

  • startService:组件通过这个方法启动Service,Service并不会将执行结果返回给启动它的组件,当这个组件被销毁了,Service还会继续执行。当然在组件中可以通过stopService停止Service。
  • bindService:组件通过这个方法启动Service,在onBind中会返回IBinder对象,这个对象用于Service与启动它的组件之间进行通信,而通过startService启动Service,两者之间并不能进行通信。

Service与Activity之间通信(同一个进程中)

从Activity中发送数据给Service比较简单,通过Intent就可以实现,在这里不详细介绍。下面介绍Activity从Service中获取数据。
  从上文可以知道IBinder是实现两者之间通信的关键,在调用onbind方法的时候返回IBinder对象到底传给谁呢?其实,在调用bindService的时候需要传一个ServiceConnection对象,这是一个接口,它定义了一个方法onServiceConnected(ComponentName name, IBinder service),第二个参数就是IBinder,显然IBinder对象传到这里了!

  • 1.IBinder是一个接口,不能创建实例,所以需要创建IBinder的实现类,一般会创建Binder(Binder已经实现了IBinder)的子类。
public class MyBinder extends Binder {
        public String getContent(){
            return mContent;
        }
    }
  • 2.实现ServiceConnection,重写onServiceConnected方法。当Activity与Service连接成功的时候,系统会自动调用这个方法。在这个方法中获取数据,那么就实现了Activity与Service之间的通信。
ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            MyService.MyBinder myBinder = (MyService.MyBinder) service;
            String content = myBinder.getContent();
            Log.i(TAG, content);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

其中,onServiceDisconnected方法是在Service崩溃或者被杀死的时候被调用的。

Service跨进程间通信

更新中。。。。。。

IntentService

更新中。。。。。。

结语

之前搭建了hexo博客,写了几篇文章,感觉比较难用而且访问速度比较慢,所以转用了,欢迎技术爱好者吐槽批评交流,如果有纰漏之处欢迎纠正;如果能对你带来一点帮助,不胜荣欣。至于打赏,你看心情,本博客主要用来分享交流,不在于赚钱,如果你偏要打赏,当然我是不会拒绝的,哈哈!

你可能感兴趣的:(Android中的Service)