博客出自: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讲解源码 

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

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

    keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主 ...

  2. android 中的 Handler 线程间通信

    一. 在MainActivity中为什么只是类似的写一行如下代码就可以使用handler了呢? Handler handler = new Handler() { @Override public v ...

  3. android线程间通讯

    近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子. andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图 ...

  4. C# 前台线程与后台线程的区别和联系

    c#前台线程与后台线程的区别和联系http://www.189works.com/article-13702-1.html 如何取消后台线程的执行http://www.cnblogs.com/shan ...

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

    using System; using System.Drawing; using System.Windows.Forms; using System.Threading; namespace Wi ...

  6. C#.Net前台线程与后台线程的区别

    本文来自:http://www.cnblogs.com/zfanlong1314/archive/2012/02/26/2390455.html .Net的公用语言运行时(Common Languag ...

  7. 源码分析Android Handler是如何实现线程间通信的

    源码分析Android Handler是如何实现线程间通信的 Handler作为Android消息通信的基础,它的使用是每一个开发者都必须掌握的.开发者从一开始就被告知必须在主线程中进行UI操作.但H ...

  8. Android线程间通信机制——深入理解 Looper、Handler、Message

    在Android中,经常使用Handler来实现线程间通信,必然要理解Looper , Handler , Message和MessageQueue的使用和原理,下面说一下Looper , Handl ...

  9. android 线程间的通信

    (转自:http://www.cnblogs.com/allin/archive/2010/05/19/1738800.html) andriod提供了 Handler 和 Looper 来满足线程间 ...

随机推荐

  1. ikbc 时光机 F87 Ctrl 失灵 解决办法

    多按几次Fn+PrtSc,直至按键无错位.

  2. 前端学习之路——gulp篇

    一.构建gulp环境 1.下载nodejs gulp基于node.js,要通过nodejs的npm安装gulp,所以要先安装node.js环境.(英文官网/中文官网链接). 通过cmd命令窗口确定安装 ...

  3. RocketMQ学习笔记(7)----RocketMQ的整体架构

    1. RocketMQ主要的9个模块,如图: 2. 模块介绍 1. rocketmq-common:通用的常量枚举,基类方法或者数据结构,按描述的目标来分包,通俗易懂.报名有admin,consume ...

  4. c++string类的简单介绍

    #include "iostream" #include "string" using namespace std; /*@author:浅滩 *family: ...

  5. 在vue中使用的Echarts的步骤

    1.首先在项目中安装Echarts npm install echarts -g --save //安装 2.在项目中引入Echarts(在main.js中引入) import echarts fro ...

  6. POJ-1113 Wall 计算几何 求凸包

    题目链接:https://cn.vjudge.net/problem/POJ-1113 题意 给一些点,求一个能够包围所有点且每个点到边界的距离不下于L的周长最小图形的周长 思路 求得凸包的周长,再加 ...

  7. 入门python:《Python编程快速上手让繁琐工作自动化》中英文PDF+代码

    入门推荐学习<python编程快速上手>前6章是python的基础知识,通俗易懂地讲解基础,初学者容易犯错的地方,都会指出来.从第三章开始,每章都有一个实践项目,用来巩固前面所学的知识. ...

  8. UVALive 3989 Ladies' Choice

    Ladies' Choice Time Limit: 6000ms Memory Limit: 131072KB This problem will be judged on UVALive. Ori ...

  9. [MST] Remove Model Instances from the Tree

    In this lesson we will dive a bit more into the tree semantics of MST. In this lesson you will learn ...

  10. Step by Step Do IOS Swift CoreData Simple Demo

    简单介绍 这篇文章记录了在 IOS 中使用 Swift 操作 CoreData 的一些基础性内容,因为缺乏文档,基本上都是自行实验的结果.错漏不可避免,还请谅解. 部分内容借鉴了 Tim Roadle ...