前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[android] 绑定方式开启服务&调用服务的方法

[android] 绑定方式开启服务&调用服务的方法

作者头像
唯一Chat
发布2019-09-10 11:30:30
8130
发布2019-09-10 11:30:30
举报
文章被收录于专栏:陶士涵的菜地陶士涵的菜地

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

新建一个SingService继承系统Service

重写onCreate()和onDestory()方法

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

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

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

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

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

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

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

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

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

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

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

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

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

MainActivity.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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();
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-03-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档