Service--简单学习

来源:互联网 发布:宁波市软件产业园 编辑:程序博客网 时间:2024/06/03 12:41

参考文章:http://www.runoob.com/w3cnote/android-tutorial-service-1.html
Service是Android提供一个允许长时间留驻后台的一个组件,最常见的 用法就是做轮询操作!或者想在后台做一些事情,比如后台下载更新!

Android中使用Service的方式有两种:
1)StartService()启动Service
2)BindService()启动Service

StartService()和BindService()的区别:
通过前者启动的service,调用者和service无必然联系,当调用者销毁时,service不会销毁而是一直运行,只有调用了StopService才会停止;通过后者启动的service,调用者和service是相互关联的,调用者销毁,那么service也会销毁,如果是多个调用者绑定一个service,其中一个调用者想解除绑定只需调用unbindService(),当所有调用者都解除绑定,service便会销毁。

1.StartService

先上代码:

TestService1.javapublic class TestService1 extends Service{    private final String TAG="TestService";    //必须要实现的方法    @Override    public IBinder onBind(Intent intent) {        // TODO Auto-generated method stub        Log.i(TAG, "onBind方法被调用");        return null;    }    //service创建时被调用    @Override    public void onCreate() {        // TODO Auto-generated method stub        Log.i(TAG, "onCreate方法被调用");        super.onCreate();    }    //service被启动时调用    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        // TODO Auto-generated method stub        Log.i(TAG, "onStartCommand方法被调用");        return super.onStartCommand(intent, flags, startId);    }    //service被关闭时调用    @Override    public void onDestroy() {        // TODO Auto-generated method stub        Log.i(TAG, "onDestroy方法被调用");        super.onDestroy();    }}
<!-- 配置Service组件,同时配置一个action -->   <service android:name=".TestService1">            <intent-filter >                <action android:name="com.example.buttondemo.TestService1"/>            </intent-filter>        </service>
MainActivity.javapublic class MainActivity extends Activity implements OnClickListener{    private Button btn_start,btn_stop;    private Intent intent;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btn_start=(Button)findViewById(R.id.btn_start);        btn_stop=(Button)findViewById(R.id.btn_stop);        btn_start.setOnClickListener(this);        btn_stop.setOnClickListener(this);         //创建启动Service的Intent,以及Intent属性          intent=new Intent();        intent.setAction("com.example.buttondemo.TestService1");    }    @Override    public void onClick(View v) {        // TODO Auto-generated method stub        switch (v.getId()) {        case R.id.btn_start:            startService(intent);            break;        case R.id.btn_stop:            stopService(intent);            break;        default:            break;        }    }}

运行截图:
这里写图片描述
这里写图片描述

如图:
第一次点击开始服务,onCreate和onStartCommand方法被调用,再点击开始服务,onCreate方法不再被调用,onStartCommand被调用,直到点击停止服务,onDestroy方法被调用。

①首次启动会创建一个Service实例,依次调用onCreate()onStartCommand()方法,此时Service 进入运行状态,如果再次调用StartService启动Service,将不会再创建新的Service对象, 系统会直接复用前面创建的Service对象,调用它的onStartCommand()方法!②但这样的Service与它的调用者无必然的联系,就是说当调用者结束了自己的生命周期, 但是只要不调用stopService,那么Service还是会继续运行的!③无论启动了多少次Service,只需调用一次StopService即可停掉Service

2.BindService

Step 1:在自定义的Service中继承Binder,实现自己的IBinder对象
Step 2:通过onBind( )方法返回自己的IBinder对象
Step 3:在绑定该Service的类中定义一个ServiceConnection对象,重写两个方法, onServiceConnected和onDisconnected!然后直接读取IBinder传递过来的参数即可!

TestService2.java:

public class TestService2 extends Service {      private final String TAG = "TestService2";      private int count;      private boolean quit;      //定义onBinder方法所返回的对象      private MyBinder binder = new MyBinder();      public class MyBinder extends Binder      {          public int getCount()          {              return count;          }      }      //必须实现的方法,绑定改Service时回调该方法      @Override      public IBinder onBind(Intent intent) {          Log.i(TAG, "onBind方法被调用!");          return binder;      }      //Service被创建时回调      @Override      public void onCreate() {          super.onCreate();          Log.i(TAG, "onCreate方法被调用!");          //创建一个线程动态地修改count的值          new Thread()          {              public void run()               {                  while(!quit)                  {                      try                      {                          Thread.sleep(1000);                      }catch(InterruptedException e){e.printStackTrace();}                      count++;                  }              };          }.start();      }      //Service断开连接时回调      @Override      public boolean onUnbind(Intent intent) {          Log.i(TAG, "onUnbind方法被调用!");          return true;      }      //Service被关闭前回调      @Override      public void onDestroy() {          super.onDestroy();          this.quit = true;          Log.i(TAG, "onDestroyed方法被调用!");      }      @Override      public void onRebind(Intent intent) {          Log.i(TAG, "onRebind方法被调用!");          super.onRebind(intent);      }  } 

在AndroidManifest.xml中对Service组件进行注册:

<service android:name=".TestService2" android:exported="false">          <intent-filter>              <action android:name="com.jay.example.service.TEST_SERVICE2"/>          </intent-filter>  </service>  

MainActivity.java:

public class MainActivity extends Activity {      private Button btnbind;      private Button btncancel;      private Button btnstatus;      //保持所启动的Service的IBinder对象,同时定义一个ServiceConnection对象      TestService2.MyBinder binder;      private ServiceConnection conn = new ServiceConnection() {          //Activity与Service断开连接时回调该方法          @Override          public void onServiceDisconnected(ComponentName name) {              System.out.println("------Service DisConnected-------");          }          //Activity与Service连接成功时回调该方法          @Override          public void onServiceConnected(ComponentName name, IBinder service) {              System.out.println("------Service Connected-------");              binder = (TestService2.MyBinder) service;          }      };      @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          btnbind = (Button) findViewById(R.id.btnbind);          btncancel = (Button) findViewById(R.id.btncancel);          btnstatus  = (Button) findViewById(R.id.btnstatus);          final Intent intent = new Intent();          intent.setAction("com.jay.example.service.TEST_SERVICE2");          btnbind.setOnClickListener(new OnClickListener() {                        @Override              public void onClick(View v) {                  //绑定service                  bindService(intent, conn, Service.BIND_AUTO_CREATE);                              }          });          btncancel.setOnClickListener(new OnClickListener() {              @Override              public void onClick(View v) {                  //解除service绑定                  unbindService(conn);                              }          });          btnstatus.setOnClickListener(new OnClickListener() {              @Override              public void onClick(View v) {                  Toast.makeText(getApplicationContext(), "Service的count的值为:"                          + binder.getCount(), Toast.LENGTH_SHORT).show();              }          });      }  }  

运行图如下:
这里写图片描述

点击锁定service:

这里写图片描述

再次点击锁定service,没有任何反应。

点击获取service状态

这里写图片描述

点击解除service:

这里写图片描述

使用BindService绑定Service,依次调用onCreate(),onBind()方法, 我们可以在onBind()方法中返回自定义的IBinder对象;再接着调用的是 ServiceConnection的onServiceConnected()方法该方法中可以获得 IBinder对象,从而进行相关操作;当Service解除绑定后会自动调用 onUnbind和onDestroyed方法,当然绑定多客户端情况需要解除所有 的绑定才会调用onDestoryed方法进行销毁!
0 0
原创粉丝点击