Service中bindService

article/2025/10/1 7:53:37

最近有用到Activity需要不断的从Service中获取数据,第一个想法肯定就是通过bind回调机制了,有几点概念模糊特此记录下:

单独使用bindService(),unbindService()会经历:->onCreate()->onBind()->Service running->onUnbind() -> onDestroy() 。

单独使用startService(),stopService()会经历:->onCreate()->onStartCommand()->Service running-> onDestroy() 。

先调用startService(),再调用bindService()方法:

如果结束只调用unbindService(),那么只会执行到onUnbind(),将不会执行onDestroy():->onCreate()->onStartCommand()->onBind()->Service running-> onUnbind()。
如果在unbindService后,在调用stopService(),那么:->onCreate()->onStartCommand()->onBind()->Service running-> onUnbind()->onDestroy() 。
1、绑定的Service只有当应用组件绑定后才能运行,多个组件可以绑定一个Service,当调用unbind()方法时,这个service就会被销毁了。
2、Service与Activity一样都存在与当前进程的主线程中,所以,一些阻塞UI的操作,比如耗时操作不能放在service里进行,比如另外开启一个线程来处理诸如网络请求的耗时操作。如果在service里进行一些耗CPU和耗时操作,可能会引发ANR警告,这时应用会弹出是强制关闭还是等待的对话框。所以,对service的理解就是和activity平级的,只不过是看不见的,在后台运行的一个组件,这也是为什么和activity同被说为Android的基本组件。
3、图形理解Service:
在这里插入图片描述
通过这个图可以看到,两种启动Service的方式以及他们的生命周期,bindService的不同之处在于当绑定的组件销毁后,对应的Service也就被kill了。Service的声明周期相比与Activity的简单了许多,只要好好理解两种启动service方式的异同就行。
4、关于停止Service,如果service是非绑定的,最终当任务完成时,为了节省系统资源,一定要停止service,可以通过stopSelf()来停止,也可以在其他组件中通过stopService()来停止,绑定的service可以通过onUnBind()来停止service。

关于Activity与Service数据的互相传递,写了个demo:

public class MainActivity extends Activity implements View.OnClickListener {private  TextView mTextView;private EditText mEditText;private MyService.LocalBinder binder=null;MyService myService;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mEditText = (EditText) findViewById(R.id.edt_content);Button mBtnStart = (Button) findViewById(R.id.btn_start);Button mBtnClose = (Button) findViewById(R.id.btn_close);Button mBtnSubmit = (Button) findViewById(R.id.btn_submit);mTextView = (TextView) findViewById(R.id.tv_show);mBtnStart.setOnClickListener(this);mBtnClose.setOnClickListener(this);mBtnSubmit.setOnClickListener(this);}public ServiceConnection mServiceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {binder = (MyService.LocalBinder) service;//得到LocalBinder实例myService = binder.getService();//得到Service实例//设置接口回调获取Service中的数据myService.setOnDataCallback(new MyService.OnDataCallback() {@Overridepublic void onDataChange( final String message) {runOnUiThread(new Runnable() {@Overridepublic void run() {mTextView.setText(message);}});}});}@Overridepublic void onServiceDisconnected(ComponentName name) {myService = null;}};@Overridepublic void onClick(View v) {Intent intent = new Intent(this,MyService.class);switch (v.getId()){case R.id.btn_start:
//                startService(intent);bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);//为Activity绑定服务break;case R.id.btn_close:unbindService(mServiceConnection);//解除绑定
//                stopService(intent);break;case R.id.btn_submit:if(binder!=null){//把数据传给Service,相比用Bundle效率更高binder.setData(mEditText.getText().toString());}break;}}@Overrideprotected void onDestroy() {super.onDestroy();unbindService(mServiceConnection);//解除绑定}
}

MyService:

