通过startService开启的服务,当访问者关闭时,服务仍然存在;访问者需要与服务进行通信,则我们需要将访问者与服务进行绑定;
如果使用Context.bindService()方法启动服务,则在服务未创建时,系统会调用服务的onCreate()方法,接着调用onBind()方法,这时就访问者与服务已经绑定了,主程序销毁时服务也会终止。
1)绑定服务时,会自动创建服务。
2)如果创建后并启动后再绑定,不会重新创建,一个Service只有一个实例
3)同时启动和绑定服务时,解除绑定服务,但不会销毁关闭服务的,必须解除绑定并停止服务。
4)通过StartService启动服务,当前Activity销毁,服务不会停止,通过BindService启动服务,当前Activity销毁,服务停止。
绑定与解绑定服务
(1)Context.bindService(Intent service,ServiceConnectionconn,BIND_AUTO_CREATE);//绑定服务
(2)Context.unbindService(ServiceConnectionconn);
ServiceConnection
ServiceConnection为一个接口,用于绑定和解绑定IBinder,因此需要创建一个类实现它;
class XxxServiceConnectionimplements ServiceConnection{@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {
//service为在onBind返回的IBinder//绑定Binder对象}@Overridepublic void onServiceDisconnected(ComponentName name) {//解绑定Binder对象}}
Service类
class XxxService extendsService{
private IBinder binder = new
XxxBinder();
public IBinderonBind(Intent intent){
return binder;
}
public int fun(int a){
//服务提供的方法,但是不能直接调用
...
private class XxxBinderextends Binder implements IXxxBinder{
//面向接口编程
public return fun1(int a){
//对外暴露的API
returnfun(a);
//内部调用Service的方法
案例:绑定服务
主要功能:Service实现不断输出1、2、3……的服务功能,Activity调用Service的公开方法,调出当时的一个值。继续上次服务的案例,增加绑定等功能。
打开activity_main.xml,添加两个命令按钮,绑定服务和解除绑定:
android:id="@+id/btnBindService" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="绑定服务" /> android:id="@+id/btnUnbindService" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="解除绑定" />2) MainActivity.java,添加相应代码:定义两按钮: private Button btnBindService,btnUnbindService;通过查找得到这两个按钮:btnBindService=(Button)findViewById(R.id.btnBindService); btnUnbindService=(Button)findViewById(R.id.btnUnbindService);3)添加事件侦听器:btnBindService.setOnClickListener(this);btnUnbindService.setOnClickListener(this);4)在onClick中添加判断分支:case R.id.btnBindService: bindService(serviceIntent,this,Context.BIND_AUTO_CREATE); break; case R.id.btnUnbindService: unbindService(this); break;需要当前类实现ServiceConnection,加进继承ServiceConnection:publicclass MainActivity extends ActionBarActivity implementsOnClickListener, ServiceConnection {同时产生了两接口方法,成功绑定的方法:@Override publicvoid onServiceConnected(ComponentName arg0, IBinder bind) { // TODO Auto-generCatedmethod stub System.out.println("onServiceConnected"); }解除绑定或Service崩溃时 @Override publicvoid onServiceDisconnected(ComponentName name) { // TODO Auto-generatedmethod stub System.out.println("onServiceDisconnected"); }5)onBind要指定返回值,否则绑定时,其实没有真正绑定,onServiceConnected不会执行定义内部类MyServiceBinder扩展自Binder:publicclass MyServiceBinder extends Binder{ public MyServicegetService() { return MyService.this;//取得服务的实例 } }定义myservicebinder,并返回:private final MyServiceBindermyservicebinder=new MyServiceBinder();public IBinder onBind(Intent arg0) { // TODO Auto-generatedmethod stub System.out.println("onBind"); returnmyservicebinder; }6)服务内添加一输出:privateinti=0; publicvoid startTimer(){ if(timer==null){ timer=new Timer(); task=new TimerTask(){ @Override publicvoid run(){ i++; System.out.println(i); } }; timer.schedule(task,1000,1000); } }publicvoid stopTimer(){ if(timer!=null) { task.cancel(); timer.cancel(); task=null; timer=null; } } private Timer timer=null; private TimerTask task=null; 其中,每一秒钟执行:timer.schedule(task,1000,1000);7)onCreate、onDestroy添加startTimer、stopTimer:publicvoid onCreate(){ System.out.println("创建好了"); startTimer(); super.onCreate(); } @Override publicvoid onDestroy(){ System.out.println("被销毁了"); stopTimer(); super.onDestroy(); }8)取得服务实例:publicclass MyServiceBinder extends Binder{ public MyService getService() { return MyService.this;//取得服务的实例 } }9)公开一个方法,取得服务内部的数字(状态):publicint getCurrentNum() { returni; }10)回到主Activity,取得服务定义变量:private MyService myService=null;取得实例:publicvoid onServiceConnected(ComponentNamearg0, IBinder bind) { // TODO Auto-generCatedmethod stub System.out.println("onServiceConnected"); myService=((MyService.MyServiceBinder) bind).getService(); }11)添加按钮android:id="@+id/btnGetCurrentNumber"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="GetCurrentNum" />定义按钮:private Button btnGetCurrentNumber;取得:btnGetCurrentNumber=(Button)findViewById(R.id.btnGetCurrentNumber);事件: btnGetCurrentNumber.setOnClickListener(this);实现:case R.id.btnGetCurrentNumber: if(myService!=null) { System.out.println("当前服务中的数字是"+myService.getCurrentNum()); } break;文献参考:http://blog.csdn.net/xiazdong/article/details/7772914http://www.cnblogs.com/andriod-html5/archive/2012/02/28/2539457.htmlhttp://blog.163.com/cazwxy_12/blog/static/898763720122106483898/另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。 网页题目:10天学通Android开发(2-3)-核心组件Service绑定-创新互联 标题URL:http://lswzjz.com/article/djpspo.html
android:id="@+id/btnBindService"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="绑定服务" />
android:id="@+id/btnUnbindService" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="解除绑定" />2) MainActivity.java,添加相应代码:定义两按钮: private Button btnBindService,btnUnbindService;通过查找得到这两个按钮:btnBindService=(Button)findViewById(R.id.btnBindService); btnUnbindService=(Button)findViewById(R.id.btnUnbindService);3)添加事件侦听器:btnBindService.setOnClickListener(this);btnUnbindService.setOnClickListener(this);4)在onClick中添加判断分支:case R.id.btnBindService: bindService(serviceIntent,this,Context.BIND_AUTO_CREATE); break; case R.id.btnUnbindService: unbindService(this); break;需要当前类实现ServiceConnection,加进继承ServiceConnection:publicclass MainActivity extends ActionBarActivity implementsOnClickListener, ServiceConnection {同时产生了两接口方法,成功绑定的方法:@Override publicvoid onServiceConnected(ComponentName arg0, IBinder bind) { // TODO Auto-generCatedmethod stub System.out.println("onServiceConnected"); }解除绑定或Service崩溃时 @Override publicvoid onServiceDisconnected(ComponentName name) { // TODO Auto-generatedmethod stub System.out.println("onServiceDisconnected"); }5)onBind要指定返回值,否则绑定时,其实没有真正绑定,onServiceConnected不会执行定义内部类MyServiceBinder扩展自Binder:publicclass MyServiceBinder extends Binder{ public MyServicegetService() { return MyService.this;//取得服务的实例 } }定义myservicebinder,并返回:private final MyServiceBindermyservicebinder=new MyServiceBinder();public IBinder onBind(Intent arg0) { // TODO Auto-generatedmethod stub System.out.println("onBind"); returnmyservicebinder; }6)服务内添加一输出:privateinti=0; publicvoid startTimer(){ if(timer==null){ timer=new Timer(); task=new TimerTask(){ @Override publicvoid run(){ i++; System.out.println(i); } }; timer.schedule(task,1000,1000); } }publicvoid stopTimer(){ if(timer!=null) { task.cancel(); timer.cancel(); task=null; timer=null; } } private Timer timer=null; private TimerTask task=null; 其中,每一秒钟执行:timer.schedule(task,1000,1000);7)onCreate、onDestroy添加startTimer、stopTimer:publicvoid onCreate(){ System.out.println("创建好了"); startTimer(); super.onCreate(); } @Override publicvoid onDestroy(){ System.out.println("被销毁了"); stopTimer(); super.onDestroy(); }8)取得服务实例:publicclass MyServiceBinder extends Binder{ public MyService getService() { return MyService.this;//取得服务的实例 } }9)公开一个方法,取得服务内部的数字(状态):publicint getCurrentNum() { returni; }10)回到主Activity,取得服务定义变量:private MyService myService=null;取得实例:publicvoid onServiceConnected(ComponentNamearg0, IBinder bind) { // TODO Auto-generCatedmethod stub System.out.println("onServiceConnected"); myService=((MyService.MyServiceBinder) bind).getService(); }11)添加按钮android:id="@+id/btnGetCurrentNumber"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="GetCurrentNum" />定义按钮:private Button btnGetCurrentNumber;取得:btnGetCurrentNumber=(Button)findViewById(R.id.btnGetCurrentNumber);事件: btnGetCurrentNumber.setOnClickListener(this);实现:case R.id.btnGetCurrentNumber: if(myService!=null) { System.out.println("当前服务中的数字是"+myService.getCurrentNum()); } break;文献参考:http://blog.csdn.net/xiazdong/article/details/7772914http://www.cnblogs.com/andriod-html5/archive/2012/02/28/2539457.htmlhttp://blog.163.com/cazwxy_12/blog/static/898763720122106483898/另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。 网页题目:10天学通Android开发(2-3)-核心组件Service绑定-创新互联 标题URL:http://lswzjz.com/article/djpspo.html
android:id="@+id/btnUnbindService"
android:text="解除绑定" />
2) MainActivity.java,添加相应代码:
定义两按钮:
private Button btnBindService,btnUnbindService;
通过查找得到这两个按钮:
btnBindService=(Button)findViewById(R.id.btnBindService); btnUnbindService=(Button)findViewById(R.id.btnUnbindService);
3)添加事件侦听器:
btnBindService.setOnClickListener(this);
btnUnbindService.setOnClickListener(this);
4)在onClick中添加判断分支:
case R.id.btnBindService: bindService(serviceIntent,this,Context.BIND_AUTO_CREATE);
break;
case R.id.btnUnbindService:
unbindService(this);
需要当前类实现ServiceConnection,加进继承ServiceConnection:
publicclass MainActivity extends ActionBarActivity implementsOnClickListener, ServiceConnection {
同时产生了两接口方法,
成功绑定的方法:
@Override
publicvoid onServiceConnected(ComponentName arg0, IBinder bind) {
// TODO Auto-generCatedmethod stub
System.out.println("onServiceConnected");
解除绑定或Service崩溃时
publicvoid onServiceDisconnected(ComponentName name) {
// TODO Auto-generatedmethod stub
System.out.println("onServiceDisconnected");
5)onBind要指定返回值,否则绑定时,其实没有真正绑定,onServiceConnected不会执行
定义内部类MyServiceBinder扩展自Binder:
publicclass MyServiceBinder extends Binder{
public MyServicegetService()
{
return MyService.this;//取得服务的实例
定义myservicebinder,并返回:
private final MyServiceBindermyservicebinder=new MyServiceBinder();
public IBinder onBind(Intent arg0) {
System.out.println("onBind");
returnmyservicebinder;
6)服务内添加一输出:
privateinti=0;
publicvoid startTimer(){
if(timer==null){
timer=new Timer();
task=new TimerTask(){
publicvoid run(){
i++;
System.out.println(i);
};
timer.schedule(task,1000,1000);
publicvoid stopTimer(){
if(timer!=null)
task.cancel();
timer.cancel();
task=null;
timer=null;
private Timer timer=null;
private TimerTask task=null;
其中,每一秒钟执行:
7)onCreate、onDestroy添加startTimer、stopTimer:
publicvoid onCreate(){
System.out.println("创建好了");
startTimer();
super.onCreate();
publicvoid onDestroy(){
System.out.println("被销毁了");
stopTimer();
super.onDestroy();
8)取得服务实例:
public MyService getService()
9)公开一个方法,取得服务内部的数字(状态):
publicint getCurrentNum()
returni;
10)回到主Activity,取得服务
定义变量:
private MyService myService=null;
取得实例:
publicvoid onServiceConnected(ComponentNamearg0, IBinder bind) {
myService=((MyService.MyServiceBinder) bind).getService();
11)添加按钮
android:id="@+id/btnGetCurrentNumber"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="GetCurrentNum" />定义按钮:private Button btnGetCurrentNumber;取得:btnGetCurrentNumber=(Button)findViewById(R.id.btnGetCurrentNumber);事件: btnGetCurrentNumber.setOnClickListener(this);实现:case R.id.btnGetCurrentNumber: if(myService!=null) { System.out.println("当前服务中的数字是"+myService.getCurrentNum()); } break;文献参考:http://blog.csdn.net/xiazdong/article/details/7772914http://www.cnblogs.com/andriod-html5/archive/2012/02/28/2539457.htmlhttp://blog.163.com/cazwxy_12/blog/static/898763720122106483898/另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。 网页题目:10天学通Android开发(2-3)-核心组件Service绑定-创新互联 标题URL:http://lswzjz.com/article/djpspo.html
android:id="@+id/btnGetCurrentNumber"
android:text="GetCurrentNum" />
定义按钮:
private Button btnGetCurrentNumber;
取得:
btnGetCurrentNumber=(Button)findViewById(R.id.btnGetCurrentNumber);
事件:
btnGetCurrentNumber.setOnClickListener(this);
实现:
case R.id.btnGetCurrentNumber:
if(myService!=null)
System.out.println("当前服务中的数字是"+myService.getCurrentNum());
文献参考:
http://blog.csdn.net/xiazdong/article/details/7772914
http://www.cnblogs.com/andriod-html5/archive/2012/02/28/2539457.html
http://blog.163.com/cazwxy_12/blog/static/898763720122106483898/
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。