Service绑定模式

     使用绑定的Service能够实现组件与Service的通信。

组件与被绑定的Service能够不归属于同一个应用程序。因此通过绑定Service能够实现进程间通信。

     调用bindService(Intent service,ServiceConnectionconn,int flags)方法就可以实现当前组件与Service的绑定。

 參数说明

     Intent service:配置被激活的Service组件,该Intent能够是显式的,也能够是隐式的;

     ServiceConnection conn:当前组件与被激活的Service的连接对象,当成功的以绑定模式激活Service后,该

     Service的onBlind()方法的返回值(非null)对象被回传到当前组件,即当前组件与被激活的Service存在同样的IBinder对象;





 关于Service的onBind()方法

       在绑定Service时,定义的Service类中,onBind()方法应该返回一个非null的值。

onBind()方法的返回值类型是IBinder类型。IBinder是接口。开发者能够自定义类实现该接口

Google官方并不推荐开发者直接定义类实现IBinder接口,而是通过继承Binder类就可以,Binder类是

IBinder接口的实现类

假设onBind()方法的返回值是null,则该绑定过程是失败的,虽然Service也会运行onCreate()方法開始工作。

但其它的组件无法与Service通信。

实现Activity绑定Service的开发过程例如以下:

     创建Activity类继承android.app.Service类。并在AndroidMainfest.xml中注冊该Service;

     在自己定义的Service类中创建IBinder的对象,作为onBind()方法的返回值;

     在Activity中创建ServiceConnection的对象。

     在Activity中调用bindService()方法实现与Service的绑定;

     重写Activity的onDestroy()方法,调用unbindService()方法取消与Service的绑定,以避免

     当Activity被销毁时绑定仍然存在而导致的异常。

   取消绑定

        当与Service绑定的组件被销毁时,应该及时取消与Service的绑定。否则会导致异常。

在组件中。调用unbindService(ServiceConnection conn)方法则能够取消与Service的绑定。

Service的生命周期

               ServiceConnection的onServiceDisconnected()方法并不会随着组件取消与Service的绑定而

      回调,该方法仅在Service在意外情况下崩溃时被调用。

      普通情况下,onRebind()方法并不会被回调,被回调的情景通常为:

          与该Service的全部组件都已经取消与它的绑定,导致该Service的onUnbind()方法被回调,

  且重写了onUnbind()方法返回值为true;

  该Service没有被销毁且再次被绑定时,则被回调onRebind()方法;

               

           注意:以绑定模式激活的Service租价那并非粘性的,且与Service绑定的组件在退出之前必须取消绑定

  ,即无法保证Service依旧存在。所以。为了保证其他组件能够销毁,但Service依旧存在。能够:

           1、先调用startService()激活Service组件;

   2、再调用bindService()实现绑定。

实现Activity与Service的通信

                 已知:在Service中。onBind()方法的返回值能够被Activity获得,即Activity与Service共同拥有一个IBinder类型的对象;

结论:开发者能够在Service中自己定义IBinder的实现类。并在该类中定义若干个方法,当Activity获得该实现类

的对象时,就可以调用这些方法。

   矛盾:IBinder的实现类的相关业务可能与Activity发送的Intent、service的生命周期等存在密切关系,

   使用Service的内部类则无法让Activity知晓该实现类的数据库类型。

解决方法:使用接口定义Activity须要让Service完毕的方法。

绑定Service时,接口的作用为:

         约定一种数据类型,让组件与Service均可使用这样的类型的数据;

约定组件与Service通信的标准。以使得组件能够调用相关的方法;

绑定Service的音乐播放器

           在Activity中加入2个button,分别表示“播放”与“暂停”。

  歌曲的播放与暂停功能由Service实现;