public class MyService extends Service {private String message ;private boolean isRunning = true;private IBinder binder = new LocalBinder();public class LocalBinder extends Binder {public void setData(String message) {//从Activity传入message值MyService.this.message = message;}public MyService getService() {//返回当前MyService对象return MyService.this;}}private OnDataCallback mOnDataCallback=null;public void setOnDataCallback(OnDataCallback mOnDataCallback) {this.mOnDataCallback = mOnDataCallback;}public interface OnDataCallback{void onDataChange(String message);}@Overridepublic IBinder onBind(Intent intent) {//返回这个LocalBinder对象,其实这个对象可以在Activity中onServiceConnected()方法中接收到,这个bind就是Activity和Service通信的桥梁//因为在Activity通过这个bind对象可以得到Service的实例引用。一旦Service对象找到,就能得到它的公共方法和属性。return binder;}@Overridepublic void onCreate() {super.onCreate();new Thread() {@Overridepublic void run() {int i=1;while (isRunning) {if(mOnDataCallback!=null){mOnDataCallback.onDataChange(message + i);}i++;try {sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}.start();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return super.onStartCommand(intent, flags, startId);}@Overridepublic boolean onUnbind(Intent intent) {return super.onUnbind(intent);}@Overridepublic void onDestroy() {super.onDestroy();isRunning = false;}
}

Activity能进行绑定得益于Service的接口onBind()。Service和Activity的连接可以用ServiceConnection来实现,需要实现一个新的ServiceConnection,重写onServiceConnected和onServiceDisconnected方法。执行绑定,调用bindService方法,传入一个选择了要绑定的Service的Intent(显式或隐式)和一个你实现了的ServiceConnection实例。一旦连接建立,你就能通Service的接口onBind()得到mBinder实例进而得到Service的实例引用。一旦Service对象找到,就能得到它的公共方法和属性。但这种方式,只能在同一个进程和同一个Application里。跨进程跨应用通信IPC需要建立aidl文件(注:Android5.0以后跨应用只能通过显示Intent来启动Service,即包名、类名)。


http://chatgpt.dhexx.cn/article/oLJesLLO.shtml

相关文章

bindService不调用onServiceConnected的问题

bindService不调用onServiceConnected的问题 昨天做一个项目时,Activity需要bindService获取到service实例与service进行交互,创建好service如下(例): class MyService{private IBinder mBinder new MyServicerBind…

bind服务

一、域名 www.baidu.com www.baidu.com. (.)根域 (com)一级域名 (baidu)二级域名 二、DNS解析记录分类 A记录、CNAME、MX记录、NS记录 1、A记录 通过域名直接查询到IP 例如&…

bindService启动流程

通过bindService启动的Service,会执行Service的onCreate、onBind、onUnbind、onDestroy方法,可以通过onBind方法返回的Binder对象和调用端进行通信,并且Service的生命周期和调用端同步。 如下是启动bindService的代码 var stu: Student? null val con…

AIDL报错,bindService一直连接不上、不起作用。

先说问题,最近用aidl,发现bindService根本就不走,不知道咋回事,明明写的没有任何毛病啊? //aidl绑定private void bind() {Intent intent new Intent();String pkg "com.example.mzz_service";//需要调用…

服务两种启动方式(startService与bindService)的区别

综上两篇文章 1.Android Service的基本用法(startService启动方式生命周期) 2.Android Service与Activity之间的通信(bindService启动方式) 区别如下: 一.生命周期上的区别 startService启动服务:Service会…

进程间通讯:Binder:bindService之 onServiceConnected回调

1:bindService官方概述 很明显 通过Google官方文档描述,我们知道 1:bindService()的返回值只是表明服务是否存在; 2:真正能代表是否成功绑定服务的是触发onServiceConnected(&…

Android入门第41天-Android中的Service(bindService)

介绍 在前一天我们介绍了Android中有两种启动Service的方法。并擅述了startService和bindService的区别。同时我们着重讲了startService。 因此今天我们就来讲bindService。bindService大家可以认为它是和Android的一个共生体。即这个service所属的activity如果消亡那么bindS…

Android Binder框架实现之bindService详解

Android Binder框架实现之bindService详解 Android Binder框架实现目录: Android Binder框架实现之Binder的设计思想 Android Binder框架实现之何为匿名/实名Binder Android Binder框架实现之Binder中的数据结构 Android Binder框架实现之Binder相关的接口和类 Andr…

Android bindService流程

一. 前言 我们可以通过startService来启动一个服务, 当然也可以通过bindService绑定一个服务,本篇文章我们来讲一讲绑定服务的完整流程, 阅读此文之前,建议先阅读一下笔者的这三篇文章 Android 进程间通信机制(三) 系统进程与应用进程通信 Android 进程间通信机制(四) 应用进程…

bind服务程序

一、介绍 1、bind服务是全球范围内使用最广泛、最安全可靠且高效的域名解析服务程序。 2、为了有效地限制bind服务程序仅能对自身的配置文件进行操作,以确保整个服务器的安全,在安装部署bind服务程序时加上chroot(俗称牢笼机制)…

startService bindService 区别

Android执行Service有两种方法,一种是startService,一种是bindService。下面让我们一起来聊一聊这两种执行Service方法的区别。 1、生命周期上的区别 执行startService时,Service会经历onCreate->onStartCommand。当执行stopService时&…

Android中Service使用bindService

前面已经对Service的startServer方式启动一个服务了解过了,现在来看一下Service的另一种启动方式→bindServer bindServer使用场景 1、在同个app之间调用(即是同一个进程中) 2、在不同app之间调用(即是跨进程间通信&#xff09…

Android——bindService()方法启动服务

通过绑定服务来启动的话需要注意创建一个类来实现ServiceConnection接口,重写onServiceConnected()和onServiceDisconnected()方法。这个类用于服务的连接。成功绑定服务时,会调用onServiceConnected&#…

Android Service 服务(三)—— bindService与remoteService

一、bindService简介 bindService是绑定Service服务,执行service服务中的逻辑流程。 service通过Context.startService()方法开始,通过Context.stopService()方法停止;也可以通过Service.stopSelf()方法或者Service.stopSelfResult()方法来停…

SO_BINDTODEVICE 使用

就绑定到了接口"lmi40"上,所有数据报的收发都只经过这个网卡. 对于SOL_BINDTODEVICE的总结如下: (1) 对于TCP套接口、UDP套接口、RAW套接口,可以通过SO_BINDTODEVICE套接口选项将套接口绑定到指定的网络接口上。绑定之后&…

startService与bindService的区别

Android执行Service有两种方法,一种是startService,一种是bindService。下面让我们一起来聊一聊这两种执行Service方法的区别。 1、生命周期上的区别 执行startService时,Service会经历onCreate->onStartCommand。当执行stopService时&…

startService和bindService的区别

首先看下其生命周期的区别: 生命周期: onCreate → startCommand → onDestroy onCreate → onBind→onUnBind→ onDestroy 静态绑定对应着startService;动态绑定对应着bindService,静态有自己独立的生命周期,动态会…

bindService的使用

bindService与starService之间的区别: 在程序通过startService()方法启动的服务,会长期在后台运行,并且启动服务的组件与服务之间没有关系,即使启动服务的组件被销毁,服务还是会运行。 但是当一…

Service学习以及BindService的使用

Service 什么是Service Service是一个可以在后台执行长时间操作而不使用用户界面的应用组件。 如何使用Service 我们首先需要实现一个Service的子类。主要实现Service的onCreat(),onStartCommand(),onB…

Android中bindService的使用及Service生命周期

Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯bindService的使用,不涉及任何startService方法调用的情况。如果想了解startService相关的使用,请参见《Andr…