关于Service的开发详解已经在上一篇:Android开发四大组件之Service(详解篇)讲的很清楚了,本篇主要对Service的开发实例做下讲解。
程序运行效果图:
程序代码:
BindService:
package com.jph.servicedemo; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; /** * Describe:</br> * Service子类 * BindService实现了Service并重写了父类的 * onBind、onCreate、onDestroy、onUnbind * 以及onDestroy等方法。 * 并在onCreate方法中创建并启动一个线程,动态修改count变量值, * 创建Binder的子类LocalService类,用于作为绑定该Service时, * 回调方法的返回对象。 * @author JPH * Date:2014.07.21 * */ public class BindService extends Service { private int count=0; private boolean isQuit=false; //定义getService方法返回的对象 public LocalService localService=new LocalService(); //创建Binder子类 public class LocalService extends Binder{ public int getCount() { return count; } public BindService getService() { return BindService.this; } } //Service子类必须实现的方法,绑定该Service时回调的方法 @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return localService; } //Service被创建是调用该方法 @Override public void onCreate() { // TODO Auto-generated method stub System.out.println("Service is Created."); //创建并启动一个线程,动态修改count变量值 new Thread(){ @Override public void run() { // TODO Auto-generated method stub while (!isQuit) { try { Thread.sleep(1000);//使得当前线程休眠1000毫秒 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } count++; } } }.start(); super.onCreate(); } //在所有onUnbind被回调之后调用 @Override public void onDestroy() { // TODO Auto-generated method stub System.out.println("Service is Destroyed."); isQuit=true; super.onDestroy(); } //定义一个返回实例名的方法 public String getDemoName() { return "Service实例"; } //在所有与Service绑定的客户端都解除绑定之后被回调 @Override public boolean onUnbind(Intent intent) { // TODO Auto-generated method stub System.out.println("Service is Unbind."); return true;//表示下次客户端绑定的时候接受一个onRebind()的调用(而不是调用 onBind()) } }
ServiceDemo:
package com.jph.servicedemo; import com.jph.servicedemo.BindService.LocalService; import android.os.Bundle; import android.os.IBinder; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; /** * Describe:</br> * Service实例 * 本实例简单实现了绑定Service并与之通信 * @author JPH * Date:2014.07.21 * */ public class ServiceDemo extends Activity { Button btnBind,btnUnBind,btnGetServiceStatus; BindService bindService; LocalService localService; private boolean isBind=false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnBind=(Button)findViewById(R.id.btnBind); btnUnBind=(Button)findViewById(R.id.btnUnBind); btnGetServiceStatus=(Button)findViewById(R.id.btnGetServiceStatus); OnClickListener listener=new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btnBind: // Intent intent=new Intent(); // intent.setAction("com.jph.servicedemo.BIND_SERVICE"); //隐式启动Service Intent intent=new Intent(ServiceDemo.this,BindService.class);//显示启动Service //绑定指定的Service bindService(intent, serviceConnection, BIND_AUTO_CREATE); isBind=true; break; case R.id.btnUnBind: if (isBind) { //解除绑定Service unbindService(serviceConnection); isBind=false; bindService=null; Toast.makeText(ServiceDemo.this,"--Service is Unbind.--" , Toast.LENGTH_LONG).show(); }else { Toast.makeText(ServiceDemo.this,"--你还未绑定Service--" , Toast.LENGTH_LONG).show(); } break; case R.id.btnGetServiceStatus: if (bindService==null) { Toast.makeText(ServiceDemo.this,"请先绑定Service" , Toast.LENGTH_LONG).show(); }else { Toast.makeText(ServiceDemo.this,"App name:"+ bindService.getDemoName()+"\n count:"+ localService.getCount(), Toast.LENGTH_LONG).show(); } break; } } }; btnBind.setOnClickListener(listener); btnGetServiceStatus.setOnClickListener(listener); btnUnBind.setOnClickListener(listener); } //定义一个ServiceConnection对象 private ServiceConnection serviceConnection=new ServiceConnection() { //当Activity与Service连接成功的时候回调该方法 @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub bindService=null; Toast.makeText(ServiceDemo.this,"--Service UnConnected.--" , Toast.LENGTH_LONG).show(); } //当Activity与Service通过非UnBind()方法断开连接的时候回调该方法 @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub //获取getService()方法返回的BindService对象 localService=((LocalService)service); bindService=localService.getService(); Toast.makeText(ServiceDemo.this,"--Service Connected.--" , Toast.LENGTH_LONG).show(); System.out.println("--Service Connected.--"); } }; }
AndroidManifest.xml:
<!-- 配置一个Service组件 --> <service android:name=".BindService"> <intent-filter> <!-- 为该Service组件的intent-filter配置action --> <action android:name="com.jph.servicedemo.BIND_SERVICE"></action> </intent-filter> </service>
实例分析:
通过DDMS的LogCat有如上图所示的输出:
如果用户单击程序界面上的“绑定service”按钮即可看到上图所示的“Service is Created.”与“--Service Connected.--”的输出。当该Activity中绑定该Service之后,该Activity还可以通过LocalService对象获取Service的运行状态,如果用户单击程序界面上的“获取Service状态”按钮即可看到程序界面弹出的提示信息。如果我们单击“解除绑定”按钮,即可看到LogCat中的
输出信息:“Service is Unbind.”,“Service is Destroyed.”,当程序调用ubbindService()方法解除对某个Service的绑定时,系统会先回调Service的ubbindService()方法,然后回调onDestory()方法,这正验证了上一篇中讲到的onDestroy()是Service生命周期中最后一个被回调的方法。
与多次调用startService()方法启动Service不同的是,多次调用bindService()方法并不会重复绑定。在这个实例中不管用户单击“绑定Service”对少次,系统只会回调Service的onBind()方法一次。
时间: 2024-10-10 10:56:33