关于MediaPlayer暂停

     通过MediaPlayer的isPlaying()方法的布尔类型返回值可知晓是否正在播放(假设没有在播放,则不许须要暂停);

     通过MediaPlayer的getCurrentPositon()方法可知晓当前的播放进度;

     通过MediaPlayer的seekTo()方法可快进到指定位置在播放。

案例:

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
> <ImageButton
android:id="@+id/pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/play"
android:layout_marginLeft="58dp"
android:onClick="pause"
android:layout_toRightOf="@+id/play"
android:src="@android:drawable/ic_media_pause" /> <ImageButton
android:id="@+id/play"
android:onClick="play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="61dp"
android:layout_marginTop="68dp"
android:src="@android:drawable/ic_media_play" /> </RelativeLayout>

MainActivity,

package com.example.music_service;

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 ServiceConnection conn;
private Player player;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); conn = new InnerServiceConnection();
int flags = BIND_AUTO_CREATE;
Intent service = new Intent(this,PlayService.class);
bindService(service, conn, flags);
}
public void pause(View view){
player.playMusic();
}
public void play(View view){
player.pauseMusic();
}
private class InnerServiceConnection implements ServiceConnection{ @Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
player = (Player) service;
} @Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub } }
protected void onDestroy(){
unbindService(conn);
super.onDestroy();
} }

Service:

package com.example.music_service;

import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.Environment;
import android.os.IBinder; public class PlayService extends Service{
private MediaPlayer player;
private int Current;
@Override
public void onCreate() {
// TODO Auto-generated method stub
player = new MediaPlayer();
player.setOnPreparedListener(new InnerPreparedListener());
player.setOnCompletionListener(new InnerCompletionListener());
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return new InnerBinder();
}
public class InnerBinder extends Binder implements Player{ @Override
public void playMusic() {
// TODO Auto-generated method stub
play();
} @Override
public void pauseMusic() {
pause();
// TODO Auto-generated method stub
} }
private void play(){ try {
player.reset();
player.setDataSource(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Music/Groove Coverage - She.mp3");
player.prepareAsync();
// player.start();
} catch (IllegalArgumentException e) {
// TODO: handle exception
e.printStackTrace();
}catch(SecurityException e){
e.printStackTrace();
}
catch(IllegalStateException e){
e.printStackTrace();
}
catch(IOException e){
e.printStackTrace();
}
}
private void pause(){
if(player.isPlaying()){
Current = player.getCurrentPosition();
player.pause();
}
} private class InnerPreparedListener implements MediaPlayer.OnPreparedListener{ @Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.seekTo(Current);
mp.start();
Current = 0;
} }
private class InnerCompletionListener implements MediaPlayer.OnCompletionListener{ @Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
play();
} }
@Override
public void onDestroy() {
// TODO Auto-generated method stub
player.release();
player = null;
super.onDestroy();
} }

接口:

package com.example.music_service;

public interface Player {
void playMusic();
void pauseMusic();
}

OK,对了,service不要忘了在AndroidMainfest.xml中配置一下

