android90 bind方式启动服务service调用service里的方法
package com.itheima.banzheng; import com.itheima.banzheng.LeaderService.ZhouMi; import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.View; public class MainActivity extends Activity { private Intent intent;
private MyServiceConn conn;
PublicBusiness pb; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(this, LeaderService.class);
conn = new MyServiceConn();//服务连接对象,成功后就调用
//绑定领导服务
bindService(intent, conn, BIND_AUTO_CREATE);//执行这个代码后服务就成功的绑定了连接就建立了,连接后会调用LeaderService的onBind方法返回IBinder对象,
} public void click(View v){
//调用服务的办证方法
pb.QianXian();//这样就可以调用LeaderService的banZheng方法,否则是不能调用LeaderService的banZheng方法的
} class MyServiceConn implements ServiceConnection{//服务连接对象
//连接服务成功(成功拿到中间人IBinder的ZhouMi对象),此方法调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//service就是中间人ZhouMi
pb = (PublicBusiness) service;
} @Override
public void onServiceDisconnected(ComponentName name) {
}
}
}
Service:
package com.itheima.banzheng; import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder; public class LeaderService extends Service { @Override
public IBinder onBind(Intent intent) {
// 返回一个IBinder对象,这个对象就是MainActivity和LeaderService之间的中间人对象
return new ZhouMi();//返回给了onServiceConnected的service参数
} class ZhouMi extends Binder implements PublicBusiness{
public void QianXian(){
banZheng();
} public void daMaJiang(){
System.out.println("陪李处打麻将");
}
} public void banZheng(){
System.out.println("李处帮你来办证");
}
}
接口:
package com.itheima.banzheng;
public interface PublicBusiness {
void QianXian();
}
清单文件:
<service android:name="com.itheima.banzheng.LeaderService"></service>
音乐播放器:
package com.itheima.musicplayer; import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.View; public class MainActivity extends Activity { MusicInterface mi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, MusicService.class);
//混合调用
//为了把服务所在进程变成服务进程
startService(intent);
//为了拿到中间人对象
bindService(intent, new MusicServiceConn(), BIND_AUTO_CREATE);
//* 服务的混合调用
//* 先开始、再绑定,先解绑、再停止
} class MusicServiceConn implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mi = (MusicInterface) service;//返回中间人对象
}
@Override
public void onServiceDisconnected(ComponentName name) {
} } //开始播放按钮
public void play(View v){//Activity的方法
mi.play();//中间人的方法,调用Service的方法
}
//暂停播放按钮
public void pause(View v){
mi.pause();
}
}
//清单文件: <service android:name="com.itheima.musicplayer.MusicService"></service>
package com.itheima.musicplayer; import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder; public class MusicService extends Service{
@Override
public IBinder onBind(Intent intent) {
return new MusicController();//中间人对象
} //必须继承binder,才能作为中间人对象返回给onServiceConnected的service
class MusicController extends Binder implements MusicInterface{
public void play(){
MusicService.this.play();//中间人对象调用Service的方法
}
public void pause(){
MusicService.this.pause();
}
} public void play(){//Service的方法
System.out.println("播放音乐");
} public void pause(){
System.out.println("暂停播放");
} }
package com.itheima.musicplayer;
public interface MusicInterface {
void play();
void pause();
}
#找领导办证
* 把服务看成一个领导,服务中有一个banZheng方法,如何才能访问?
* 绑定服务时,会触发服务的onBind方法,此方法会返回一个Ibinder的对象给MainActivity,通过这个对象访问服务中的方法
* 绑定服务 Intent intent = new Intent(this, BanZhengService.class);
bindService(intent, conn, BIND_AUTO_CREATE);
* 绑定服务时要求传入一个ServiceConnection实现类的对象
* 定义这个实现类 class MyServiceconn implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
zjr = (PublicBusiness) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
} }
* 创建实现类对象 conn = new MyServiceconn();
* 在服务中定义一个类实现Ibinder接口,以在onBind方法中返回 class ZhongJianRen extends Binder implements PublicBusiness{
public void QianXian(){
//访问服务中的banZheng方法
BanZheng();
}
public void daMaJiang(){ }
}
* 把QianXian方法抽取到接口PublicBusiness中定义 ---
#两种启动方法混合使用
* 用服务实现音乐播放时,因为音乐播放必须运行在服务进程中,可是音乐服务中的方法,需要被前台Activity所调用,所以需要混合启动音乐服务
* 先start,再bind,销毁时先unbind,在stop
android90 bind方式启动服务service调用service里的方法的更多相关文章
- 在JS中调用CS里的方法(PageMethods)
在JS中调用CS里的方法(PageMethods) 2014年04月28日 11:18:18 被动 阅读数:2998 最近一直在看别人写好的一个项目的源代码,感觉好多东西都是之前没有接触过的.今天 ...
- 【FLEX教程】#007 如何让JS调用SWF里的方法
HTML中,JS如何调用SWF里面已经封装好的代码呢? 有一些事情Flex没办法实现的,需要通过调用JS来实现. eg: 当浏览器窗体关闭的时候,弹出一个对话框,提示用户是否退出?或者是否保存当前的操 ...
- 解决未能启动服务“VMware Authorization Service”
计算机-管理-服务--服务列表找到VMware Authorization Service 并双击 打开服务.
- Java中多线程启动,为什么调用的是start方法,而不是run方法?
前言 大年初二,大家新年快乐,我又开始码字了.写这篇文章,源于在家和基友交流的时候,基友问到了,我猛然发现还真是这么回事,多线程启动调用的都是start,那么为什么没人掉用run呢?于是打开我的ide ...
- vue 进入页面每次都调用methods里的方法
// 监听路由,每次进入页面调用方法,放在method里 mounted(){ this.getPath() }, methods: { getPath(){ console.log(this.$ro ...
- 安卓服务(Service)的两种开启方式以及服务的生命周期
安卓中服务的开启方式 一:採用start的方式开启服务 调用函数:startService(Intent)->onCreate()->onStart()/onStartCommand()- ...
- Wildfly在Linux下以Service的方式启动 配置步骤
1.前提介绍 在目前项目中使用Wildfly9在linux下部署项目,经常会通过远程的SSH来启动关闭服务.但是通过SHH启动 standalone.sh 的服务,如果关闭窗口服务就会被停掉.所以就想 ...
- centos7也支持service命令启动服务吗,对于centos7 中的systemctl和旧的service命令的区别和联系
一.centos7也支持service命令启动服务吗 CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服 ...
- Android开发之通过Intent启动其他App的Service
在Android5.0以前可以通过隐式Intent方式启动其他App的Service,就跟Activity启动隐式Intent一样的. 但是在5.0以后,只能使用显示的Intent方式启动了. 启动其 ...
随机推荐
- Emmet(前身是zen coding)介绍和使用
Zen coding - 一种快速编写HTML/CSS代码的方法.它使用仿CSS选择器的语法来快速开发HTML和CSS - 由Sergey Chikuyonok开发. 现在它改名为了Emmet,并且搭 ...
- js中replace用法
js中replace的用法 replace方法的语法是:stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(string),reExp可以是正则 ...
- Caused by: java.lang.ClassNotFoundException: javax.persistence.EntityListeners
Answer: This seems to be caused by Hibernate 3.6. It is now dependent on JPA, so it must have a JPA ...
- VM Depot 分布式计算框架主题应用精选
发布于 2014-12-24 作者 陈 忠岳 在前几期为各位介绍了大数据应用主题以及开发运营主题的各类镜像后,这次我们精选了 VM Depot 站点中分布式计算相关主题的虚拟机镜像和大家一起分享 ...
- jQuery append xmlNode 修改 xml 内容
jQuery append xmlNode 修改 xml 内容 http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/04/29/jqu ...
- 不要浪费人生的每一天 ——Dropbox创始人在麻省理工的演讲 z
Dropbox 创始人,CEO 德鲁·休斯顿(Drew Houston)近期在美国麻省理工学院的毕业典礼上发表演讲.他向大学生提出了 3 点人生建议:追逐自己感兴趣的事,找到最合适的圈子,以及不要浪费 ...
- oracle中查看某个用户名下所有的表以及sequence
select table_name from all_tables where owner =upper('jdfp') ; 此处查的是tieba这个用户表空间下的所有表 ...
- [Stephen]关于Ext.net fileupload 的兼容性解决问题
在firefox下,利用fileupload上传图片后,通过后端将image 的src路径进行更新,刷新前段界面显示没有问题. 但是在以IE为内核的360中,这种上传后的更新导致一个命名为Action ...
- PV,UV,IP
参加了DTCC归来之后,各大电商技术大牛都会自豪的分享一下自己公司网站的PV,流量等等.当时也是一知半解,回来之后赶紧查了查,也算是扫扫盲. 以下摘自网络中,自己稍稍做了整理,对于PV,流量和带宽的理 ...
- [CODEVS1037]取数游戏
N(2 <=N<=200,且为偶数)个正整数的序列放在一个游戏平台上,A.B两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束.以最终得分多者为胜(A ...