android服务unbind之后再想绑定问题

突然遇到个问题, 问题描述:

我按照顺序来绑定一个服务:start->bind 最后在退出activity的时候unbind一下, 现在我有这样的业务需求,就是当我再次进入该activity时需要再次bind, 我发现再调用bind方法并不能绑定服务(不知道google工程师为啥要设计成这样。)

写了一段测试代码验证一下:

Service:

package org.load.testservice;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
System.out.println("bind....");
return null;
}
@Override
public void onCreate() {
System.out.println("oncreate....");
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("onstart....");
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("unbind....");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
System.out.println("destroy...");
super.onDestroy();
}
}

activity:

package org.load.testservice;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
public class MainActivity extends Activity {
private MyConn conn = new MyConn();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void startService(View view) {
startService(new Intent(this, MyService.class));
}
public void bindService(View view) {
bindService(new Intent(this, MyService.class), conn, Context.BIND_AUTO_CREATE);
}
public void unbindService(View view) {
unbindService(conn);
}
private class MyConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}

 
第一次按照顺序点击按钮发现没多大问题, 服务依次进行了create、start、bind、unbind。

但是当我再次点击“绑定服务”的时候问题出现了onBind方法没有执行!!也就是说没有成功绑定!!!

查看文档看到Service还有一个生命周期方法onRebind,好像看到希望了, 添加上再试试:

 @Override
public void onRebind(Intent intent) {
System.out.println("rebind...");
super.onRebind(intent);
}

怀着激动心情再次测试,logcat遗憾的告诉我还是不行!!!!

仔细查看onRebind的官方说明:

Called when new clients have connected to the service, after it had previously been notified that all had disconnected in its onUnbind.

This will only be called if the implementation of onUnbind was overridden to return true.

最重要的是最后一句话,意思是:这个方法只有当onUnbind返回true的时候才能被调用。

现在改写onUnbind:

 @Override
public boolean onUnbind(Intent intent) {
System.out.println("unbind....");
return true;
}

再次查看logcat, 别的不多说了,上图:

总结:

多次bind、unbind一个服务,只有在第一次的时候才会调用服务的onBind方法, 解除绑定后继续绑定并不会调用onBind而是调用了onRebind, 但是要想让onRebind顺利的调用还有一个条件就是onUnbind必须返回true。

android服务unbind之后再想绑定问题,布布扣,bubuko.com

时间: 2024-10-05 14:41:55

android服务unbind之后再想绑定问题的相关文章

Android(java)学习笔记228:服务(service)之绑定服务调用服务里面的方法

1.绑定服务调用服务里面的方法,图解: 步骤: (1)在Activity代码里面绑定 bindService(),以bind的方式开启服务 :                     bindService(intent, new MyConn(), BIND_AUTO_CREATE): 参数intent:意图对象,服务对应的意图对象  new  Intent(this,Service.class) 参数ServiceConnection (接口,自定义其接口实现内部类MyConn() ):通讯

Android服务Service总结

转自 http://blog.csdn.net/liuhe688/article/details/6874378 富貴必從勤苦得,男兒須讀五車書.唐.杜甫<柏學士茅屋> 作为程序员的我们,须知富贵是要通过勤苦努力才能得到的,要想在行业内有所建树,就必须刻苦学习和钻研. 今天我们来讲一下Android中Service的相关内容. Service在Android中和Activity是属于同一级别上的组件,我们可以将他们认为是两个好哥们,Activity仪表不凡,迷倒万千少女,经常做一些公众人物角色

android服务

Service有两种启动模式:startService和bindService. 1.startService启动的服务,如果在Activity里面没有停止这个服务的话,Activity关闭之后Service还在. 2.bindService启动的服务,Activity关闭了之后Service也关闭了. bind启动,unbind解除的话服务直接会Destroy. 3.startService和bindService组合使用,先startService启动服务,再bindService绑定服务,

Android服务——Service

服务 Service 是一个可以在后台执行长时间运行操作而不使用用户界面的应用组件.服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行. 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC). 例如,服务可以处理网络事务.播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行. 服务基本上分为两种形式: 启动 当应用组件(如 Activity)通过调用 startService() 启动服务时,服务即处于"启动"状态

Android——服务

服务默默的在后台工作着,执行着不需要和用户交互的工作. 服务依赖于应用程序进程而存活 作为四大组件之一,服务具备共同的特点——需要在AndroidManifest中注册 Android多线程编程 需要注意的是——一定不要在子线程中进行UI操作,否则会阻塞主线程出现异常 1 /** 主要的逻辑是在这里完成,但是考虑到:服务默认是在主线程执行的,如果在这里进行比较费时的操作<br/> 2 * 就容易出现ANR(Application Not Responding).<br/> 3 *

Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38140505 自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScr

Android 服务类Service 的详细学习

上一篇说到了通知栏Notification,提起通知栏,不得让人想到Service以及BroadcastReceive,作为android的4大组建的2个重要成员,我们没少和它们打交道.它们可以在无形中使我们的软件和网络.数据库.系统等进行交互,之后通过UI(Notification就是一种展示方式)把结果展现在我们面前.可以说,他们是android生命体系里面的神经系统,通过反射条件让身体展现不同的状态.在整个系统中,广播接收器充当着是传输者和监听者的角色,它把系统的一点点变化都反馈上去,之后

Xamarin.Android服务的实现

一.服务的生命周期 服务与活动一样,在它的整个生命周期中存在着一些事件,下图可以很好解释整个过程以及涉及到的方法: 在真实的使用中,Service来还包含一个OnBind方法,并且必须要使用该方法,但是只要返回NULL即可,除非当前服务是一个绑定服务,那么就要返回实现了IBinder的实例. 二.回调方法的总结 上图中涉及到了几个方法,下面将做简单的介绍: OnCreate:只会在服务第一次开启的时候调用,主要负责一些初始化代码 OnStartCommand:每次启动服务都会调用该方法,可能来自

Android服务Service使用总结

一.Service简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver. ContentProvider),它跟Activity的级别差不多,但不能页面显示只能后台运行,并且可以和其他组件进行交互.service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务总是藏在后台的,例如,一个