关于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:
<pre name="code" class="java">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通过非UnBind()方法断开连接的时候回调该方法
@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连接成功的时候回调该方法
@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()方法一次。