• Android四大组件--服务(Service)


    1. startService和bindService的区别

    1. startService:

    生命周期: onCreate---onStartCommand---onDestory

    与服务的通讯: 无法与服务进行直接通讯

    与开启者的关系: 服务一旦开启与开启者(activity)将没有什么联系了,就算开启者销毁了,服务依然存活。

    在Settings应用界面中有显示


    2. binderSerivce

    生命周期: onCreate--onBind--onUnBind--onDestory

    与服务通讯: 通过内部代理对象间接调用服务的方法

    与开启者的关系: 一旦开启者销毁了,那么服务也将随之销毁。

    在Settings应用界面无显示

    startService和binderSerivce各自的优缺点:

    能不能让服务长期运行在后台,并且还能与服务进行通讯

    startService : 让服务长期运行在后台,但是无法与服务进行通讯

    bindServcie : 可以与服务进行通讯,但是无法长期运行在后台

    2. 本地服务通讯(服务运行在当前的应用程序里面)

    1. 定义服务

    public class ServcieDemo extends Service {}

    2. 注册服务

    <service android:name="com.itheima.bind.ServcieDemo"></service>

    3. 编写服务的方法

    /**
    * 服务中的内部方法
    */
    public void methodInService(String name , int money){
        if(money <= 100000){
            Log.d(this, name+"测试1");
        }else{
            Log.d(this,name+"测试2");
        }
    }


    4. 定义一个内部类

    /**
    *内部代理对象
    */
    class MyBinder extends Binder{
        /**
        * 内部人员中固有的方法,它的作用就让别人来访问它,然后它自己去访问服务中的方法。
        * 通过迂回的手段达到从外部类调用服务中的方法效果。
        * @param name
        * @param money
        */
        public void callMethodInService(String name , int money){
            methodInService(name , money);
        }
    }


    5. 服务绑定后返回内部代理对象

    /**
    * 如果服务成功绑定上了,那么就返回一个通讯频道,
    * 返回一个内部代理对象
    */
    @Override
    public IBinder onBind(Intent intent) {
        System.out.println("onBind");
        //返回内部代理对象
        return new MyBinder();
    }


    6. 在activity绑定服务

    //绑定服务
    public void bind(View v) {
        Intent service = new Intent(this , ServcieDemo.class);
        /**
        * 第一个参数:intent对象
        * 第二个参数:servcieConnection 用于监听服务当前的状态
        * 第三个参数:BIND_AUTO_CREATE 服务自动创建,然后绑定。
        */
        bindService(service, new MyConn(), BIND_AUTO_CREATE);
    }


    7. 在onServcieConnected方法中获取到内部代理对象

    /**
    * 监听服务的状态,服务是启动还是停止都会收到信息。
    */
    class MyConn implements ServiceConnection{
        /**
        * 如果服务能够成功绑定上,那么这个方法将会调用,启动的参数service就是服务返回的内部对象 MyBinder
        */
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //获取到服务内部返回的代理对象 ,用binder承接起来
            binder = (MyBinder) service;
        }
        
        @Override
        public void onServiceDisconnected(ComponentName name) {}
    }


    8. 在其他地方调用内部对象中的方法

    //调用服务的方法
    public void call(View v) {
        //通过内部代理对象,调用内部 类中的方法,实际上是调用了服务中的方法
        binder.callMethodInService("张三丰", 1000000);
    }

    3. 远程服务通讯(服务运行在其他的应用程序里面,通过AIDL进行通讯)

    远程服务通讯Service(Remote--AIDL)

    4. 系统服务(服务运行在系统当中,通过getsystemService去调用)

    系统服务Service

  • 相关阅读:
    Android studio开发找不到HttpClient问题
    Android studio开发找不到HttpClient问题
    互联网应用之传递HTTP参数
    互联网应用之传递HTTP参数
    计算机组成原理
    计算机组成原理
    【NYOJ】[40]公约数和公倍数
    【NYOJ】[40]公约数和公倍数
    【NYOJ】[39]水仙花数
    【NYOJ】[39]水仙花数
  • 原文地址:https://www.cnblogs.com/maogefff/p/8422986.html
Copyright © 2020-2023  润新知