美文网首页
2.3基础知识-Service

2.3基础知识-Service

作者: 205蚁 | 来源:发表于2018-11-09 07:34 被阅读0次

    Service详解

    1.Service是什么
    
    2.service的应用场景,以及和Thread区别
    
    3.开启Service的两种方式以及区别
    

    1.Service是什么?

    四大组件之一,执行某些需要长时间需要执行,程序退出时任能在后台存在
    
    Service(服务)是一个一种可以在后台执行长时间操作而没有用户界面的应用组件
    
    Service和广播BroadcastRecever 共同点:运行在主进程,都不能做长时间的耗时操作
    

    2.Service的应用场景,以及和Thread区别

    1.定义:Thread程序执行的最小单元,执行一些异步操作

    service是android的机制,本地service,thread运行相对独立,service依托于所在进程
    
    service和thread是什么关系,有什么区别,什么时候用service,什么时候用thread
    
    service和thread没有关系。服务和后台的概念不能混淆,service运行在主线程
    
    android的后台(service)指的是运行完全不依赖于UI线程, 及时Activity被销毁,回收,Service仍然可以运行
    
    service不能做耗时操作,耗时操作需要创建thread
    
    Activity很难对thread进行控制,特别是Activity被销毁后,无法控制
    
    总结:定义上,thread是程序执行的最小单元,是分配cpu的基本单位。service是android的一种机制,是进程托管,是一种轻量级的ipc,Activity和service绑定,数据通信,也可以在不同的进程中,通信可用ipc
    
    ANR异常,无法响应
    

    2.实际开发中:service运行在主线程

    3.应用场景:使用网络,文件查询,使用工作线程即开启子线程处理

        不需要界面长时间执行的常见,播放音乐,天气预报的统计,数据统计等等
    

    3.开启Service的两种方式以及区别

        onBind():**bindService方式执行**
    
        onCreate():首次创建服务时,系统将调用此方法执行一次新设置程序(在调用onStartCommand() 或onBind()之前)
    
        如果服务已经在运行,则不会调用次方法,该方法只会被调用一次
    
    图1
    onStartCommand(): 每次通过startService()方法启动service时都会被回调
    
    返回值:int类型
    
        源码中:
    
            public int onStartCommand(Intent intent,int flgas,int startId){
    
                onStart(intent,startId);
    
                return mStartComptibility?START_STICK_COMPATIBLITY:START_STICKY;
    
            }
    
        START_STICKY:当整个service因为系统内存不足被整个杀掉后,一段时间系统空闲时,系统会尝试重新创建这个Service,service将重新启动,但其中的intent将是为空。
    
        这个值适合循环播放播放,音乐播放器,天气预报这类服务
    
        onDestroy():服务销毁时的回调:
    
        可以在这里做回收工作,清理释放资源。1.线程,2.注册的监听器 3.ContentProvider
    
        unBind():服务解除绑定时的回调
    

    1.startService方式启动

        步骤:1.定义一个类继承Service
    
                  2.在Manifest.xml文件中配置该Service
    
                  3.使用Context的startService(Intent)方法启动该Service
    
                  4.不再使用时,调用stopService(intent)方法停止该服务
    
                生命周期:1.onCreate->onStartCommand
    
                再次启动 onStartCommand
    
                  停止:->onDestory()  
    

    2.bindService:bind绑定方式提供了客户端和服务端的接口

        相当于Activity和Service交互的接口,允许二者数据交互,发送请求,获取结果等等,甚至Activity和Service在不同进程中时,可以进行进程中通信来传输数据,这需要在Service被绑定到Activity之后才运行
    
        同时,多个Activity可以绑定一个Service,但是绑定全部取消后Service就会自动销毁,他并不一定需要向startService方式一样,需要显示stopService才会销毁
    
        **步骤:**
    
                1.创建BinderService服务端,继承自Service,并在类中创建一个实现了IBinder接口的实例对象,该对象提供了公共方法给客户端调用
    
                2.从onBinder()回调方法中返回次Binder实例对象。
    
                3.在客户端中,从onServiceConntected()方法中回调方法接收Binder,并使用提供的方法调用绑定服务。
    

    举例:

    
            public class BindService extends Service{
                private final static String TAG = "BindService";
                private int count;//客户端会需要
                private boolean quit;
                private Thread thread;
                private LocalBinder binder = new LocalBinder();
                
                //创建Binder对象,返回给客户端即Activity使用,提供数据交互的接口
                public class LocalBinder entends Binder{
                    //声明一个方法,getService(提供给客户端使用)
                    BinderService getService(){
                        //返回当前对象的LocalService,这样我们就可以在客户端调用Service的公共方法了
                        return BindService.this;
                    }
                }
                
                //把Binder类返回给客户端
                public IBinder onBind(Intent intent){
                    return binder;
                }
                
                public void onCreate(){
                    super.onCreate();
                    log.i(TAG,"Service is invoke Created");
                    thread = new Thread(new Runnable(){
                        public void run(){
                            //每隔一秒count加1,直到quit为true
                            while(!quit){
                                thread.sleep(1000)
                                count ++;
                            }
                        }
                    })
                }
                
                //公共方法
                public int getCount(return count;)
                
                //解除绑定时调用
                public boolean onUnbind(Intent intent){
                    return super.onUnbind(intent);
                }
                
                public void onDestroy(){
                    this.quit = true;
                    super.onDestroy();
                }
            }
    

    Activity中:

            conn = new ServiceConnection({
                //与服务端交互的接口方法,绑定服务的时候被回调,在这个方法获取绑定Service传递过来的IBinder对象,通过这个IBinder对象,实现宿主和Service的交互
                public void onServiceConnected(ComponentName name,IBinder ibinder){
                    BindService.LocalBinder binder = (BindService.LocalBinder)ibinder;
                    mService = binder.getService();
                }
                
                //当取消绑定的时候被回调,但正常情况下是不被调用的,它的调用时机是当Service服务被意外销毁时,例如内存的资源不足时这个方法才被自动调用
                
                public void onServiceDisconnected(ComponentName name){
                    mService = null;
                }
            }
            
            bindService(intent,conn,Service.BIND_AUTO_CREATE);
    
            生命周期:bindService后:
                        1.onCreate->onBind
                        再次绑定->不会走onBind,但如果是bind新的ServiceConnection会走onBind方法
                        解除完绑定会走onUnBind和onDestroy方法
            当start和bind都使用时,只有当stop和unbind解除完后Service才会被销毁
    

    相关文章

      网友评论

          本文标题:2.3基础知识-Service

          本文链接:https://www.haomeiwen.com/subject/nyhnxqtx.html