Service有两种启动和关闭方式,一种是startService()、stopService(),这种方式Service无法和访问者通信、数据交换,另一个种是bindService()、unbindService()可以和访问者通信、数据交换。
1、Service端
public class FirstService extends Service{
private int count;
private boolean quit;
MyBinder binder=new MyBinder();
class MyBinder extends Binder
{
//获取状态值
public int getCount(){
return count;
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("Service is Binded");
//返回的binder对象,給访问者去获取状态值getCount
return binder;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
System.out.println("Service is Created");
new Thread()
{
public void run() {
while(!quit)
{
try {
Thread.sleep(1000);
} catch (Exception e) {
}
count++;
}
};
}.start();
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("Service is Unbinded");
return true;
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
this.quit=true;
System.out.println("Service is Destoryed");
}
}
1、访问者端(Activity)
public class ServiceConnActivity extends Activity {
// 保持启动Service的bindler对象,通过这个对象去访问Service
FirstService.MyBinder binder;
Button bind, unbind,getServiceStatus;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(android.content.ComponentName name,
android.os.IBinder service) {
System.out.println("service connected");
// 获取Service的onbind方法返回的myBinder对象
binder = (FirstService.MyBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
System.out.println("service not connected");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.service_conn);
bind = (Button) findViewById(R.id.bind);
unbind = (Button) findViewById(R.id.unbind);
getServiceStatus= (Button) findViewById(R.id.getServiceStatus);
final Intent intent = new Intent();
intent.setAction("org.crazyit.service.BIND_SERVICE");
//显式启动Service
intent.setPackage("com.jyx.broadcast");
startService(intent);
bind.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/*
* intent:通过intent来指定要启动的Service
* conn:监听访问者与Service的连接情况
* flags:指定绑定时是否自动创建Service,0代表不
*/
bindService(intent, conn, Service.AUDIO);
}
});
unbind.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
unbindService(conn);
}
});
getServiceStatus.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(ServiceConnActivity.this, "Service的状态值是:"+
binder.getCount(), Toast.LENGTH_SHORT).show();
}
});
}
}
3、配置Service
<service android:name="com.jyx.broadcast.FirstService"
android:exported="true">
<intent-filter >
<action android:name="org.crazyit.service.BIND_SERVICE"/>
</intent-filter>
</service>
不管点击“绑定Service”多少次,系统只调用Service的onBind()方法一次