美文网首页
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