应用程序与Service之间通信

实现与Service通信有两种方法,第一种使用bindService()来启动Service;

第二种就是使用startService()启动Service,但是使用BroadCast广播作为信使,

 

 

[java][/java] view plaincopy

  1. public class BindService extends Service
  2. {
  3.     private int count;
  4.     private boolean quit;
  5.     // 定义onBinder方法所返回的对象
  6.     private MyBinder binder = new MyBinder();
  7.     // 通过继承Binder来实现IBinder类
  8.     public class MyBinder extends Binder
  9.     {
  10.         public int getCount()
  11.         {
  12.             // 获取Service的运行状态:count
  13.             return count;
  14.         }
  15.     }
  16.     // 必须实现的方法
  17.     @Override
  18.     public IBinder onBind(Intent intent)
  19.     {
  20.         System.out.println(“Service is Binded”);
  21.         // 返回IBinder对象
  22.         return binder;
  23.     }
  24.     // Service被创建时回调该方法。
  25.     @Override
  26.     public void onCreate()
  27.     {
  28.         super.onCreate();
  29.         System.out.println(“Service is Created”);
  30.         // 启动一条线程、动态地修改count状态值
  31.         new Thread()
  32.         {
  33.             @Override
  34.             public void run()
  35.             {
  36.                 while (!quit)
  37.                 {
  38.                     try
  39.                     {
  40.                         Thread.sleep(1000);
  41.                     }
  42.                     catch (InterruptedException e)
  43.                     {
  44.                     }
  45.                     count++;
  46.                 }
  47.             }
  48.         }.start();
  49.     }
  50.     // Service被断开连接时回调该方法
  51.     @Override
  52.     public boolean onUnbind(Intent intent)
  53.     {
  54.         System.out.println(“Service is Unbinded”);
  55.         return true;
  56.     }
  57.     // Service被关闭之前回调。
  58.     @Override
  59.     public void onDestroy()
  60.     {
  61.         super.onDestroy();
  62.         this.quit = true;
  63.         System.out.println(“Service is Destroyed”);
  64.     }
  65.     @Override
  66.     public void onRebind(Intent intent)
  67.     {
  68.         super.onRebind(intent);
  69.         this.quit = true;
  70.         System.out.println(“Service is ReBinded”);
  71.     }
  72. }

 

首先我们写一个BindService类,其中,必须重写IBinder onBind()方法,该方法返回一个Binder对象,(但是要注意,Binder为抽象类,需要定义一个内部类实现Binder对象),该对象将作为参数传给bindService(Intent intetn,ServiceConnection conn,int flags)方法的第二个参数,然后,在MainActivity中调用bindService()方法,这样应用程序与Service就形成了通信。

 

[java][/java] view plaincopy

  1. public class MainActivity extends Activity
  2. {
  3.     Button bind , unbind , getServiceStatus;
  4.     // 保持所启动的Service的IBinder对象
  5.     BindService.MyBinder binder;
  6.     // 定义一个ServiceConnection对象
  7.     private ServiceConnection conn = new ServiceConnection()
  8.     {
  9.         // 当该Activity与Service连接成功时回调该方法
  10.         @Override
  11.         public void onServiceConnected(ComponentName name
  12.             , IBinder service)
  13.         {
  14.             System.out.println(“–Service Connected–“);
  15.             // 获取Service的onBind方法所返回的MyBinder对象
  16.             binder = (BindService.MyBinder) service;
  17.         }
  18.         // 当该Activity与Service断开连接时回调该方法
  19.         @Override
  20.         public void onServiceDisconnected(ComponentName name)
  21.         {
  22.             System.out.println(“–Service Disconnected–“);
  23.         }
  24.     };
  25.     @Override
  26.     public void onCreate(Bundle savedInstanceState)
  27.     {
  28.         super.onCreate(savedInstanceState);
  29.         setContentView(R.layout.main);
  30.         // 获取程序界面中的start、stop、getServiceStatus按钮
  31.         bind = (Button) findViewById(R.id.bind);
  32.         unbind = (Button) findViewById(R.id.unbind);
  33.         getServiceStatus = (Button) findViewById(R.id.getServiceStatus);
  34.         //创建启动Service的Intent
  35.         final Intent intent = new Intent();
  36.         //为Intent设置Action属性
  37.         intent.setAction(“org.crazyit.service.BIND_SERVICE”);
  38.         bind.setOnClickListener(new OnClickListener()
  39.         {
  40.             @Override
  41.             public void onClick(View source)
  42.             {
  43.                 //绑定指定Serivce
  44.                 bindService(intent , conn , Service.BIND_AUTO_CREATE);
  45.             }
  46.         });
  47.         unbind.setOnClickListener(new OnClickListener()
  48.         {
  49.             @Override
  50.             public void onClick(View source)
  51.             {
  52.                 //解除绑定Serivce
  53.                 unbindService(conn);
  54.             }
  55.         });
  56.         getServiceStatus.setOnClickListener(new OnClickListener()
  57.         {
  58.             @Override
  59.             public void onClick(View source)
  60.             {
  61.                 // 获取、并显示Service的count值
  62.                 Toast.makeText(MainActivity.this
  63.                     , “Serivce的count值为:” + binder.getCount()
  64.                     , 4000)
  65.                     .show();
  66.             }
  67.         });
  68.     }
  69. }

 

运行程序

 

当点击“ 绑定Service”按钮时,在logcat中,我们可以看到“Service is connected”,同时我们可以看到Service的生命周期当点击“ 绑定Service”按钮时,在logcat中,我们可以看到“Service is connected”,同时我们可以看到Service的生命周期

 

标签