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里的方法的更多相关文章

  1. 在JS中调用CS里的方法(PageMethods)

    在JS中调用CS里的方法(PageMethods) 2014年04月28日 11:18:18 被动 阅读数:2998   最近一直在看别人写好的一个项目的源代码,感觉好多东西都是之前没有接触过的.今天 ...

  2. 【FLEX教程】#007 如何让JS调用SWF里的方法

    HTML中,JS如何调用SWF里面已经封装好的代码呢? 有一些事情Flex没办法实现的,需要通过调用JS来实现. eg: 当浏览器窗体关闭的时候,弹出一个对话框,提示用户是否退出?或者是否保存当前的操 ...

  3. 解决未能启动服务“VMware Authorization Service”

    计算机-管理-服务--服务列表找到VMware Authorization Service 并双击 打开服务.

  4. Java中多线程启动,为什么调用的是start方法,而不是run方法?

    前言 大年初二,大家新年快乐,我又开始码字了.写这篇文章,源于在家和基友交流的时候,基友问到了,我猛然发现还真是这么回事,多线程启动调用的都是start,那么为什么没人掉用run呢?于是打开我的ide ...

  5. vue 进入页面每次都调用methods里的方法

    // 监听路由,每次进入页面调用方法,放在method里 mounted(){ this.getPath() }, methods: { getPath(){ console.log(this.$ro ...

  6. 安卓服务(Service)的两种开启方式以及服务的生命周期

    安卓中服务的开启方式 一:採用start的方式开启服务 调用函数:startService(Intent)->onCreate()->onStart()/onStartCommand()- ...

  7. Wildfly在Linux下以Service的方式启动 配置步骤

    1.前提介绍 在目前项目中使用Wildfly9在linux下部署项目,经常会通过远程的SSH来启动关闭服务.但是通过SHH启动 standalone.sh 的服务,如果关闭窗口服务就会被停掉.所以就想 ...

  8. centos7也支持service命令启动服务吗,对于centos7 中的systemctl和旧的service命令的区别和联系

    一.centos7也支持service命令启动服务吗 CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服 ...

  9. Android开发之通过Intent启动其他App的Service

    在Android5.0以前可以通过隐式Intent方式启动其他App的Service,就跟Activity启动隐式Intent一样的. 但是在5.0以后,只能使用显示的Intent方式启动了. 启动其 ...

随机推荐

  1. delphi中的各种文件类型介绍

    1.DPR: Delphi Project文件,包含了Pascal代码.应用系统的工程文件2.PAS: Pascal文件,Pascal单元的源代码,可以是与窗体有关的单元或是独立的单元.3.DFM:D ...

  2. ActionBar官方教程(1)简介及各区域介绍

    Action Bar The action bar is a window feature that identifies the user location, and provides user a ...

  3. 【HDOJ】1003 Max Sum

    最开始使用递归DP解,stack overflow.化简了一些,复杂度为O(n)就过了. #include <stdio.h> int main() { int case_n, n; in ...

  4. BGP详解

    相信各位站长在托管服务器或者选择虚拟主机的时候,提供商都会说他们的机房是双线机房,保证你的站点访问速度,那么这里所谓的双线机房到底是何意思,它又为何能提升站点的访问速度呢? 一遍小型机房的所谓双线路其 ...

  5. Linux Kernel ‘/net/socket.c’本地信息泄露漏洞

    漏洞名称: Linux Kernel ‘/net/socket.c’本地信息泄露漏洞 CNNVD编号: CNNVD-201312-037 发布时间: 2013-12-04 更新时间: 2013-12- ...

  6. Tdxtreelist变色

    ACanvas.Font.Color := clRed;   //如果有加印的  变颜色

  7. [Irving]SQL去重复-DISTINCT用法

    在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值.关键词 distinct用于返回唯一不同的值. 表A: 示例1 select distinct nam ...

  8. We're Hiring A Software Tester

    测试人员的基本修养: 代码编写,不可或缺 乔布斯说:Design is not just what it looks like and feel like,design is how it works ...

  9. 使用vxsim(一)

    新建download工程 选择toolchain 这里选SIMNTgnu是为了在vxsim中能下载编译的.o文件 如果是为了下载到visualbox或者vmware中的vxworks,则toolcha ...

  10. 最近用unity5弄的一些渲染

    unity5 人皮渲染  Skin Shading 换了一种方法,优化了一下代码,unity5效果很好,消耗不大 点开可查看大图 加入了次表面散射的阴影与自阴影 unity5  ocean real- ...