Android后台进程与前台线程间的区别使用

博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved !

很早就翻译过Android API的一篇文章Android高级开发第四讲--API之Service,今天主要讲些实战的东西

比如Service的启动方式有两种,首先在AndroidManifest.xml中配置Service,然后通过bindService和startService来启动,

不同点在于:

执行方式:前者启动时执行onCreate-->onBind方法而且只执行一次;后者执行onCreate-->onStartCommand方法,onStartCommand方法却可以执行多次

通信方式:前者只能通过onBind传递一次值,然后拿到一个Bind类的引用来全传值

ForeService

	public int last(int index) {
		if (index == 0) {
			index = 4;
		} else {
			index -= 1;
		}
		sImageId = index % 5;
		return sImageId;
	}

	public class MyBinder extends Binder {
		public ForeService getService() {
			return ForeService.this;
		}
	}

调用类

		foreService = new Intent(this, ForeService.class);
		// 创建连接
		foreConn = new ServiceConnection() {

			@Override
			public void onServiceDisconnected(ComponentName name) {
				// TODO Auto-generated method stub
			}

			@Override
			public void onServiceConnected(ComponentName name, IBinder service) {
				// TODO Auto-generated method stub
				myBinder = (MyBinder) service;
				transPortFore();
			}
		};

后者可以每次都可以通过onStartCommand方法里的intent对象传值,也可以通过上述方法传值。

以上是启动方式。当然不可能就讲这么一点知识,接下来的东西比较重要。

由于Android是根据进程来分配内存的,而我们的App运行在一块虚拟机上,也就是一个主进程;那么如果执行逻辑比较复杂,即使再多的线程(而且有限制),方法来了,给主进程开一个子进程,用什么来开呢?对,就是Service!因为今天只讲它。

首先在AndroidManifest.xml(如果一直读我博客,请记得以后它称为主配置文件),先看它,注册Service

		<service android:name="com.liuxian13183.service.BkService" android:process=".core" />
		<service android:name="com.liuxian13183.service.ForeService" />

我们可以看到命名为BkService的类,比下面ForeService多一个参数android:process,对就是这个参数,如果你不设就默认跟主进程同一个进程,如果设了不论点.还是冒号:,都代表新启动一个进程,而子进程跟主进程之间只能通过AIDL来通信。

其次,定义一个AIDL文件,返回值可以使用基础数据类型+List和Map,主要用来传值沟通

例:

package com.liuxian13183.service;
interface INext{
 int next(int index);
}

最后定义Service,在前端调用

Service定义:

public class BkService extends Service {
	private int sImageId = 0;

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		sImageId = intent.getIntExtra("key", 0);
		return new Next();
	}

	public class Next extends INext.Stub {
		@Override
		public int next(int index) throws RemoteException {
			// TODO Auto-generated method stub
			index += 1;
			sImageId = index % 5;
			return sImageId;
		}

	}
}

前端调用

		backService = new Intent(this, BkService.class);
		backConn = new ServiceConnection() {

			@Override
			public void onServiceDisconnected(ComponentName name) {
				// TODO Auto-generated method stub
				Log.i("com.liuxian13183.service", "");
			}

			@Override
			public void onServiceConnected(ComponentName name, IBinder service) {
				// TODO Auto-generated method stub
				iNext = INext.Stub.asInterface(service);
				transPortBack();
			}
		};

		if (iNext != null) {
					transPortBack();
				} else {// getConnection
					backService.putExtra("key", sImageId);
					startService(backService);
					bindService(backService, backConn, BIND_AUTO_CREATE);// 回调
				}

	private void transPortBack() {
		try {
			sImageId = iNext.next(sImageId);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		showAlbum();
	}

	private void showAlbum() {
		InputStream rawImageStream = getResources().openRawResource(sImageArray[sImageId]);
		byte[] data = WebpUtils.streamToBytes(rawImageStream);
		final Bitmap webpBitmap = WebpUtils.webpToBitmap(data);
		imageView.setImageBitmap(webpBitmap);
	}

效果如下:

这你最想要的源码!Android Service和webp讲解源码 

时间: 2024-10-14 21:19:36

Android后台进程与前台线程间的区别使用的相关文章

Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主要研究Handler的消息发送. 包含主线程往子线程发送消息,子线程之间互相发送消息. 一.主线程向子线程发送消息. 实现过程比較简单: 主线程发送消息到异步线程.异步线程接收到消息后在再发送一条消息给主线程. 1. 初始化主线程的Handler,用来接收子线程的消息. 2. 启动异步线程.在异步线

android 中的 Handler 线程间通信

一. 在MainActivity中为什么只是类似的写一行如下代码就可以使用handler了呢? Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // handle the nsg message... } }; private void sendMessage() { handler.sendEmptyMessage(11); } 打开handler的源码可以在它的构造函数中

【Android 并发编程】线程间通信的三种基本方式

1. 使用管道流Pipes "管道"是java.io包的一部分.它是Java的特性,而不是Android特有的.一条"管道"为两个线程建立一个单向的通道.生产者负责写数据,消费者负责读取数据. 下面是一个使用管道流进行通信的例子. public class PipeExampleActivity extends Activity { private static final String TAG = "PipeExampleActivity";

Android 线程间通信

进程与线程的区别? 在Android中,线程是跑在进程之中的,当手机打开一个APP就相当于打开了一个进程,比如:UI界面的更新,就是在主线程中完成的,我也可以自定义一些子线程来完成所需要的任务. 如何创建线程?创建线程的几种方式? 1.创建一个类继承Thread类 2.创建一个类实现Runnable接口 什么是多线程? 线程是程序中一个单一的顺序控制流程,在程序中同是运行多个线程完成不同的工作,称为多线程 ANR的基础知识及产生? ANR:application not responding :

android线程间通讯

近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子. andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的. 在Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个事android的新 概念.我们的主线程(UI线程)就是一个消息循环的线程.针对这种消息循

C#前台线程与后台线程的区别和联系 (转)

.Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程.这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出:而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束. .net环境使用Thread建立的线程默认情况下是前台线程,即线程属性IsBackground=false,在进程中,只要有一个前台线程未退出,进程就不会终止.主线程就是一个前台线程.而后台线程不管

Android中线程间通信原理分析:Looper,MessageQueue,Handler

自问自答的两个问题 在我们去讨论Handler,Looper,MessageQueue的关系之前,我们需要先问两个问题: 1.这一套东西搞出来是为了解决什么问题呢? 2.如果让我们来解决这个问题该怎么做? 以上者两个问题,是我最近总结出来的,在我们学习了解一个新的技术之前,最好是先能回答这两个问题,这样你才能对你正在学习的东西有更深刻的认识. 第一个问题:google的程序员们搞出这一套东西是为了解决什么问题的?这个问题很显而易见,为了解决线程间通信的问题.我们都知道,Android的UI/Vi

Android线程间通信机制

当android应用程序运行时,一个主线程被创建(也称作UI线程),此线程主要负责处理UI相关的事件,由于Android采用UI单线程模型,所以只能在主线程中对UI元素进行操作,如果在非UI线程直接对UI进行了操作,则会报错,另外,对于运算量较大的操作和IO操作,我们需要新开线程来处理这些工作,以免阻塞UI线程,子线程与主线程之间是怎样进行通信的呢?此时就要采用消息循环机制(Looper)与Handler进行处理. 一.基本概念 Looper:每一个线程都可以产生一个Looper,用来管理线程的

C# 前台线程与后台线程区别

using System; using System.Drawing; using System.Windows.Forms; using System.Threading; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, Event