zoukankan      html  css  js  c++  java
  • [android] 绑定方式开启服务&调用服务的方法

    需求:后台开启一个唱歌服务,这个服务里面有个方法切换歌曲

    新建一个SingService继承系统Service

    重写onCreate()onDestory()方法

    填一个自定义的方法changeSing(String songNume)

    主界面里,开启服务,关闭服务,更改歌曲的按钮

    我们调用api开启服务,这是系统new出来的,我们没有得到SingService对象,因此没法调方法

    由于系统框架在创建对象的时候会创建与之对应的上下文,我们自己直接new是得不到上下文的

    通过bindService()方法,可以间接建立对Service对象的关系

    bindService(service,conn,flags),参数:serviceIntent对象,connServiceConnection对象中间人不能为空,选项BIND_AUTO_CREATE,如果不存在就创建

    ServiceConnection类是个接口,创建一个内部类MyConn实现这个接口

    两个实现方法onServiceConnected()方法和onServiceDisconnected()方法

    在绑定服务的时候会调用SingService对象的onBind()方法,在这个方法里面会返回一个IBinder对象

    onServiceConnected()回调方法里成功绑定以后会得到一个IBInder对象

    因为IBinder类是一个接口,因此在SingService里面创建一个公共内部类,MyBinder继承一个实现类Binder,自定义方法callChangeSing(String name),在这个方法里面调用外部类SingServicchangeSing方法。

     

    这样设计的原因是,有限的暴露一些方法给别的组件调用,为了安全起见,支付宝里面绑定远程服务,也用到了这个

    这只是演示代码,正常应该是代理人是一个私有的类,把想暴露的方法抽象到一个接口里面,代理人类实现这个接口,代理人类里面还有一些私有方法,这样当我们返回代理人对象的时候,必须向上转型一下,因此就可以保护代理人类里面的私有方法

     MainActivity.java

    package com.tsh.mybindservice;
    
    import com.tsh.mybindservice.SingService.MyIBinder;
    
    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    
    public class MainActivity extends Activity {
        private SingService.MyIBinder ibinder;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
    
    
        // 联系代理人的纽带
        private class MyConn implements ServiceConnection {
    
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                System.out.println("代理人对象返回来了");
                ibinder = (MyIBinder) service;
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
            }
        }
        // 绑定服务
        public void startSing(View v) {
            Intent intent = new Intent(this, SingService.class);
            bindService(intent, new MyConn(), BIND_AUTO_CREATE);
        }
        // 切换歌曲
        public void changeSing(View v) {
            ibinder.callChangeSing("月亮之上");
        }
    }

    SingService.java

    package com.tsh.mybindservice;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.Binder;
    import android.os.IBinder;
    import android.widget.Toast;
    
    public class SingService extends Service {
        //绑定后的回调
        @Override
        public IBinder onBind(Intent intent) {
            System.out.println("服务被绑定了");
            return new MyIBinder();
        }
        //代理人
        public class MyIBinder extends Binder{
            public void callChangeSing(String song){
                //调用外部类的方法
                changeSing(song);
            }
        }
        //切换歌曲
        public void changeSing(String song){
            Toast.makeText(getApplicationContext(), "切换歌曲"+song, 0).show();
        }
    }
  • 相关阅读:
    【Python大系】Python快速教程
    【Linux大系】Linux的概念与体系
    【Java大系】Java快速教程
    【夯实PHP系列】PHP正则表达式
    【PHP夯实基础系列】PHP日期,文件系统等知识点
    【夯实PHP系列】购物车代码说明PHP的匿名函数
    2016.09.21 公司裁员想到的
    使用android-junit-report.jar导出单元测试报告
    APK无源码使用Robotium简单总结
    Android环境安装简单总结
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5339247.html
Copyright © 2011-2022 走看看