[android] 绑定方式开启服务&调用服务的方法
需求:后台开启一个唱歌服务,这个服务里面有个方法切换歌曲
新建一个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();
}
}
[android] 绑定方式开启服务&调用服务的方法的更多相关文章
- Android(java)学习笔记229:服务(service)之绑定服务调用服务里面的方法 (采用接口隐藏代码内部实现)
1.接口 接口可以隐藏代码内部的细节,只暴露程序员想暴露的方法 2.利用上面的思想优化之前的案例:服务(service)之绑定服务调用服务里面的方法,如下: (1)这里MainActivity.jav ...
- Android(java)学习笔记228:服务(service)之绑定服务调用服务里面的方法
1.绑定服务调用服务里面的方法,图解: 步骤: (1)在Activity代码里面绑定 bindService(),以bind的方式开启服务 : bindServ ...
- Android(java)学习笔记172:服务(service)之绑定服务调用服务里面的方法 (采用接口隐藏代码内部实现)
1. 接口 接口可以隐藏代码内部的细节,只暴露程序员想暴露的方法 2. 利用上面的思想优化之前的案例:服务(service)之绑定服务调用服务里面的方法,如下: (1)这里MainActivity.j ...
- Android(java)学习笔记171:服务(service)之绑定服务调用服务里面的方法
1.绑定服务调用服务里面的方法,图解: 步骤: (1)在Activity代码里面绑定 bindService(),以bind的方式开启服务 : bindServ ...
- 绑定方式开始服务&调用服务的方法
1.编写activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi ...
- Android--绑定服务调用服务的方法
Service依照其启动的方式,可分为两种: 1.Started Started的Service.通过在Application里用startService(Intent intent)方法来启动.这样 ...
- SpringCloud实战-Feign声明式服务调用
在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率 ...
- SpringCloud-Feign声明式服务调用
在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率 ...
- Dubbo——服务调用过程
文章目录 引言 服务的交互 服务降级 集群容错 服务调用 服务端接收请求 总结 引言 经过之前文章的铺垫,现在可以来分析服务的交互调用过程了. 服务的交互 服务降级 从名字上看我们不难理解MockCl ...
随机推荐
- MySQL基础操作1
1.进入MySQL的两种方式: (1).MySQL自带的控制台 直接输入密码 (2).命令提示符: mysql -uroot -proot 然后再输入密码 MySQL常用指令 ------- 1.启动 ...
- unigui+fastReport实现web打印方案
近日单位需要用到会议通知单的打印功能,故引出篇. unigui是delphi环境下快速开发web应用的优秀工具,不再赘述,下面直接记录使用搭配使用,基本逻辑就是: unigui实现数据录入和浏览的we ...
- Xcode中SVN不能提交.a文件的解决方法
我是搬运工!!!方便自己使用!!! 方案一: 在mac下很多svn管理工具默认都不能上传.a文件,这让人很苦恼.从网上扒了下,用命令行可以解决此问题. 打开终端,cd 进入到需要上传的.a文件所在的文 ...
- [转]Request Flow for Provisioning Instance in Openstack
One of the most important use-case in any cloud is provisioning a VM . In this article we shall do ...
- C#轻量级通通讯组件StriveEngine —— C/S通信开源demo(2) —— 使用二进制协议 (附源码)
前段时间,有几个研究ESFramework通信框架的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好友关 ...
- Jenkins可用环境变量列表以及环境变量的使用(Shell/Command/Maven/Ant)
一.可用环境变量列表(以下来自google翻译): BRANCH_NAME 对于多分支项目,这将被设置为正在构建的分支的名称,例如,如果您希望从而master不是从特征分支部署到生产. CHANGE_ ...
- JVM垃圾收集器与内存分配策略(一)
在前面的Java自动内存管理机制(上)和Java自动内存管理机制(下)中介绍了关于JVM的一些基础知识,包括运行时数据区域划分和一些简单的参数配置,而其中也谈到了GC,但是没有深入了解,所以这里开始简 ...
- 1.TabActivity、视图树、动画
整个页面为TabActivity, 其中对TabWidget进行了一些改变,当切换页签时页签后面红色背景会以Translate动画形式移动到相对应的页签后. 布局 )); lastPosition = ...
- C#退出窗体的总结方法
一.关闭窗体 在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.ExitThread(); System.En ...
- Python档案袋( 时间 和 随机数 模块 )
时间模块 #导入必要模块 import time #获取时间戳 print(time.time()) #输出:1547651016.03502 #格式化时间元组 # 参数可传递自定义的时间戳,如:ti ...