android service 学习(下)
android service 学习(下)
通常每个应用程序都在它自己的进程内运行,但有时需要在进程间传递对象,你可以通过应用程序UI的方式写个运行在一个不同的进程中的service。在android平台中,一个进程通常不能访问其他进程中的内存区域。所以,他们需要把对象拆分成操作系统能理解的简单形式,以便伪装成对象跨越边界访问。编写这种伪装代码相当的枯燥乏味,好在android为我们提供了AIDL工具可以来做这件事。
AIDL(android接口描述语言)是一个IDL语言,它可以生成一段代码,可以使在一个android设备上运行的两个进程使用内部通信进程进行交互。如果你需要在一个进程中(例如:在一个Activity中)访问另一个进程中(例如:一个Service)某个对象的方法,你就可以使用AIDL来生成这样的代码来伪装传递各种参数。
要使用AIDL,Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了,参见下例:
先创建一个IMyRemoteService.aidl文件
package org.allin.android.remote;
interface IMusicControlService{
void play();
void stop();
void pause();
}
如果你正在使用eclipse的Android插件,则它会根据这个aidl文件生成一个Java接口类。生成的接口类中会有一个内部类Stub类,你要做的事就是去继承该Stub类:
/**
* @author allin.dev
* http://allin.cnblogs.com/
*
*/
public class RemoteMusicService extends Service {
private static final String TAG = "RemoteMusicService";
private MediaPlayer mediaPlayer;
/*
* (non-Javadoc)
*
* @see android.app.Service#onBind(android.content.Intent)
*/
@Override
public IBinder onBind(Intent intent) {
return binder;
}
private final IMusicControlService.Stub binder = new IMusicControlService.Stub() {
@Override
public void stop() throws RemoteException {
Log.d(TAG,"stop....");
if (mediaPlayer != null) {
mediaPlayer.stop();
try {
// 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数
mediaPlayer.prepare();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
@Override
public void play() throws RemoteException {
Log.d(TAG,"play....");
if (mediaPlayer == null) {
mediaPlayer = MediaPlayer.create(RemoteMusicService.this,
R.raw.tmp);
mediaPlayer.setLooping(false);
}
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
}
}
@Override
public void pause() throws RemoteException {
Log.d(TAG,"pause....");
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}
};
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
if(mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.release();
}
}
}
当客户端应用连接到这个Service时,onServiceConnected方法将被调用,客户端就可以获得IBinder对象。参看下面的客户端onServiceConnected方法:
private ServiceConnection sc = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
musicService = null;
Log.d(TAG, "in onServiceDisconnected");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
musicService = IMusicControlService.Stub.asInterface(service);
Log.d(TAG, "in onServiceConnected");
}
};
启动后的界面如下
[源码下载]
- ASM 翻译系列第三十九弹:物理元数据AT表
- ASM 翻译系列第四十弹:理解ASM中 REQUIRED_MIRROR_FREE_MB和USABLE_FILE_MB的含义
- 给XFN链接关系加上“nofollow”选项
- LVS中采用Jboss作为RealServer的配置要点
- 基于Prometheus的数据库监控
- Uva-------(11462) Age Sort(计数排序)
- hdu----(2848)Repository(trie树变形)
- 【MySQL】主从GTID复制修复
- hdu---(1800)Flying to the Mars(trie树)
- 解决Tomcat数据连接池无法释放
- hdu----(1075)What Are You Talking About(trie之查找)
- hdu--(1247)Hat’s Words(trie树)
- HDU----(4519)郑厂长系列故事——体检
- 张戈博客成功启用移动端主题:Mobile Pack
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- R语言在不同样本量下的Littles MCAR检验
- PHP10段常用功能代码
- MySQL中group_concat()函数用法总结
- [::-1] 数组中元素反向
- MySQL面试题
- numpy~运算符和Boolean类型变量
- PHP安全基础第一章
- 21 个非常有用的 .htaccess 提示和技巧
- PHP实现图片马赛克效果
- PHP中的类
- PHP获取表单textarea数据中的换行问题
- Numpy根据Bool值挑选数组中元素
- MySQL获取每个分类下面的前三条数据
- windows宿主机如何SSH连接VMware的Linux虚拟机
- np.random.rand均匀分布随机数和np.random.randn正态分布随机数函数使用方法