安卓开启服务的方法

来源:互联网 发布:csgo弹道优化参数 编辑:程序博客网 时间:2024/05/21 09:04

1.服务类:继承Service,实现onBind()方法返回IBinder对象,新建一个继承自Binder的内部类并在部内类的方法中返回活动服务交互的内容,定义一内部类对象,

public class BindService extends Service{   private int count;   private boolean quit;   // 定义onBinder方法所返回的对象   private MyBinder binder = new MyBinder();   // 通过继承Binder来实现IBinder类   public class MyBinder extends Binder  // ①   {      public int getCount()      {         // 获取Service的运行状态:count         return count;      }   }   // 必须实现的方法,绑定该Service时回调该方法   @Override   public IBinder onBind(Intent intent)   {      System.out.println("Service is Binded");      // 返回IBinder对象      return binder;   }   // Service被创建时回调该方法   @Override   public void onCreate()   {      super.onCreate();      System.out.println("Service is Created");      // 启动一条线程,动态地修改count状态值      new Thread()      {         @Override         public void run()         {            while (!quit)            {               try               {                  Thread.sleep(1000);               }               catch (InterruptedException e)               {               }               count++;            }         }      }.start();   }   // Service被断开连接时回调该方法   @Override   public boolean onUnbind(Intent intent)   {      System.out.println("Service is Unbinded");      return true;   }   // Service被关闭之前回调该方法   @Override   public void onDestroy()   {      super.onDestroy();      this.quit = true;      System.out.println("Service is Destroyed");   }}
2.活动类:新建一ServiceConnection对象在onServiceConnected中获取Service中的IBinder返回的Binder类,
public class MainActivity extends Activity{   Button bind, unbind, getServiceStatus;   // 保持所启动的Service的IBinder对象   BindService.MyBinder binder;   // 定义一个ServiceConnection对象   private ServiceConnection conn = new ServiceConnection()   {      // 当该Activity与Service连接成功时回调该方法      @Override      public void onServiceConnected(ComponentName name            , IBinder service)      {         System.out.println("--Service Connected--");         // 获取Service的onBind方法所返回的MyBinder对象         binder = (BindService.MyBinder) service;  // ①      }      // 当该Activity与Service断开连接时回调该方法      @Override      public void onServiceDisconnected(ComponentName name)      {         System.out.println("--Service Disconnected--");      }   };   @Override   public void onCreate(Bundle savedInstanceState)   {      super.onCreate(savedInstanceState);      setContentView(R.layout.main);      // 获取程序界面中的start、stop、getServiceStatus按钮      bind = (Button) findViewById(R.id.bind);      unbind = (Button) findViewById(R.id.unbind);      getServiceStatus = (Button) findViewById(R.id.getServiceStatus);      // 创建启动Service的Intent      final Intent intent = new Intent(this, BindService.class);      bind.setOnClickListener(new OnClickListener()//绑定按钮      {         @Override         public void onClick(View source)         {            // 绑定指定Service            bindService(intent, conn, Service.BIND_AUTO_CREATE);         }      });      unbind.setOnClickListener(new OnClickListener()//取消绑定按钮      {         @Override         public void onClick(View source)         {            // 解除绑定Service            unbindService(conn);         }      });      getServiceStatus.setOnClickListener(new OnClickListener()//获取服务交互内容的按钮      {         @Override         public void onClick(View source)         {            // 获取、并显示Service的count值            Toast.makeText(MainActivity.this,                  "Service的count值为:" + binder.getCount(),                  Toast.LENGTH_SHORT).show();  // ②         }      });   }}
启动流程:点击绑定按钮调用Context的bindService方法,传入Service的Intent和一个ServiceConnection对象,该ServiceConnection对象所在的类要重写
onServiceConnected()方法,因为这个方法在活动与服务连接的时间调用,它的IBinder参数service即为Service类中的返回与活动交互的Binder对象,将其赋值给
活动的BindService.MyBinder对象,此时由这个对象去调用Service内部的集成Binder类的MyBinder类的方法getCount()去获取与服务交互的内容。

原创粉丝点击