android service和activity的通讯

我们须要用下面方式来启动service:

</pre><pre name="code" class="java"><span style="white-space:pre">		</span>Intent intent = new Intent();
		intent.setClass(MainActivity.this, MyService.class);
		<strong>bindService(intent,conn,BIND_AUTO_CREATE);</strong>
	ServiceConnection conn = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName name) {
		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			mService = ((MyService.MyBinder)service).getService();
		}
	};
	

这时service会运行:onCreate和onBind

然后

我们去运行一些任务:

	ImageView item_image = (ImageView)findViewById(R.id.item_image);
		item_image.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				<strong>mService.setHandler(mHandler);
			   mService.startCheckIfUpgrade();</strong>
			}
		});

	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case GET_UPGRADE_INFORMATION_COMPLETE:
				System.out.println("=======notify need upgrade");
				AlertDialog dialog = getCustomDialog();
				dialog.show();
			default:
				break;
			}
		}
	};

Service的代码是:

public class MyService extends Service {

	/** thread to execute background task*/
	private Thread mThread = null;

	/** flag indicates if the service has been stopped*/
	private boolean mStopFlag = false;

	private static final int GET_UPGRADE_INFORMATION_COMPLETE = 202;

	/** Handler to get notify from thread*/
	private Handler mHandler = null;

	public void setHandler(Handler handler) {
		this.mHandler = handler;
	}

	@Override
	public boolean onUnbind(Intent intent) {
		System.out.println("====service onUnbind");
		return super.onUnbind(intent);
	}

	public class MyBinder extends Binder {
		/**
		 * 获取当前Service的实例
		 *
		 * @return
		 */
		public MyService getService() {
			return MyService.this;
		}
	}

	public void startCheckIfUpgrade() {
		if(mThread == null){
			mThread = new UpgradeThread();
			mThread.start();
		}
	}

	@Override
	public IBinder onBind(Intent arg0) {
		System.out.println("====service onBind");

		return new MyBinder();
	}

	/**
	 * @see android.app.Service#onCreate()
	 */
	@Override
	public void onCreate() {
		super.onCreate();
		System.out.println("====service onCreate");
	}

	private class UpgradeThread extends Thread{

		/**
		 * @see java.lang.Thread#run()
		 */
		@Override
		public void run() {
			super.run();
			//在这里写去服务端查看是否须要升级的逻辑
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			boolean ret = true;
			if(ret && !mStopFlag){
				Message msg = new Message();
				msg.what = GET_UPGRADE_INFORMATION_COMPLETE;
				mHandler.sendMessage(msg);
			}
		}

	}

	/* (non-Javadoc)
	 * @see android.app.Service#onDestroy()
	 */
	@Override
	public void onDestroy() {
		System.out.println("====ondestroy");
		mStopFlag = true;
		try {
			if (null != mThread && mThread.isAlive()) {
				try
				{
					mThread.stop();
				}
				catch (Exception e)
				{
				}
			}
			mThread = null;
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		super.onDestroy();
		System.gc();
	}

}

当activity销毁后Service会运行:

onUnbind和onDestroy

这个说明这个service的生命周期和activity是一致的

时间: 2024-10-24 08:35:33

android service和activity的通讯的相关文章

Android Service与Activity之间通信的几种方式

在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activity中启动后台Service,通过Intent来启动,Intent中我们可以传递数据给Service,而当我们Service执行某些操作之后想要更新UI线程,我们应该怎么做呢?接下来我就介绍两种方式来实现Service与Activity之间的通信问题 通过Binder对象 当Activity通过调

Android—Service与Activity的交互

service-Android的四大组件之一.人称"后台服务"指其本身的运行并不依赖于用户可视的UI界面 实际开发中我们经常需要service和activity之间可以相互传递数据维持程序的运行. 先了解Service的生命周期吧. 新建一个类继Service: package com.example.myservicedemo.service; import android.app.Service; import android.content.Intent; import andr

Android Service与Activity之间通信

主要分为: 通过Binder对象 通过broadcast(广播)的形式 Activity调用bindService (Intent service, ServiceConnection conn, int flags)方法,得到Service对象的一个引用,这样Activity可以直接调用到Service中的方法,如果要主动通知Activity,我们可以利用回调方法: 在Service中新建获取Binder实例: /** * 返回一个Binder对象 */ @Override public IB

Android Service与Activity的交互

Android中有时候需要在Service中改变Activity的UI,或者在Activity中修改Service中的数值.首先必须使用与Activity绑定的Service,有三种方式可以实现.第一,是使用接口回调的方式在Activty中实现Service中的接口:第二,使用广播的方式传递:第三,则是用观察者模式,在Activity中实现update方法. 使用接口回调的方式在Activty中实现Service中的接口 package com.kkrs.serivce; import andr

Android 四大组件------Activity

一.定义软件打开的主activity 当用户点开软件时,系统会默认调用app中声明为"launch"(或者"main")的activity中的onCreate()方法.我们一般在AndroidManifest.xml中定义主activity. <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-fil

Service 启动Activity

我想我们一般在Service里想启动Activity一定会这样写: Java代码   Intent intentv = new Intent(Intent.ACTION_VIEW); intentv.setData(uri); intentv.putExtra("keepTitle", true); startActivity(intentv); 这样写就会报错的: 03-11 02:37:09.737: ERROR/AndroidRuntime(7881): android.util

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

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

Android development Notes-3(Activity, Intents, and Tasks, Service, Content provider)

Summary:Activity, Intents, and Tasks, Service, Content provider -Android introduces a richer and more complex approach by supporting multiple application entry points. Android programs should expect the system to start them in different places, depen

关于android编程中service和activity的区别

一. 绝大部分情况下,Service的作用是用来"执行"后台的.耗时的.重要的任务,三者缺一不可,而最重要的原因是第三点:要执行重要的任务. 因为当一个进程启动了Service后,进程的优先级变高了,系统除非在非常极端的情况下,不会杀掉该进程,反观Activity,不具备这样的特性. 如果没有满足上面所说的三点,请谨慎使用Service,千万别把使用Service的理由变成:这样可以常驻后台.从资源使用的角度来看,这是非常不可取的. 二. 1.Activity和Service的生命周期