一、前言
Service是Android四大组件之一,多用于服务,像微信这种永远杀不死的后台进程据说就是用Service做的,此话并不是说Service杀不死,而是每当你启动了微信,微信的就会在后台启动两个Service,一个负责做功能,另一个负责唤醒功能的Service,当你手动去杀微信微信进程时,即使负责功能的Service被杀死了,负责唤醒的Service就会重新唤醒负责功能的Service,所以给我们展示的效果就是微信进程永远杀不死的神奇现象。
有些码农可能认为Activity不可以做这些事情吗?为什么飞到Service来做,这就要牵涉到Service的特点,它和Activity最大的区别就是Activity有界面,二Service没有,所以它是可以运行于后台的。
二、自定义Service使用
1、自定义Service,继承Service,当然Service也有自己的生命周期,类似于Activity,因为Service是在后台运行的,所以它的生命周期相对来说没那么重要,只需理解掌即可。
2、需要在manifests中去注册,我们说过manifests中可以注册四大组件的任意一个,有些是必须要注册的,有些事非必需的,理解记忆
<!-- 注册Service --> <service android:name=".MyService" />
3、启动Service:这里类比Activity的跳转,Service的启动也分显示启动和隐式启动
显示启动:
Intent intent = new Intent(); intent.setClass(this, MyService.class); startService(intent);
隐式启动:
<!-- 注册Service --> <service android:name=".MyService"> <action android:name="qd" /> </service>
4、绑定服务:Service的绑定是通过ServiceConnection对象绑定的,由于ServiceConnection本身是个接口类,初始化ServiceConnection对象需要重写两个抽象方法:onServiceConnected和onServiceDisConnected,分别在建立连接和断开连接时调用
/** * 绑定服务 */ public void btn03(View v) { Intent intent = new Intent(this, MyService.class); bindService(intent, serviceConnection, BIND_AUTO_CREATE);//绑定服务 Log.e("TAL", "1>>>" + myIBinder); } /** * ServiceConnection */ public ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //建立连接 myIBinder = (MyService.MyIBinder) service; Log.e("TAL", "2>>>" + myIBinder); } @Override public void onServiceDisconnected(ComponentName name) { //断开连接 } };
5、在绑定服务成功后,如果想要通过Activity来调取Service类里的方法,需要在Service中新建一个Binder对象,并在Service的OnBind方法中返回此对象,那么在Activity的ServiceConnection中就可以对onServiceConnected的IBinder对象全局赋值并使用了
/** * 自定义IBinder * <p> * # 1 实现IBinder * <p> * # 2 继承Binder */ public class MyIBinder extends Binder { } @Nullable @Override public IBinder onBind(Intent intent) { Log.e("TAL", "onBind"); return new MyIBinder(); }
6、服务也可销毁
/** * 关闭服务 */ public void btn02(View v) { stopService(new Intent(this, MyService.class)); }
三、总结
1、服务一般用于做不需要界面展示的工作,比如短信拦截、音乐播放器后台播放
2、服务不和Activity同生共死,一般在Activity的finish的方法中调用stopService即可做到在关闭Activity的时候关闭服务