Activity提供了用户操作的视图界面,而Service则能在Activity退出时运行在后台,在实际的android应用开发中,经常会用到Activity和Service,它们是如何绑定的呢。
Service的启动:context.startService(Intent i)
Service的绑定:context.bindService(Intent service, ServiceConnection conn,int flags)
Service的解绑:context.unbind(ServiceConnection conn)
Service的停止:context.stopService(Intent i)
通过Activity启动和绑定Service,有两种方法:
1、启动Activity后,startService–>bindService–>进行通信后–>unbind–>stopService;
2、启动Activity后,bindService–>进行通信–>unbind;
这两种方法是有差别的,第一种当Activity没有stopService就退出时,service会一直在后台运行,直到有哪个组件stop它,当Activity与Service bind后,要想停止Service,则必须即unbind又stopService(两者哪个先执行都可以)。
第二种,当bindService时可以指定自动创建Service并将其与Activity绑定,一旦退出Activity时,Service也会先unbind后destory。
下面看一个例子:
package com.qiaqia.androidapp;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends ActionBarActivity implements View.OnClickListener,ServiceConnection{
private Button btnStart,btnStop,btnBind,btnUnbind;
private Intent i;
private MyService myService = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//界面是四个button,代码就不展示了
setContentView(R.layout.activity_main);
System.out.println("oncreate!");
//初始化四个按钮
btnStart = (Button) findViewById(R.id.btnStart);
btnStop = (Button) findViewById(R.id.btnStop);
btnBind = (Button) findViewById(R.id.btnBind);
btnUnbind = (Button) findViewById(R.id.btnUnbind);
//指定监听器
btnStart.setOnClickListener(this);
btnStop.setOnClickListener(this);
btnBind.setOnClickListener(this);
btnUnbind.setOnClickListener(this);
//创建Intent,并添加数据,用来实现与service的通信
i = new Intent();
i.setClass(this,MyService.class);
i.putExtra("lalala","我来自activity");
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case(R.id.btnStart):
//启动Service,Service会执行onCreate方法
startService(i);
break;
case(R.id.btnStop):
//停止Service,Service会执行onDestory方法
stopService(i);
break;
case(R.id.btnBind):
//绑定service,这里需要该Activity实现ServiceConnected接口
bindService(i,this, BIND_AUTO_CREATE);
break;
case(R.id.btnUnbind):
//解除绑定
unbindService(this);
break;
}
}
/**
* 当Service中的onBind返回值不为空时,会调用下面的函数
* /
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("onserviceConnected");
myService = ((MyService.MyBinder)service).getMyService();
System.out.println(myService.getStr());
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
MyService.java
package com.qiaqia.androidapp;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
System.out.println("onBind");
//当与Activity绑定后,可获取intent中的数据
System.out.println("this is service, "+intent.getExtras().getString("lalala"));
//若返回值为空,则与之相绑定的Connection不会执行
//onServiceConnected方法
return binder;
}
private final MyBinder binder = new MyBinder();
//通过下面这个类中的getMyService方法来获取该Service对象
class MyBinder extends Binder{
public MyService getMyService(){
return MyService.this;
}
}
public String getStr(){
return "我是service,你好activity";
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("onunbind");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("ondestroy in service");
}
@Override
public void onCreate() {
super.onCreate();
System.out.println("oncreate in service");
}
}
以下为运行结果:
1、依次点击start–stop,输出oncreate in service,ondestroy in service
2、依次点击start–bind–unbind–destory,
输出 oncreate in service
onBind //onBind方法执行
this is service, 我来自activity //onbind方法执行,取得intent中的数据
onserviceConnected //onServiceConnected方法执行
我是service,你好activity //调用取得与之绑定的Service中的方法
onunbind in service
ondestroy in service
3、依次点击bind–unbind
输出结果与2相同