文档章节

android Service学习之bindService

二进制的忧伤
 二进制的忧伤
发布于 2015/01/08 11:07
字数 625
阅读 48
收藏 0

1、为什么要用bindService去启动一个服务?

FAQ:通过startService()和stopService()启动和关闭服务时,Service与访问者之间无法进行通信和数据交换,而使用bindService()和unbindService()启动和关闭服务的时候就解决了这个问题;

2、如何使用bindService()去启动一个服务?

FAQ:我们通常会使用bindService(intent, connection, Service.BIND_AUTO_CREATE);方法去启动一个服务。看下参数详解:

    intent:要启动的服务;

    connection:这是一个ServiceConnection对象,用来监听Service与访问者之间的连接状态,连接成功时回调onServiceConnected(ComponentName componentName, IBinder binder)这个方法,其中binder是回调的服务对象,从中可以获取服务相关信息,断开连接回调onServiceDisconnected(ComponentName name)方法,解除绑定的时候调用unbindService(connection)方法;

     Service.BIND_AUTO_CREATE:绑定时是否自动创建Service,这里自动创建。

3、如何创建一个绑定的Service?

FAQ:下面代码实现了一个绑定的Service:

public class BindService extends Service {
 private static final String TAG = "BindService";
 private int count;
 private boolean quit;
 private MyBind bind = new MyBind();
 @Override
 public IBinder onBind(Intent arg0) {
  Log.i(TAG, "service is binded");
  return bind;
 }
 @Override
 public boolean onUnbind(Intent intent) {
  Log.i(TAG, "service is onUnbind");
  return true;
 };
 @Override
 public void onCreate() {
  super.onCreate();
  Log.i(TAG, "service is onCreate");
  new Thread(new Runnable() {
   @Override
   public void run() {
    while (!quit) {
     try {
      Thread.sleep(2000);
      count++;
     } catch (Exception e) {
     }
    }
   }
  }).start();
 }
 @Override
 public void onDestroy() {
  super.onDestroy();
  this.quit = true;
  Log.i(TAG, "service is onDestroy");
 }
 class MyBind extends Binder {
  public int getCount() {
   return count;
  }
 }
}

4、创建绑定的Activity:

 public class MainActivity extends Activity {
 private static final String TAG = "MainActivity";
 private Button bindBtn, unbindBtn, getBtn;
 private Intent intent;
 MyBind bind;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  bindBtn = (Button) findViewById(R.id.button1);
  unbindBtn = (Button) findViewById(R.id.button2);
  getBtn = (Button) findViewById(R.id.button3);
  bindBtn.setOnClickListener(l);
  unbindBtn.setOnClickListener(l);
  getBtn.setOnClickListener(l);
  intent = new Intent(this, BindService.class);
 }
 OnClickListener l = new OnClickListener() {
  @Override
  public void onClick(View view) {
   if (view == bindBtn) {
    bindService(intent, connection, Service.BIND_AUTO_CREATE);
   } else if (view == unbindBtn) {
    unbindService(connection);
   } else if (view == getBtn) {
    Toast.makeText(MainActivity.this, "Service的count值:" + bind.getCount(),
      Toast.LENGTH_LONG).show();
   }
  }
 };
 ServiceConnection connection = new ServiceConnection() {
  @Override
  public void onServiceDisconnected(ComponentName name) {
   Log.i(TAG, "onServiceDisconnected");
   Toast.makeText(MainActivity.this, "onServiceDisconnected", Toast.LENGTH_LONG).show();
  }
  @Override
  public void onServiceConnected(ComponentName componentName, IBinder binder) {
   Toast.makeText(MainActivity.this, "onServiceConnected", Toast.LENGTH_LONG).show();
   Log.i(TAG, "onServiceConnected");
   bind = (MyBind) binder;
  }
 };
}

5、程序说明:

当Service与Activity绑定的时候,Activity可以通过MyBind来获取Service状态,其实对于Service的onBind()返回的IBinder对象可以看作Service组件返回的回调对象,Service允许客户端通过IBinder对象来访问Service的内部数据,这样就实现了客户端与Service之间的通信!

© 著作权归作者所有

下一篇: 自定义Tosat
二进制的忧伤
粉丝 9
博文 19
码字总数 16902
作品 0
深圳
程序员
私信 提问
Android中BindService方式使用的理解

最近学习了一下Android里面的Service的应用,在BindService部分小卡了一下,主要是开始没有彻底理解为什么要这么实现。 BindService和Started Service都是Service,有什么地方不一样呢: 1....

大凉龙雀
2013/04/04
221
0
Android中BindService方式使用的理解

最近学习了一下Android里面的Service的应用,在BindService部分小卡了一下,主要是开始没有彻底理解为什么要这么实现。 BindService和Started Service都是Service,有什么地方不一样呢: 1....

大凉龙雀
2013/03/02
155
0
Android提高第五篇之Service

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 上次介绍了Activity以及Intent的使用,这次就介绍Service,如果把Activity比喻为前台程序,那么Service就是后台程序,Service...

晨曦之光
2012/03/14
279
0
startService与bindService的区别

Android执行Service有两种方法,一种是startService,一种是bindService。下面让我们一起来聊一聊这两种执行Service方法的区别。 1、生命周期上的区别 执行startService时,Service会经历onC...

亭子happy
2015/02/08
13.4K
0
Android Service 服务(三)—— bindService与remoteService

一、bindService简介 bindService是绑定Service服务,执行service服务中的逻辑流程。 service通过Context.startService()方法开始,通过Context.stopService()方法停止;也可以通过Service.s...

长平狐
2013/01/06
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

IDEA Maven project: 'xxx/pom.xml' already exists in VFS

Failed to create a Maven project: ‘xxx/pom.xml‘ already exists in VFS idea创建项目后,发现项目有问题,删除后重新创建,提示错误如下。 解决办法 1.通过idea打开任意一个项目 2.File...

国产大熊猫
58分钟前
7
0
Flutter之 State 生命周期

State 的生命周期,指的是在用户参与的情况下,其关联的 Widget 所经历的,从创建到显示,再到更新最后到停止,直至销毁等各个阶段 不同的阶段涉及到特定的任务处理 State 的生命周期流程如下...

過愙
今天
11
0
零基础一年拿下BAT三家offer

背景 1、本人本科一本双非垫底的那种,硕士211。本硕电子通信,完全0基础,转行一年。 2、研一上第一学期上课+外派到老师合作公司写MATLAB。去年4月开始学习Java。 起步 1、实话说,刚决定转...

gzc426
今天
6
0
并行和并发的区别

并行和并发的区别 并行(Parallel)的重点在于同一时间点多个任务同时进行; 并发(Concurrent)的重点在于同一时间段有多个任务执行,不要求某个时间点有多个任务同时进行。...

StupidZhe
今天
42
0
java内存泄漏问题

所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。Java中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象编程了孤儿的时候,对象将自动被垃圾回收器从内存中...

Bb进阶
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部