【转】Android中BindService方式使用的理解
原文网址:http://www.cnblogs.com/onlylittlegod/archive/2011/05/15/2046652.html
最近学习了一下Android里面的Service的应用,在BindService部分小卡了一下,主要是开始没有彻底理解为什么要这么实现。
BindService和Started Service都是Service,有什么地方不一样呢:
1. Started Service中使用StartService()方法来进行方法的调用,调用者和服务之间没有联系,即使调用者退出了,服务依然在进行【onCreate()- >onStartCommand()->startService()->onDestroy()】,注意其中没有onStart(),主要是被onStartCommand()方法给取代了,onStart方法不推荐使用了。
2. BindService中使用bindService()方法来绑定服务,调用者和绑定者绑在一起,调用者一旦退出服务也就终止了【onCreate()->onBind()->onUnbind()->onDestroy()】。
调用者Activity:
- MainAcitvity
- package com.zys.service;
- import com.zys.service.BindService.MyBinder;
- import android.R.bool;
- import android.app.Activity;
- import android.content.ComponentName;
- import android.content.Context;
- import android.content.Intent;
- import android.content.ServiceConnection;
- import android.os.Bundle;
- import android.os.IBinder;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class MainActivity extends Activity {
- private Button startBtn;
- private Button stopBtn;
- private boolean flag;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- flag = false;
- //设置
- startBtn = (Button)this.findViewById(R.id.startBtn);
- stopBtn = (Button)this.findViewById(R.id.stopBtn);
- startBtn.setOnClickListener(listener);
- stopBtn.setOnClickListener(listener);
- }
- private OnClickListener listener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- switch (v.getId()) {
- case R.id.startBtn:
- bindService();
- break;
- case R.id.stopBtn:
- unBind();
- break;
- default:
- break;
- }
- }
- };
- private void bindService(){
- Intent intent = new Intent(MainActivity.this,BindService.class);
- bindService(intent, conn, Context.BIND_AUTO_CREATE);
- }
- private void unBind(){
- if(flag == true){
- unbindService(conn);
- flag = false;
- }
- }
- private ServiceConnection conn = new ServiceConnection() {
- @Override
- public void onServiceDisconnected(ComponentName name) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- // TODO Auto-generated method stub
- MyBinder binder = (MyBinder)service;
- BindService bindService = binder.getService();
- bindService.MyMethod();
- flag = true;
- }
- };
- }
- package com.zys.service;
- import com.zys.service.BindService.MyBinder;
- import android.R.bool;
- import android.app.Activity;
- import android.content.ComponentName;
- import android.content.Context;
- import android.content.Intent;
- import android.content.ServiceConnection;
- import android.os.Bundle;
- import android.os.IBinder;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class MainActivity extends Activity {
- private Button startBtn;
- private Button stopBtn;
- private boolean flag;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- flag = false;
- //设置
- startBtn = (Button)this.findViewById(R.id.startBtn);
- stopBtn = (Button)this.findViewById(R.id.stopBtn);
- startBtn.setOnClickListener(listener);
- stopBtn.setOnClickListener(listener);
- }
- private OnClickListener listener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- switch (v.getId()) {
- case R.id.startBtn:
- bindService();
- break;
- case R.id.stopBtn:
- unBind();
- break;
- default:
- break;
- }
- }
- };
- private void bindService(){
- Intent intent = new Intent(MainActivity.this,BindService.class);
- bindService(intent, conn, Context.BIND_AUTO_CREATE);
- }
- private void unBind(){
- if(flag == true){
- unbindService(conn);
- flag = false;
- }
- }
- private ServiceConnection conn = new ServiceConnection() {
- @Override
- public void onServiceDisconnected(ComponentName name) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- // TODO Auto-generated method stub
- MyBinder binder = (MyBinder)service;
- BindService bindService = binder.getService();
- bindService.MyMethod();
- flag = true;
- }
- };
- }
服务BindService
- BindService
- package com.zys.service;
- import java.io.FileDescriptor;
- import android.app.Service;
- import android.content.Intent;
- import android.os.Binder;
- import android.os.IBinder;
- import android.os.IInterface;
- import android.os.Parcel;
- import android.os.RemoteException;
- import android.util.Log;
- public class BindService extends Service {
- private static final String TAG = "BindService";
- public void MyMethod(){
- Log.i(TAG, "BindService-->MyMethod()");
- }
- @Override
- public IBinder onBind(Intent intent) {
- // TODO Auto-generated method stub
- return myBinder;
- }
- public class MyBinder extends Binder{
- public BindService getService(){
- return BindService.this;
- }
- }
- private MyBinder myBinder = new MyBinder();
- }
- package com.zys.service;
- import java.io.FileDescriptor;
- import android.app.Service;
- import android.content.Intent;
- import android.os.Binder;
- import android.os.IBinder;
- import android.os.IInterface;
- import android.os.Parcel;
- import android.os.RemoteException;
- import android.util.Log;
- public class BindService extends Service {
- private static final String TAG = "BindService";
- public void MyMethod(){
- Log.i(TAG, "BindService-->MyMethod()");
- }
- @Override
- public IBinder onBind(Intent intent) {
- // TODO Auto-generated method stub
- return myBinder;
- }
- public class MyBinder extends Binder{
- public BindService getService(){
- return BindService.this;
- }
- }
- private MyBinder myBinder = new MyBinder();
- }
由于Android 中的Service使用了onBind 的方法去绑定服务,返回一个Ibinder对象进行操作,而我们要获取具体的Service方法的内容的时候,我们需要Ibinder对象返回具体的Service对象才能操作,所以说具体的Service对象必须首先实现Binder对象,这个样子的话我们才能利用bindService的方法对Service进行绑定,获取Binder对象之后获取具体的Service对象,然后才获取Service中的方法等等。所以我们需要注意的是bindService的方式去绑定服务获取的必定是实现了Binder的对象,所以这是我们必须使用Binder的方式去获取Service的方式而不是直接使用Service的类,这个是Android内部实现所约束的。
方法过程如下:
Intent intent = new Intent(MainActivity.this,BindService.class)->新建了BindService对象->新建了MyBinder对象
->bindService(intent, conn, Context.BIND_AUTO_CREATE);->onBind()函数 -----传递MyBinder对象------->onServiceConnected()
--> 通过传递的Binder对象获取刚刚和Binder对象对应的BindService 对象 -->调用Service中定义的方法。
这个其中必须通过Binder对象,因为是通过Binder对象来传递的,通过Binder对象获取Service对象,然后获取所需的服务,所以Service必须实现Binder,以便传递和使用。
【转】Android中BindService方式使用的理解的更多相关文章
- Android中对Handle机制的理解
一.重要參考资料 [參考资料] 眼下来看,以下的几个网址中的内容质量比較不错.基本不须要再读别的网址了. 1.android消息机制一 http://xtfncel.javaeye. ...
- Android中Adapter和Bridge模式理解和应用
一 Adapter模式 意图: 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作. 适用性: 使用一个已存在的类,而它的接口 ...
- android中对线程池的理解与使用
前段时间有幸接到腾讯上海分公司的 Android开发面试,虽然最后一轮被毙了.但还是得总结一下自己在android开发中的一些盲点,最让我尴尬的是面试官问我几个android中线程池的使用与理解..哎 ...
- 谈谈对Android中的消息机制的理解
Android中的消息机制主要由Handler.MessageQueue.Looper三个类组成,他们的主要作用是 Handler负责发送.处理Message MessageQueue负责维护Mess ...
- android中LayoutParams设置参数的理解
1. 有这样的一个应用场景:有一个linearLayout控件在其中布局一个textView控件 首先,创建线性布局对象 LinearLayout layout = new LinearLayout( ...
- Android 中AIDL的使用与理解
AIDL的使用: 最常见的aidl的使用就是Service的跨进程通信了,那么我们就写一个Activity和Service的跨进程通信吧. 首先,我们就在AS里面新建一个aidl文件(ps:现在AS建 ...
- (七)Android中AIDL的应用与理解
一.跨应用启动Service Intent serviceIntent=new Intent();serviceIntent.setComponent(new ComponentName(" ...
- Android初级教程:Android中解析方式之pull解析
在安卓中有很多种解析方式.按照大方向有xml解析和json解析.而,细致的分,xml和json解析各有自己的很多解析方式.今天这一篇主要介绍xml解析中的pull解析.对于xml的解析方式,我之前在j ...
- java中传值方式的个人理解
前言 这几天在整理java基础知识方面的内容,对于值传递还不是特别理解,于是查阅了一些资料和网上相关博客,自己进行了归纳总结,最后将其整理成了一篇博客. 值传递 值传递是指在调用函数时将实际参数复制一 ...
随机推荐
- BootStrap--模态框中 上传图片
问题:在模态框中添加图片并不会得到你上传图片的名称,无法存到数据 下面介绍两个方法,都是可以得到图片名称的. 第一种 前面如何加载模态框就不写了,上篇有写,这里只是为得到图片写的 //需要添加一个 ...
- c# 可变性解析(协变和逆变)
之所以会想写关于协变和逆变的知识点,主要是因为在泛型委托中提到了这个知识点. 1.什么是可变性 可变性是.NET4.0中的一个特性,可变形分为:协变性,逆变性,不可变性. 2.在.NET4.0出来之前 ...
- javascript中闭包的真正作用
参考阮一峰的文章:http://javascript.ruanyifeng.com/grammar/function.html#toc23 1. 读取函数内部变量,封装一些私有属性 function ...
- Jsp详解
1Jsp基础 1.1 Jsp引入 Servlet的作用: 用java语言开发动态资源的技术!!! Jsp的作用:用java语言(+html语言)开发动态资源的技术!!! Jsp就是servlet!!! ...
- 只要关闭浏览器,session就消失了
程序一般都是在用户做log off的时候发个指令去删除session,然而浏览器从来不会主动在关闭之前通知服务器它将要被关闭,因此服务器根本不会有机会知道浏览器已经关闭.服务器会一直保留这个会话对象直 ...
- Color 颜色码-英文名称-十六进制-RGB对照表
色 英文代码 形像颜色 HEX格式 RGB格式 LightPink 浅粉红 #FFB6C1 255,182,193 Pink 粉红 #FFC0CB 255,192,203 Crimson 猩红 # ...
- 各种快递查询--Api接口
授权成功我的密钥 爱查快递API使用说明文档 API地址: 以前:http://api.ickd.cn/?com=[]&nu=[]&id=[]&type=[]&enco ...
- Swift之高德地图自定义标注弹出气泡样式
在用到地图类的sdk,sdk自带的样式必定不能满足开发者的需求,于是开发者不得不进行自定义,由于官方同样是object-c 版语法,不得不将其转为swift语法,以满足项目需求. 新建两个类 Cust ...
- ASP.NET MVC全局观
全局 首先我们来看一副图片,由于这幅图是我自己画的,不是摘自微软官方,所以如果有什么不到位的地方还望海涵! 首先,用户通过Web浏览器向服务器发送一条url请求,这里请求的url不再是xxx ...
- java下tcp的socket连接
serverDemo package cn.stat.p4.ipdemo; import java.io.IOException; import java.io.InputStream; import ...