Activity与本地Service的绑定

在Android应用程序中,Activity负责界面的显示,Service负责后台工作,当然后台和界面是需要交互的,所以Activity需要和Service交互.

比较常用的是Activity和本地Service的交互,本文介绍的便是这种,最终实现Activity和Service都能很方便地调用对方的public方法。

其实只要让Activity和Service绑定之后,分别拥有对方的引用就可以了。

以MainActivity和MyService为例

创建一个服务类MyService.java

public class MyService extends Service {

	private MainActivity activity;

	@Override
	public IBinder onBind(Intent arg0) {
		return new MyBinder();
	}

	/**
	 * 与activity绑定后返回的Binder
	 */
	public class MyBinder extends Binder {
		// 获取service对象的引用
		public MyService getService() {
			return MyService.this;
		}
	}

	public void setActivity( MainActivity _activity){
		this.activity =  _activity;
	}

}

让Service中拥有一个Activity类型的成员,并提供setActivity()方法

注意要在androidManifest中声明该Service

<service
            android:name=".MyService"
            ></service>

然后在MainActivity中实现绑定

public class MainActivity extends Activity {

// 本地服务
	private MyService mLocalService;

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		bindLocalService();
	}

	/**
	 * 创建并绑定本地Service
	 * */
	private void bindLocalService() {
		Intent bindIntent = new Intent(this, MyService.class);
		bindService(bindIntent, localServiceConnection, BIND_AUTO_CREATE);
	}

/**
	 * 绑定本地服务的ServiceConnection类
	 */
	ServiceConnection localServiceConnection = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName arg0) {
			mLocalService = null;
		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			MyBinder myBinder = (MyService.MyBinder) service;
			mLocalService = myBinder.getService();
			mLocalService.setActivity(MainActivity.this);

		}
	};

}

要点是这里

@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			MyBinder myBinder = (MyService.MyBinder) service;
			mLocalService = myBinder.getService();
			mLocalService.setActivity(MainActivity.this);

		}

实现绑定之后,MainActivity里的mLocalService成员指向MyService对象的引用,而MyService里的activity成员指向MainActivity的引用

这样一来,就可以调用对方里的public方法了

比如

1. MyService里有一个方法

public void print(String s){
   System.out.println("is in service --> "+s);
}

则在MainActivity中可以这样调用

mLocalService.print("call from activity");

2. MainActivity里有一个TextView对象textView,并有更新textView内容的方法

public void updateTextView(String s){
   textView.setText(s);
}

则在MyService中可以这样调用

activity.updateTextView("service call the fun in activity");

如果在Service里创建了新线程,则新线程与activity的UI线程的通信用的是异步消息处理机制,可在MainActivity中创建一个public static 的Handler对象

	public static Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			System.out.println("handler say something");
		}
	};

然后在MyService中获得这个handler的引用

private Handler mHandler = MainActivity.handler;

这样子,MyService里就也能方便地用mHandler来更新UI了

还有用广播Broadcast来实现Service通知UI更新的,不过这样消耗太大,不建议这么做

上面的做法,即实现了Service与Activity的交互,也让这两个类的尽量独立解藕,方便类的维护。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 18:46:47

Activity与本地Service的绑定的相关文章

android菜鸟学习笔记28----Android中的Service生命周期及本地和远程服务绑定的实现

Service是Android中长期在后台运行的没有界面的组件,使用服务的优势在于:能够提高进程的优先级,系统不容易回收掉进程,即便回收了,内存充足的时候,会把进程重新创建. 1.服务的简单使用示例: 1.1.定义一个服务: 定义一个服务的方式是定义一个类继承自Service: 1 public class MyService extends Service { 2 3 @Override 4 5 public IBinder onBind(Intent intent) { 6 7 // TOD

Android学习笔记二十四.Service入门(二)绑定本地Service并与之通信

绑定本地Service并与之通信    通过上一篇博文的前3步,我们就算完成了一个Service及使用该Service的应用程序(Service为该应用程序的组成部分).但当程序通过startService()和stopService()启动.关闭Service时,Service与访问者之间基本上不存在太多的关联,因此Service和访问者之间也无法进行通信.数据交换.如果我们希望开发的Service能与访问者之间实现方法调用或数据交换,我们可以让访问者使用bindService()和unbin

Android Activity与远程Service的通信学习总结

当一个Service在androidManifest中被声明为 process=":remote", 或者是还有一个应用程序中的Service时,即为远程Service, 远程的意思是和当前程序不在同一个进程中执行. Activity和远程Service的跨进程通信(IPC)通过Binder机制,使用AIDL服务实现. 一.  定义远程服务端 1.新建一个project,project文件夹例如以下 2. 文件内容 aidl传递复杂对象时,须要该对象实现Parcelable或Seria

Android---42---绑定本地Service并与之通信

 绑定本地Service并与之通信: 应当使用bindService和unbindService方法启动.关闭Service. bindService (Intent service , ServiceConnection conn ,int flags); 解释参数: service:该参数通过Intent指定要启动的Service conn:该参数是一个ServiceConnection对象,该对象用于监听访问者与Service之间的链接情况. 当访问者与Service之间连接成功时将回

Android Service的绑定过程

通常我们使用Service都要和它通信,当想要与Service通信的时候,那么Service要处于绑定状态的.然后客户端可以拿到一个Binder与服务端进行通信,这个过程是很自然的. 那你真的了解过Service的绑定过程吗?为什么可以是Binder和Service通信? 同样的先看一张图大致了解一下,灰色背景框起来的是同一个类的方法,如下: 我们知道调用Context的bindService方法即可绑定一个Service,而ContextImpl是Context的实现类.那接下来就从源码的角度

【起航计划 034】2015 起航计划 Android APIDemo的魔鬼步伐 33 App-&gt;Service-&gt;Local Service Binding 绑定服务 ServiceConnection Binder

本例和下列Local Service Controller 的Activity代码都定义在LocalServiceActivities.Java 中,作为LocalServiceActivities 内部类实现的. 调用的Service为LocalService. LocalService既可以做为“Started” Service,也可以做为”Bound” Service. 一个“Bound” Service 可以通过Client/Service模式提供Service.它运行应用程序组件(比如

Android深入四大组件(三)Service的绑定过程

相关文章 Android深入理解四大组件系列 前言 我们可以通过调用Context的startService来启动Service,也可以通过Context的bindService来绑定Service,建议阅读此篇文章前请阅读Android深入四大组件(二)Service的启动过程这篇文章,知识点重叠的部分,本篇文章将不再赘述. 1.ContextImpl到ActivityManageService的调用过程 我们可以用bindService方法来绑定Service,它的实现在ContextWra

在Activity中判断Service是否已经运行

正在研究Android,写了一个Demo,需要在一个Activity中启动service,感觉应该在启动前判断一下是否服务已经跑起来了,百度到如下代码,留待备份. <pre name="code" class="java">//本方法判断自己些的一个Service-->com.android.controlAddFunctions.PhoneService是否已经运行 public static boolean isWorked() { Activ

【Service Fabric】小白入门记录 本地Service Fabric集群安装及设置

本篇内容是自学自记,现在我还不知道Service Fabric究竟是怎么个入门法,反正按照入门教程先进行本地Service Fabric集群的安装,万里路始于足下,要学习总得先把环境装好了才能开始学习是不? 首先是先决条件,具体可见 https://docs.microsoft.com/zh-cn/azure/service-fabric/service-fabric-quickstart-dotnet#prerequisites,按照条件将所有必需的SDK安装完毕后,我们可以在windows菜