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讲解源码
Android后台进程与前台线程间的区别使用的更多相关文章
- Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)
keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主 ...
- android 中的 Handler 线程间通信
一. 在MainActivity中为什么只是类似的写一行如下代码就可以使用handler了呢? Handler handler = new Handler() { @Override public v ...
- android线程间通讯
近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子. andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图 ...
- C# 前台线程与后台线程的区别和联系
c#前台线程与后台线程的区别和联系http://www.189works.com/article-13702-1.html 如何取消后台线程的执行http://www.cnblogs.com/shan ...
- C# 前台线程与后台线程区别
using System; using System.Drawing; using System.Windows.Forms; using System.Threading; namespace Wi ...
- C#.Net前台线程与后台线程的区别
本文来自:http://www.cnblogs.com/zfanlong1314/archive/2012/02/26/2390455.html .Net的公用语言运行时(Common Languag ...
- 源码分析Android Handler是如何实现线程间通信的
源码分析Android Handler是如何实现线程间通信的 Handler作为Android消息通信的基础,它的使用是每一个开发者都必须掌握的.开发者从一开始就被告知必须在主线程中进行UI操作.但H ...
- Android线程间通信机制——深入理解 Looper、Handler、Message
在Android中,经常使用Handler来实现线程间通信,必然要理解Looper , Handler , Message和MessageQueue的使用和原理,下面说一下Looper , Handl ...
- android 线程间的通信
(转自:http://www.cnblogs.com/allin/archive/2010/05/19/1738800.html) andriod提供了 Handler 和 Looper 来满足线程间 ...
随机推荐
- SQL语句调优相关方法
SQL语句慢的原因:1,数据库表的统计信息不完整2,like查询估计不准确调优方法:1,查看表中数据的条数:2, explain analyze target_SQL;查看SQL执行计划:比较SQL总 ...
- 「JavaSE 重新出发」02. 数据类型与运算符
「TOC」 Java 程序基本要求 Java 数据类型 基本数据类型 复合数据类型 运算符 逻辑运算符 位运算符 运算符优先级 Java 程序基本要求 public class : 一个 Java 文 ...
- pthread_join/pthread_exit的用法解析
官方说法: 函数pthread_join用来等待一个线程的结束.函数原型为: extern int pthread_join __P ((pthread_t __th, void **__thread ...
- 线程状态与tcb、线程的生命周期
struct tcb { u32_t status; struct reg_context thread_context; void *stack; struct thread_info thread ...
- NOIp模拟赛二十八
(这是NOIp模拟赛?应该是NOI模拟赛不小心加了个p) 嗯,假装这是正经的NOIp模拟赛,从今天开始也写写题解吧(这几天被虐的惨惨) 今日情况:8+50+0=58 A题输出样例,B题正解写挂,C题不 ...
- 页面加载完成触发input[type="file"]控件问题
由于浏览器厂家的限制,不同的浏览器不开放页面加载完成就允许触发input[type="file"]控件 测试 Chrome .火狐 .IE .微信客户端QQ =>桌面端: C ...
- 推荐学习《组织与管理研究的实证方法(第2版)》中文PDF
在写文章论文时,会涉及到观点论证,需要掌握一些实证方法. 建议学习<组织与管理研究的实证方法(第2版)>,对管理研究中涉及的方法进行了介绍,例如实验室研究,二手数据的研究,实地研究等,这对 ...
- wackoPicko 渗透平台的安装
2016-05-17 wackoPicko 的介绍及下载地址 https://github.com/adamdoupe/WackoPicko#from=codefrom.com 首先我们 ...
- 紫书 习题 11-3 UVa 820 (最大流裸题)
注意这道题是双向边, 然后直接套模板就ok了. #include<cstdio> #include<algorithm> #include<vector> #inc ...
- Error creating bean with name 'testController': Injection of resource dependencies failed;
启动ssm项目报错: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 't ...