8.1.2 绑定Activity和Service

2010-06-21 16:57 李宁 中国水利水电出版社 字号:T | T

《Android/OPhone开发完全讲义》第8章Android服务,本章主要介绍了Android系统 中的服务(Service)技术。Service是Android中4个应用程序组件之一。在Android系统内部提供了很多的系统服务,通过这些系统 服务,可以实现更为复杂的功能,例如,监听来电、重力感应等。本节为大家介绍绑定Activity和Service。

AD:

8.1.2  绑定Activity和Service

本节的例子代码所在的工程目录是src\ch08\ch08_serviceactivity

如果使用8.1.1节介绍的方法启动服务,并且未调用stopService来停止服务,这个服务就会随着Android系统的启动而启动,随着 Android系统的关闭而关闭。也就是服务会在Android系统启动后一直在后台运行,直到Android系统关闭后服务才停止。但有时我们希望在启 动服务的Activity关闭后服务自动关闭,这就需要将Activity和Service绑定。

通过bindService方法可以将Activity和Service绑定。bindService方法的定义如下:

  1. public boolean bindService(Intent service, 
    ServiceConnection conn, int flags)

该方法的第1个参数表示与服务类相关联的Intent对象,第2个参数是一个ServiceConnection类型的变量,负责连接Intent 对象指定的服务。通过ServiceConnection对象可以获得连接成功或失败的状态,并可以获得连接后的服务对象。第3个参数是一个标志位,一般 设为Context.BIND_AUTO_CREATE。

下面重新编写8.1.1节的MyService类,在该类中增加了几个与绑定相关的事件方法。

  1. package net.blogjava.mobile.service;
  2. import android.app.Service;
  3. import android.content.Intent;
  4. import android.os.Binder;
  5. import android.os.IBinder;
  6. import android.util.Log;
  7. public class MyService extends Service
  8. {
  9. private MyBinder myBinder = new MyBinder();
  10. //  成功绑定后调用该方法
  11. @Override
  12. public IBinder onBind(Intent intent)
  13. {
  14. Log.d("MyService", "onBind");
  15. return myBinder;
  16. }
  17. //  重新绑定时调用该方法
  18. @Override
  19. public void onRebind(Intent intent)
  20. {
  21. Log.d("MyService", "onRebind");
  22. super.onRebind(intent);
  23. }
  24. //  解除绑定时调用该方法
  25. @Override
  26. public boolean onUnbind(Intent intent)
  27. {
  28. Log.d("MyService", "onUnbind");
  29. return super.onUnbind(intent);
  30. }
  31. @Override
  32. public void onCreate()
  33. {
  34. Log.d("MyService", "onCreate");
  35. super.onCreate();
  36. }
  37. @Override
  38. public void onDestroy()
  39. {
  40. Log.d("MyService", "onDestroy");
  41. super.onDestroy();
  42. }
  43. @Override
  44. public void onStart(Intent intent, int startId)
  45. {
  46. Log.d("MyService", "onStart");
  47. super.onStart(intent, startId);
  48. }
  49. public class MyBinder extends Binder
  50. {
  51. MyService getService()
  52. {
  53. return MyService.this;
  54. }
  55. }
  56. }

