绑定Service bindService
来源:互联网 发布:rx100 m3 m4 m5知乎 编辑:程序博客网 时间:2024/05/21 04:24
通过bindService实现Activity和Service之间进行数据通信
- 第一部分 实现Service
- 创建一个类BackgroundAudioService 继承 Service
- 在该类中创建一个内部类BackgroundAudioServiceBinder 继承 Binder。在该类中定义一个方法返回值为类自身
return BackgroundAudioService.this。 - 实例化一个IBinder引用,对象是内部类的类型 new BackgroundAudioServiceBinder ()
- 重写onBinde(Intent)方法返回3中的IBinder对象
- 其他操作和正常的Service一样。
- 第二部分 Activity中的调用
- 声明第一部分中的Service引用,BackgroundAudioService bgaService
- 实例化一个ServiceConnection 对象
- 在2中对象中重写了俩个方法
- 一个是:
onServiceConnected(componmentName name,IBinder binder) 当服务连接时。在这里实例化1中Service类的对象。
格式:对象名 =( (Service类.内部类) binder ) .getService() - 另一个是:
onServiceDisconnected(componentName name) 当服务断开连接时 将1中的对象置为null
- 一个是:
- 在开始Service时调用 startService(serviceIntent) bindService(serviceIntent,serviceConnection,Context.BIND_AUTO_CREATE)
- 在结束service时调用 unbindService(ServiceConnection) stopService(serviceIntent);
下面使用一个Service + MediaPlayer播放音乐。点击开始按钮启动Service,此时Service与Activity绑定,点击结束按钮将Activity与Service解绑并停止Service。
示例:
Activity源码:
package com.example.day603;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.IBinder;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;/** * 绑定服务 bindService * 让Activity和Service进行数据交互, * 点击back按钮,让音乐倒回几秒然后继续播放 */public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private Button start,stop,back;//开启关闭service private Intent serviceIntent;//启动service所需Intent private BackgroundAudioService baService; private ServiceConnection serviceConnect=new ServiceConnection() { /** * @param name * @param baBinder * 当bindService()调用后,并连接到对象serviceConnect时,调用该方法 */ @Override public void onServiceConnected(ComponentName name, IBinder baBinder) { baService=((BackgroundAudioService.BackgroundAudioServiceBinder)baBinder).getService(); } @Override public void onServiceDisconnected(ComponentName name) { baService=null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); start=(Button)findViewById(R.id.start); stop=(Button)findViewById(R.id.stop); back=(Button)findViewById(R.id.back); serviceIntent=new Intent(this,BackgroundAudioService.class); start.setOnClickListener(this); stop.setOnClickListener(this); back.setOnClickListener(this); } /** * @param v * finish()方法表明当前的Service不依赖于Activity,是独立运行的 */ @Override public void onClick(View v) { if (v == start) { //点击start后一次调用onCreate() onStartCommand() startService(serviceIntent); bindService(serviceIntent,serviceConnect, Context.BIND_AUTO_CREATE); } else if (v == stop) { unbindService(serviceConnect); //点击stop后一次调用onDestory() stopService(serviceIntent); } else if (v == back) { baService.haveFun(); } }}
Service源码:
package com.example.day603;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.net.Uri;import android.os.Binder;import android.os.Environment;import android.os.IBinder;import java.io.File;public class BackgroundAudioService extends Service implements MediaPlayer.OnCompletionListener{ private MediaPlayer mediaPlayer; //处理音频播放的对象 /** * 自定义的内部类 * 创建一个内部类,继承Binder * 在请求时返回服务本身 */ public class BackgroundAudioServiceBinder extends Binder{ public BackgroundAudioService getService(){ return BackgroundAudioService.this; } } //实例化一个IBinder对象,重写onBind(Intent)方法,返回它 private final IBinder baseBinder=new BackgroundAudioServiceBinder(); /** * BackgroundAudioService的构造函数 */ public BackgroundAudioService() { } @Override public IBinder onBind(Intent intent) { return baseBinder; } /** * mediaPlayer正在播放时调用,倒回2.5秒 */ public void haveFun(){ if (mediaPlayer.isPlaying()) { mediaPlayer.seekTo(mediaPlayer.getCurrentPosition()-2500); } } @Override public void onCreate() { super.onCreate(); File file=new File(Environment.getExternalStorageDirectory().getPath()+"/Xzq.mp3"); Uri uri = Uri.fromFile(file); mediaPlayer=MediaPlayer.create(this,uri); //创建MediaPlayer对象加载uri mediaPlayer.setOnCompletionListener(this); } @Override public int onStartCommand(Intent intent, int flags, int startId) { //没有播放则开始播放 if (!mediaPlayer.isPlaying()) { mediaPlayer.start(); } return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); //正在播放则停止 if (mediaPlayer.isPlaying()) { mediaPlayer.stop(); } //销毁mediaplayer,释放资源 mediaPlayer.release(); } /** * @param mp * 该service实现了OnCompletionListener,并且将Service本身被设置为mediaPlayer对象的该service实现了OnCompletionListener * 所以当mediaPlayer播放完毕后,调用onCompletion() * 因为只有一首歌所以调用 stopSelf(); */ @Override public void onCompletion(MediaPlayer mp) { stopSelf(); }}
0 0
- 绑定Service bindService
- Android Service(绑定BindService)
- android service中bindService是异步绑定
- Android Service组件在进程内绑定(bindService)过程
- Android Service组件在新进程绑定(bindService)过程
- Service组件 startService() bindService()
- Service之bindService
- Service和bindService生命周期
- Service之BindService
- Android Service之bindService
- Service进阶篇(bindService)
- Android中bindService的细节之一:从进程的角度分析绑定Service的流程【Service所在进程首次启动】
- BindService() 绑定方式开启服务
- android 之 Service(Context BindService())
- Android SERVICE(详解二 Bindservice)
- Service之startservice与bindservice
- Service (bindService音乐播放器)
- Android中Service使用bindService
- opencv中mat和指针IplImage的转换
- 我的工作中SQL学习
- PageHelper+Bootstrap Paginator实现分页效果
- poj 3250 Bad Hair Day单调栈
- Python中作用域
- 绑定Service bindService
- Linux运维笔记-文档总结-openssh-server
- Intellij 新建文件 自动add进版本控制SVN 或 GIT
- 两个html页面之间的传值
- C++ std::enable_if解析
- Android 积累一些JNI与NDK的知识
- sudo的环境变量获取
- 百度地图初见
- ajax请求如何避免表单重复提交