android activity和service的交互介绍

android开发中,作为4大组件的service在开发中经常会使用到。很多时候,我们的activity和service之间需要进行相应的交互,activity需要调用service里面的方法实现某些功能,service需要调用activity的方法,实现界面更新等的交互。

实现2者之间相互交互的主要方式是:service中有个类部类继承Binder,然后提供一个公有方法,返回当前service的实例。 activity通过bindService来开启一个service,service通过onBind方法,返回一个IBinder实例(我们创建的那个类部类实例),activity中通过onServiceConnected方法,获取IBinder实例,然后再通过IBinder实例来获取service实例,这样,我们得到了service的实例,那么我们的activity就可以随心所欲的使用它里面的各种方法来操作它了。

上面activity可以操作service了,我们还需要service能操作activity。

我觉得可以有3中方式:

1.直接把activity传给service,service通过activity实例随便操作activity

2.使用接口回调方式,activity实现相应的接口,service通过接口进行回调,比较灵活

3.使用广播

使用广播是比较常见的方式,我们就不具体讲解了,下面我们介绍前面2中方法,具体看代码,用service更新seekbar。

我们的activity代码:

package com.hck.bindservice;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.SeekBar;
import android.widget.Toast;

import com.hck.bindservice.MyService.MyBuild;

public class MainActivity extends Activity {
   private MyService myService;  //我们自己的service
   private SeekBar pBar;  //模拟service更新进度条
   private ConnectionService connectionService;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		pBar = (SeekBar) findViewById(R.id.seekbar);
		connectionService=new ConnectionService();
	}

	public void startService(View view) { //绑定service
       bindService(new Intent(this,MyService.class), connectionService, 1);
	}
	/**
	 *
	 * @author Administrator
	 *实现service接口,用于service绑定时候,回调
	 */
	class ConnectionService  implements ServiceConnection
	{
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			myService=((MyBuild)service).getMyService(); //获取Myservice对象

			/**
			 * 直接把当前对象传给service,这样service就可以随心所欲的调用本activity的各种可用方法
			 */
			myService.setMainActivity(MainActivity.this); //把当前对象传递给myservice

			/**
			 * 使用一个接口来实现回调,这样比上面方法更加灵活,推荐
			 */
//			myService.setOnProgressBarListener(new UpdateProgressListener() {
//
//				@Override
//				public void updateBar(int size) {
//					updateBar(size);
//				}
//			});

		}

		@Override
		public void onServiceDisconnected(ComponentName name) {

		}
	}
	/**
	 *
	 * @param size
	 * 更新seekbar
	 */
	public void updateBar(int size)
	{
		pBar.setProgress(size);
	}

	/**
	 *
	 * @param view
	 * 开始更新seekbar
	 */
	public void startBar(View view) {
	      if (myService==null) {
			Toast.makeText(this, "请先开始service", Toast.LENGTH_LONG).show();
		 }
	      else {
			myService.startUpdateProgress();
		}
		}
/**
 *
 * @param view
 * 停止更新seekbar
 */
		public void stopBar(View view) {

			 if (myService==null) {
					Toast.makeText(this, "更新没有开始", Toast.LENGTH_LONG).show();
				 }
			      else {
					myService.stopUpdateProgress();
				}
		}
/**
 *
 * @param view
 * 停止service
 */
		public void stopService(View view) {
			myService=null;
				unbindService(connectionService);

		}
		@Override
			protected void onDestroy() {
				super.onDestroy();
				try {
					unbindService(connectionService);
				} catch (Exception e) {
				}

			}

}

重要代码是onServiceConnected回调方法里面

myService=((MyBuild)service).getMyService(); //获取Myservice对象

获取service对象后,我们想怎么操作它都行了,比如上面的,把activity实例直接通过它的方法传递过去,便于

service调用activity的各种方法。或者,设置传递一个回调接口对象过去,用户回调

service代码:

package com.hck.bindservice;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service{
   private int size=0;
   private UpdateProgress updateProgress;
   private final long TIME=2000;
   private boolean isUpdate=true;
   private MainActivity activity;
   private UpdateProgressListener listener;
	@Override
	public IBinder onBind(Intent intent) {

		return new MyBuild();
	}
	@Override
	public void onCreate() {
		super.onCreate();
		updateProgress=new UpdateProgress();
	}
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		return super.onStartCommand(intent, flags, startId);
	}
	/**
	 *
	 * @author Administrator
	 * 线程用来改变seekbar进度的大小
	 *
	 */
	class UpdateProgress implements Runnable
	{
		@Override
		public void run() {
			if (isUpdate) {
				  size+=10;
		           if (size>100) {
					size=0;
				}
		           handler.sendEmptyMessage(0);
			}
		}
	}
	/**
	 * 调用更新相应方法,更新进度条
	 */
	Handler handler=new Handler()
	{
		public void handleMessage(android.os.Message msg) {
			/**
			 * 直接调用activity对象里面的方法
			 */
			if (activity!=null) {
				activity.updateBar(size);
			}

			/**
			 * 使用接口回调
			 */
//			if (listener!=null) {
//				listener.updateBar(size);
//			}
			handler.postDelayed(updateProgress, TIME);
		};
	};

	/**
	 * 停止更新
	 */
	public void stopUpdateProgress()
	{
		isUpdate=false;
	}
	/**
	 * 开启更新
	 */
	public void startUpdateProgress()
	{

		if (!isUpdate) {
			handler.post(updateProgress);
		}
		isUpdate=true;
	}
	public void onDestroy() {
		isUpdate=false;
	};

	/**
	 *
	 * @param activity
	 * 初始化MainActivity对象
	 */
	public void setMainActivity(MainActivity activity)
	{
		this.activity=activity;
	}
	/**
	 *
	 * @param listener
	 * 初始化UpdateProgressListener对象
	 */
	public void setOnProgressBarListener(UpdateProgressListener listener)
	{
		this.listener=listener;
	}

	/**
	 *
	 * @author Administrator
	 * 使用类部类,返回当前service的实例,用于activity,调用service的各种方法
	 *
	 */
	class MyBuild extends Binder
	{
		public MyService getMyService()
		{
			return MyService.this;
		}
	}

}