现在定义一个MyService变量和一个ServiceConnection变量,代码如下:

  1. private MyService myService;
  2. private ServiceConnection serviceConnection = new ServiceConnection()
  3. {
  4. //  连接服务失败后,该方法被调用
  5. @Override
  6. public void onServiceDisconnected(ComponentName name)
  7. {
  8. myService = null;
  9. Toast.makeText(Main.this, "Service 
    Failed.", Toast.LENGTH_LONG).show();
  10. }
  11. //  成功连接服务后,该方法被调用。在该方法中可以获得MyService对象
  12. @Override
  13. public void onServiceConnected(ComponentName name, IBinder service)
  14. {
  15. //  获得MyService对象
  16. myService = ((MyService.MyBinder) service).getService();
  17. Toast.makeText(Main.this, "Service 
    Connected.", Toast.LENGTH_LONG).show();
  18. }
  19. };

最后使用bindService方法来绑定Activity和Service,代码如下:

  1. bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE);

如果想解除绑定,可以使用下面的代码:

  1. unbindService(serviceConnection);

在MyService类中定义了一个MyBinder类,该类实际上是为了获得MyService的对象实例的。在 ServiceConnection接口的onServiceConnected方法中的第2个参数是一个IBinder类型的变量,将该参数转换成 MyService.MyBinder对象,并使用MyBinder类中的getService方法获得MyService对象。在获得 MyService对象后,就可以在Activity中随意操作MyService了。

运行本节的例子后,单击【Bind Service】按钮,如果绑定成功,会显示如图8.3所示的信息提示框。关闭应用程序后,会看到在LogCat视图中输出了onUnbind和 onDestroy信息,表明在关闭Activity后,服务先被解除绑定,最后被销毁。如果先启动(调用startService方法)一个服务,然后 再绑定(调用bindService方法)服务,会怎么样呢?在这种情况下,虽然服务仍然会成功绑定到Activity上,但在Activity关闭后, 服务虽然会被解除绑定,但并不会被销毁,也就是说,MyService类的onDestroy方法不会被调用。

 
图8.3  绑定服务

8.1.2 绑定Activity和Service的更多相关文章

  1. Activity和Service绑定

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

  2. Activity与Service进行数据交互

    Android启动Service有两种方法,一种是startService,一种是bindService.生命周期如下: 执行startService时,调用者如果没有stopService,Serv ...

  3. Activity与Service通信(不同进程之间)

    使用Messenger 上面的方法只能在同一个进程里才能用,如果要与另外一个进程的Service进行通信,则可以用Messenger. 其实实现IPC(Inter-Process Communicat ...

  4. Android之Activity与Service通信

    一.当Acitivity和Service处于同一个Application和进程时,通过继承Binder类来实现. 当一个Activity绑定到一个Service上时,它负责维护Service实例的引用 ...

  5. Activity与Service通信的方式有三种:

    在博客园看到的,看着挺不错的,借来分享下 继承Binder类 这个方式仅仅有当你的Acitivity和Service处于同一个Application和进程时,才干够用,比方你后台有一个播放背景音乐的S ...

  6. Android中Activity和Service的数据通讯

    在Android中,我们通常需要Activity跟Service进行通讯,很多人只知道Activity掉用Service,却不知道Service如何将数据返回给Activity.其实Service返回 ...

  7. 在Activity,Service,Window中监听Home键和返回键的一些思考,如何把事件传递出来的做法!

    在Activity,Service,Window中监听Home键和返回键的一些思考,如何把事件传递出来的做法! 其实像按键的监听,我相信很多人都很熟练了,我肯定也不会说这些基础的东西,所以,前期,还是 ...

  8. Android四大组件应用系列——Activity与Service交互实现APK下载

    Servic与Activity相比它没有界面,主要是在后台执行一些任务,Service有两种启动方法startService()和bindService(),startService方式Service ...

  9. 201709012工作日记--activity与service的通信机制

    service生命周期 Service主要包含本地类和远程类. Service不是Thread,Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 ...

随机推荐

  1. poj2155

    poj2155 题意 二维区间更新,单点查询. 分析 二维线段树. 也可以用二维树状数组去做,维护矩阵前缀和. code #include<cstdio> using namespace ...

  2. hdu6158(圆的反演)

    hdu6158 题意 初始有两个圆,按照标号去放圆,问放完 \(n\) 个圆后的总面积. 分析 圆的反演的应用. 参考blog 设反演圆心为 \(O\) 和反演半径 \(R\) 圆的反演的定义: 已知 ...

  3. 差分数组 and 树上差分

    差分数组 定义 百度百科中的差分定义 //其实这完全和要讲的没关系 qwq 进去看了之后是不是觉得看不懂? 那我简单概括一下qwq 差分数组de定义:记录当前位置的数与上一位置的数的差值. 栗子 容易 ...

  4. ASP.NET Core 2.2 基础知识(九) 使用托管服务实现后台任务

    在 ASP.NET Core 中,后台任务作为托管服务实现.托管服务是一个类,而且必须实现 IHostedService 接口,该接口定义了两个方法: StartAsync(CancellationT ...

  5. ASP.NET Core 2.2 基础知识(一) 依赖注入

    依赖: 类A用到了类B,我们就说类A依赖类B.如果一个类没有任何地方使用到,那这个类基本上可以删掉了. public class Test { private MyDependency md = ne ...

  6. py thon 多线程(转一篇好文章)

    http://www.cnblogs.com/fnng/p/3670789.html

  7. Java异常处理机制及两种异常的区别

    java异常处理机制主要依赖于try,catch,finally,throw,throws五个关键字.   try 关键字后紧跟一个花括号括起来的代码块,简称try块.同理:下面的也被称为相应的块. ...

  8. 【数论】【素数判定】CODEVS 2851 菜菜买气球

    素数判定模板. #include<cstdio> #include<map> using namespace std; ],ans=-,l,r,n,sum[]; bool is ...

  9. 【bzoj2142】【礼物】拓展Lucas定理+孙子定理

    (上不了p站我要死了,侵权度娘背锅) Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量 ...

  10. mysql-启动、关闭与重启

    启动 service mysqld start mysql.server start 停止 service mysqld stop mysql.server stop 重启 mysql.server ...