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

新建一个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

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();
}
}

最新文章

  1. [转] 从知名外企到创业公司做CTO是一种怎样的体验?
  2. sql 取新的列名含义
  3. fullPage.js学习笔记
  4. 解决OracleConnection ORA-1017 和 HRESULT:0x8007000B 错误
  5. Linux系统安装-系统分区
  6. 【POJ2778】DNA Sequence(AC自动机,DP)
  7. maven-腾讯SDK(QQ)接口java引入pom配置
  8. 让我们一起Go(十一)
  9. 蓝牙Profile的概念和常见种类
  10. js创建下载文件
  11. thinkphp CURD 1
  12. spring mvc和swagger整合
  13. [ExtJS5学习笔记]第十七节 Extjs5的panel组件增加accodion成为折叠导航栏
  14. JAVA_AesCBC例子
  15. 超好用的Vim配置
  16. js- DOM事件之按钮绑定函数注意事项
  17. vue中使用第三方UI库的移动端rem适配方案
  18. hadoop 伪分布式安装
  19. java中的Map
  20. ASP.NET Core 2.1 源码学习之 Options[3]:IOptionsMonitor

热门文章

  1. 管道/FIFO
  2. eclipse 工作区空格和回车键显示为乱码
  3. 关于iOS与html交互,隐藏或修改html标签内容
  4. [转]Rapidly detecting large flows, sFlow vs. NetFlow/IPFIX
  5. MySQL 游标(PREPARE预处理语句)
  6. 【2016年终大典】i春秋一年中不可错过的安全精华
  7. 微博第三方登录使用social_django实现显示登陆的用户名
  8. 第70节:Java中xml和tomcat
  9. 移动端点击事件300ms延迟问题解决方案——fastclick.js
  10. Oracle报错#“ORA-01791: 不是 SELECTed 表达式”解决方法