Service的概念与使用

来源:互联网 发布:做网站 知乎 编辑:程序博客网 时间:2024/05/17 01:44

概述:

Service即服务,与Activity,ContentProvider,BroadcastReceiver并称Android程序的四大组件。

在程序后台运行,不可见,难以被Android系统自动杀死。

服务分为本地服务和远程服务,本地服务即为在程序内部使用的服务,而远程服务是在Android系统内的程序与程序之间使用。


用途举例:
后台保持播放音乐、记录地理位置变动、监听部分动作等等。

注意事项:

运行在主线程,所以不能用来做耗时操作,可以在服务中开子线程来做耗时操作。


本地服务的启动与停止:
有两种启动方式,分别是start和bind。
start方式是由startService方法启动,stopService方法,stopSelf方法,stopSelfResult方法停止。
bind方式则是bindService方法,要停止则要先unbindService。


远程服务:
远程服务用于系统内的程序和程序之间,需要定义IBinder接口


生命周期:
根据服务的启动方式,服务的生命周期由两部分组成。
start方式启动的服务的生命周期:onCreate()->onStartCommand()->running->onDestroy()->结束。

bind方式启动的服务的生命周期:onCreate()->onBind()->服务和启动源绑定->onUnbind()->onDestroy()->结束。

running时,可以自行停止或通过启动源停止,当执行了stopService方法,会调用onDestroy()。
当执行了unbindService(),会调用onUnbind()。


特点:
Start方式特点:
服务跟启动源无联系,也无法得到服务对象。
Bind方式特点:
通过Ibinder接口实例,返回ServiceConnection对象给启动源,通过ServiceConnection对象的相关方法能得到Service对象。


Start方式启动(例):

//先要在记录文件中进行记录:<service android:name="所写的Service类"> </service>
服务类:
public class Startservice extends Service{   @Override   public IBinder onBind(Intent intent)  //这里要重写onBind方法  {        return null;   }}
Activity中:
Intent intent=new Intent(当前Activity对象,服务类的class);  startService(intent);  ...  stopService(intent);

Bind方式启动(例):

依旧是先在Android程序的记录文件中进行记录。

服务类:

  public class MyBind extends Service {    public class MyBinder extends Binder    //定义MyBinder内部类。  {      public MyBind getit()     {       return MyBind.this;     }   }     public IBinder onBind(Intent intent)    {      return new MyBinder();    }    public void unbindService(ServiceConnection conn)  {    super.unbindService(conn);  }}

Activity中:

     MyBind mb;     ......   ServiceConnection con=new ServiceConnection()   {    public void onServiceDisconnected(ComponentName name) //Service的启动源与Service的连接丢失时,该方法会被调用。   {                                                             }     public void onServiceConnected(ComponentName name,IBinder service) //Service的启动源与Service连接成功后,该方法会被调用。   {                                                                                                                                                     mb=((MyBinder)service).getit();   //然后后面就可以用这个mb来调用这个服务类里定义的部分方法。    }   };   ......   Intent intent2=new Intent(当前Activity对象,MyBind.class);   bindService(intent2,con,Service.BIND_AUTO_CREATE);   ......   unbindService(con);



注:如果start和bind方式一起使用,要注意先stopService,再unbindService。



原创粉丝点击