zoukankan      html  css  js  c++  java
  • 8.1.2 绑定Activity和Service

    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

    本节的例子代码所在的工程目录是srcch08ch08_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.  
    3. import android.app.Service;  
    4. import android.content.Intent;  
    5. import android.os.Binder;  
    6. import android.os.IBinder;  
    7. import android.util.Log;  
    8.  
    9. public class MyService extends Service  
    10. {  
    11.     private MyBinder myBinder = new MyBinder();  
    12.     //  成功绑定后调用该方法  
    13.     @Override  
    14.     public IBinder onBind(Intent intent)  
    15.     {  
    16.         Log.d("MyService", "onBind");  
    17.         return myBinder;  
    18.     }  
    19.     //  重新绑定时调用该方法  
    20.     @Override  
    21.     public void onRebind(Intent intent)  
    22.     {  
    23.         Log.d("MyService", "onRebind");  
    24.         super.onRebind(intent);  
    25.     }  
    26.     //  解除绑定时调用该方法  
    27.     @Override  
    28.     public boolean onUnbind(Intent intent)  
    29.     {  
    30.         Log.d("MyService", "onUnbind");  
    31.         return super.onUnbind(intent);  
    32.     }  
    33.     @Override  
    34.     public void onCreate()  
    35.     {  
    36.         Log.d("MyService", "onCreate");  
    37.         super.onCreate();  
    38.     }  
    39.     @Override  
    40.     public void onDestroy()  
    41.     {  
    42.         Log.d("MyService", "onDestroy");  
    43.         super.onDestroy();  
    44.     }  
    45.     @Override  
    46.     public void onStart(Intent intent, int startId)  
    47.     {  
    48.         Log.d("MyService", "onStart");  
    49.         super.onStart(intent, startId);  
    50.     }  
    51.     public class MyBinder extends Binder  
    52.     {  
    53.         MyService getService()  
    54.         {  
    55.             return MyService.this;  
    56.         }  
    57.     }  

    现在定义一个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  绑定服务
  • 相关阅读:
    Notepad++ 配置信息导出导入(快捷键配置导出导入等等)
    SQL 删除重复数据
    PostgreSQL Update 根据B表更新A表
    桌面应用基本创建流程
    Android shape和selector完全总结
    Android 第三方框架之Charts
    java常见五种排序方式
    Objective-c之字典精讲
    OC语言之---NSArray
    Objective-c编程之NSString精讲
  • 原文地址:https://www.cnblogs.com/xgjblog/p/3927822.html
Copyright © 2011-2022 走看看