service里面最重要的就是,最下面我们的MyBuild类部类了,通过它的getMyService方法,获取service的实例

该类的实例实在onBind时候,我们返回给activity的。

接口:

package com.hck.bindservice;

public interface UpdateProgressListener {
 public void updateBar(int size);
}

一个简单接口,用于service回调activity

上面是使用 bindService来启动service的,那么如果我们使用startService启动service时候,上面的办法就不行了。

因为onBind不会执行,我们获取不到IBinder实例。这个时候,我们可以使用设计模式的观察者模式来处理。

其它不清楚,还有什么比较好的办法没有,我是没有想到,有知道的朋友,请告知,谢谢

例子源码:http://download.csdn.net/detail/hhhccckkk/8469069

请把 private boolean isUpdate=true;    改为 private boolean isUpdate=false;








时间: 2024-09-29 17:05:59

android activity和service的交互介绍的相关文章

Android情景案例——Activity与Service通讯交互

前两天去面试,遇到这个知识点,感觉组织的不是很清晰,所以事后梳理下逻辑. 一.案例情景 在service中开启一个下载任务,然后在activity中显示下载进度,如何实现? 分析: 这里考察的就是Service如何与Activity进行交互,我们知道开启一个Service服务有两种方法,startService().bindService().第一种方法我们直接开启Service进行使用,没有与它进行交互处理.所以我们只有通过bindService()方法然后借助Binder进行数据交互. 方案

Android activity和service的生命周期对比

1Activity生命周期 七个方法 1. void onCreate(Bundle savedInstanceState) 当Activity被第首次加载时执行.我们新启动一个程序的时候其主窗体的onCreate事件就会被执行.如果Activity被销毁后(onDestroy后),再重新加载进Task时,其onCreate事件也会被重新执行. 2. void onStart()   activity变为在屏幕上对用户可见时调用. 3. void onResume()   activity开始与

Activity与Service数据交互:Binder、bindService的用法

1 package com.lixu.jiaohu; 2 3 import com.lixu.jiaohu.MyAppService.Mybind; 4 5 import android.app.Activity; 6 import android.app.Service; 7 import android.content.ComponentName; 8 import android.content.Intent; 9 import android.content.ServiceConnect

Android——Activity以及Service的启动方式

1. Activity共有四种启动方式(android:launchMode) (1) standard:默认方式,不用再次配置 standart模式就是一个栈的模式,默认每次跳转到一个新的Activity都会新建一个实例,不管这个实例是否存在.每次跳转就新建,压栈,每次返回就pop弹栈. (2) singleTop:为<activity>指定属性android:launchMode="singleTop",栈顶重复使用模式. 每次判断栈顶有没有,没有,创建:有,继续使用.

Android activity与service中的子线程 (入门级)

1.首先 android 一个程序中 的activity 都是一个线程,service和activity也是一个线程 2.在activity 中启动一个子线程,当前activity finish destroy掉 子线也会运行的. 3.在service里的线程 与activity很类似  service即使停止了 线程也在运行(要先停止服务 再把最近使用的进程杀掉 线程会停止 ,如果直接杀掉进程 android会再次自动启动这个service的 此时即使再停止service服务 线程也会一直运行

android Activity绑定Service

activity可以绑定Service,并且可以调用Service中定义的方法 Service代码:在里面多了一个IBinder;个人理解是用来与Activity绑定的主要通道: public class MainServer extends Service { private final String TAG = "Service------->"; private final IBinder binder = new MyBinder(); //绑定器 public clas

Android基础笔记(十一)- Service基础和注意事项以及Activity与Service的通信

Service的基本概念 为什么要有Service Service的基本用法 电话窃听器的小案例 Service和Activity通信 Service和Thread的关系 向光明而行! Service的基本概念 Service是Android的四大组件之一,在每一个应用程序中都扮演者非常重要的角色. 它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务.必要的时候,我们甚至可以在程序退出的情况下,让Service在后台继续保持运行状态. 既然都是被用于处理耗时的操作,那么我们什么

Android四大组件应用系列——Activity与Service交互实现APK下载

Servic与Activity相比它没有界面,主要是在后台执行一些任务,Service有两种启动方法startService()和bindService(),startService方式Service不可交互,可一直在后台即便应用结束,bindService方式可通过ServiceConnection获得运行的Service实例的方式实现Activity和Service之间的交互,通常Activity退出则绑定的服务也就取消了.我们可以通过同时执行启动服务和绑定服务的方式实现Service交互同

Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)

转载于:http://blog.csdn.net/byxdaz/article/details/9708491 http://blog.csdn.net/q876266464/article/details/19641251 Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,Broadcast Receiver广播接收器. 一.了解四大基本组件 Activity : 应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以