Service绑定模式的更多相关文章

  1. cxGrid 增加序号 (非数据库绑定模式) (测试通过)

    cxGrid 增加序号 (非数据库绑定模式) ----------------------------------- 1. 选在 adoQuery 控件 , 鼠标右键菜单中 选择 Fields Edi ...

  2. Activity和Service绑定

    Activity和Service绑定后,可以方便Activity随时调用对应的Service里面的方法 绑定代码如下 Activity类代码: <span style="font-si ...

  3. Service Locator 模式

    什么是Service Locator 模式? 服务定位模式(Service Locator Pattern)是一种软件开发中的设计模式,通过应用强大的抽象层,可对涉及尝试获取一个服务的过程进行封装.该 ...

  4. android 47 service绑定

    如果一个service已经启动了,activity和service绑定了在解除邦定,则这个service不会销毁,因为这个service不是这个Activity创建的. service生命周期: Ac ...

  5. WPF的5种绑定模式(mode)

    WPF的绑定模式(mode)是枚举的 枚举值共有5个 1:OneWay(源变就更新目标属性) 2:TwoWay(源变就更新目标并且目标变就更新源) 3:OneTime(只根据源来设置目标,以后都不会变 ...

  6. 【转】WPF绑定模式

    源地址:http://www.cnblogs.com/zjz008/archive/2010/05/26/1744802.html http://blog.csdn.net/haylhf/articl ...

  7. Android -- Service绑定解绑和aidl

    Service是安卓四大组件之一,先前讲到了Service的生命周期,以及非绑定类型的生命周期的例子,这次来分享一下绑定形式的. 应用组件(客户端)可以调用bindService()绑定到一个serv ...

  8. Kubernetes service 代理模式

    Kubernetes service 代理模式 底层流量转发与负载均衡实现:• Iptables(默认)• IPVS IPVS 了解代理模式之IPVS工作原理LVS 基于 IPVS内核调度模块实现的负 ...

  9. Linux下网卡绑定模式

    Linux bonding驱动一共提供了7种模式,它们分别是:balance-rr .active-backup.balance-xor.broadcast.802.3ad.balance-tlb.b ...

随机推荐

  1. 前端学习之路——gulp篇

    一.构建gulp环境 1.下载nodejs gulp基于node.js,要通过nodejs的npm安装gulp,所以要先安装node.js环境.(英文官网/中文官网链接). 通过cmd命令窗口确定安装 ...

  2. 基本数据类型(list、tuple)

    1.列表 1.1 定义 li=[1,2,3] 每个元素逗号隔开 list("abc") 迭代 列表是一个容器 => 任意类型 列表是有序的 => 索引 切片 步长 列表 ...

  3. Ubuntu上面安装docker

    1.先用uname -r查看系统的信息 2.安装docker的命令为 sudo apt install docker.io 3.然后就能实现安装了 但是:运行docker search golang, ...

  4. centos7 安装freeswitch

    1.安装运行库 yum install -y git gcc-c++ wget alsa-lib-devel autoconf automake bison broadvoice-devel bzip ...

  5. 洛谷 P1275 魔板

    P1275 魔板 题目描述 有这样一种魔板:它是一个长方形的面板,被划分成n行m列的n*m个方格.每个方格内有一个小灯泡,灯泡的状态有两种(亮或暗).我们可以通过若干操作使魔板从一个状态改变为另一个状 ...

  6. Android 开发者不得不面对的六个问题

    一份关于移动应用开发的调查报告显示,Androdid开发者对谷歌的移动操作系统平台的兴趣正在下降.尽管依然有79%的开发者表示对Android “非常感兴趣”,但调查报告显示,一些迹象表明在2012到 ...

  7. quick-cocos2d-x游戏开发【2】——项目结构分析、创建新场景

    创建完一个新项目之后,我们能够简单的看一看这个项目的文件组成,有这么一个文件层次结构 几个proj.*目录就不用说了,是相应的平台的解决方式,res专门存放我们的游戏资源.scripts存放我们的lu ...

  8. 完毕乔布斯的梦想:一个免费wifi共享的乌托邦

    早在2007年推出iPhone时,乔布斯就提出这种如果:商业区与居民区的wifi路由器全民开放,实现与路人共享网络之便.能够想象,那算是一个wifi共享的乌托邦. 数年过去了,乔布斯的梦想依然没能全然 ...

  9. linux文件时间的查看和改动touch

    1. linux文件的时间 linux下文件时间主要有以下三种: 1.1 modification time(mtime) 文件改动时间.即文件内容的改动时,更新这个时间.不包含文件权限和属性的改动. ...

  10. jmeter名词解释之时间(Elapsed Time/ Latency Time/Connection Time)

    转载时请标注源自:http://blog.csdn.net/musen518 jmeter报告结果中会出现三个时间 1. Elapsed time    经过的时间(= Sample time = L ...