zoukankan      html  css  js  c++  java
  • Service 入门

    如果把Activity比喻为前台程序,那么Service就是后台程序,Service的整个生命周期都只会在后台执行。Service跟 Activity一样也由Intent调用。在工程里想要添加一个Service,先新建继承Service的类,然后到 AndroidManifest.xml -> Application ->Application Nodes中的Service标签中添加。

    Service要由Activity通过startService 或者 bindService来启动,Intent负责传递参数。

    startService与bindService都可以启动Service,那么它们之间有什么区别呢?它们两者的区别就是使Service的周期改变。由 startService启动的Service必须要有stopService来结束Service,不调用stopService则会造成 Activity结束了而Service还运行着。bindService启动的Service可以由unbindService来结束,也可以在 Activity结束之后(onDestroy)自动结束。

    Service的生命周期

          Service有startService()和bindService()两种启动Service方法,每种方法Service的生命周期是不一样的。

         1 通过startService()
           Service会经历 onCreate --> onStartCommand()    注: onStartCommand()方法可代替onStart()方法,但测试得两个方法都调用了顺序为  onCreate()-->onStartCommand()-->onStart()-->onDestroy()


           stopService的时候直接onDestroy

           如果是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行。
           下次调用者再起来仍然可以stopService。

           如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次 创建服务,
    但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结 束服务

        2 通过bindService()  
           Service只会运行onCreate()-->onBind()

          这个时候 调用者和Service绑定在一起
           unbindService的时候  onUnbind()-->onDestroyed()
          调用者退出了,Srevice就会调用onUnbind()-->onDestroyed()
          所谓绑定在一起就共存亡了。 

    如果调用bindService()方法前服务已经被绑定,
    多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。

    注意:Service的onCreate的方法只会被调用一次,
    就是你无论多少次的startService又 bindService,Service只被创建一次。
    如果先是bind了,那么start的时候就直接运行Service的onStart方法,
    如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,
    只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。

    在Activity中得到绑定的Service对象:

    在Service类中:

     public class MyBinder extends Binder{
            public MyService getService(){
                return MyService.this;
            }
      }

    public IBinder onBind(Intent intent) {
            return new MyBinder();
      }

     在Activity中 :

    ServiceConnection serviceConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                MyService service = ((MyService.MyBinder) iBinder).getService();
            }

            @Override
            public void onServiceDisconnected(ComponentName componentName) {

            }
     };

  • 相关阅读:
    oss blob上传
    app中画一条细线
    antd和原生交互,原生掉前端的方法
    -webkit-touch-callout 图片下载
    ifram嵌入网址 有跨域问题
    ...state
    数组对象的复制
    在vue中使用tinymce组件
    autofs自动挂载服务
    podmen
  • 原文地址:https://www.cnblogs.com/lianghui66/p/2754807.html
Copyright © 2011-2022 走看看