• 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

  • 相关阅读:
    42. Trapping Rain Water
    223. Rectangle Area
    645. Set Mismatch
    541. Reverse String II
    675. Cut Off Trees for Golf Event
    安装 VsCode 插件安装以及配置
    向上取整 向下取整 四舍五入 产生100以内随机数
    JS 判断是否为数字 数字型特殊值
    移动端初始配置,兼容不同浏览器的渲染内核
    Flex移动布局中单行和双行布局的区别以及使用
  • 原文地址:https://www.cnblogs.com/maogefff/p/8422986.html
Copyright © 2020-2023  润新知