博客出自: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. 基于localStorage的登录注册

    以下代码,如果有地方有错,请直接指出,我会改进的(只改错误,不改逻辑,因为我自己是不会这样写代码的,这个只适合初学者): <!DOCTYPE html> <html> < ...

  2. hadoop 编译自己的jar包并运行

    我修从网上找了份java代码 我为了让它在hadoop下跑起来居然花了两个多小时... 首先最好不要在java代码中设置package...使用default package即可... 然后在java ...

  3. HDU 1285 确定比赛名次【拓扑排序】

    题意:中文的题目-----这道题让我终于明白了那个break的作用---因为题目中有这一句“符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前”@_@ #include<iostrea ...

  4. Linux grep 筛选语句

    1. 同时满足多个条件 cat logs.log |grep 123|grep 'abc'|more      --查询logs.log中同时满足123和abc的句子 2. 满足任意一个条件 cat ...

  5. JDOM,dom4j方式解析XML

    <?xml version="1.0" encoding="UTF-8"?> <dataSources> <!-- 定义MySQL ...

  6. redis中的事务、lua脚本和管道的使用场景

    参考文章 : https://blog.csdn.net/fangjian1204/article/details/50585080

  7. 链表<新>

    class Node: ''' 节点类 链表节点结构 data next data: 节点保存的数据 _next: 保存下一个节点对象 ''' def __init__(self, data, pne ...

  8. 2019年北航OO第三单元(JML规格任务)总结

    一.JML简介 1.1 JML与契约式设计 说起JML,就不得不提到契约式设计(Design by Contract).这种设计模式的始祖是1986年的Eiffel语言.它是一种限定了软件中每个元素所 ...

  9. SPOJ 962 Intergalactic Map

    Intergalactic Map Time Limit: 6000ms Memory Limit: 262144KB This problem will be judged on SPOJ. Ori ...

  10. Qt之自定义布局管理器(QCardLayout)

    简述 手动布局另一种方法是通过继承QLayout类编写自己的布局管理器. 下面我们详细来举一个例子-QCardLayout.它由同名的Java布局管理器启发而来.也被称之为卡片布局,每个项目偏移QLa ...