android中的服务与其他软件的服务可能有些不同,它用来实现在后台执行长期的任务,并且与前台界面解耦.现在来实现一个HelloWorld级的服务以及使用这个服务,创建一个服务的步骤如下:
1.编写aidl文件,在这个文件中提供了服务所提供的方法的接口,文件的扩展名为aidl,在我们的示例中命名为IDataTimeService.aidl文件的内容为如下所示:
Java代码
package com.services.demo2;
// Declare the interface.
interface IDataTimeService {
String getForecastPage();
}
package com.services.demo2;
// Declare the interface.
interface IDataTimeService {
String getForecastPage();
}
2.编写服务的实现类,在这个示例中为DataTimeService.java,内容如下:
Java代码
public class DataTimeService extends Service{
public static final String BROADCAST_ACTION = "com.services.demo2.DataTimeServiceEvent";
/**
使用上面定义的字符串常量创建一个Intent的实例,如果服务在运行的过程中发生的事件都可以通过Service的
sendBroadcast(broadcast)方法来发送一个广播消息通知Activity,然后有Activity注册的接收者进行处理;
*/
private Intent broadcast = new Intent(BROADCAST_ACTION);
sendBroadcast(broadcast);
private final IDataTimeService.Stub binder = new IDataTimeService.Stub() {
public String getForecastPage() {
return (getForecastPageImpl());
}
};
synchronized private String getForecastPageImpl() {
Date date=new Date();
return (date.toLocaleString());
}
@Override
public IBinder onBind(Intent intent) {
return (binder);
}
}
public class DataTimeService extends Service{
public static final String BROADCAST_ACTION = "com.services.demo2.DataTimeServiceEvent";
/**
使用上面定义的字符串常量创建一个Intent的实例,如果服务在运行的过程中发生的事件都可以通过Service的sendBroadcast(broadcast)方法来发送一个广播消息通知Activity,然后有Activity注册的接收者进行处理;
*/
private Intent broadcast = new Intent(BROADCAST_ACTION);
sendBroadcast(broadcast);
private final IDataTimeService.Stub binder = new IDataTimeService.Stub() {
public String getForecastPage() {
return (getForecastPageImpl());
}
};
synchronized private String getForecastPageImpl() {
Date date=new Date();
return (date.toLocaleString());
}
@Override
public IBinder onBind(Intent intent) {
return (binder);
}
}
3.现在编写一个Activity,来消费这个服务:
Java代码
public class ServicesDemo2 extends Activity {
private IDataTimeService service = null;
private Intent serviceIntent = null;
private WebView browser;
private ServiceConnection svcConn = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder binder) {
service = IDataTimeService.Stub.asInterface(binder);
browser.postDelayed(new Runnable() {
public void run() {
updateForecast();
}
}, 1000);
}
public void onServiceDisconnected(ComponentName className) {
service = null;
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
browser = (WebView) findViewById(R.id.webkit);
serviceIntent = new Intent(this, DataTimeServiceImpl.class);
//绑定一个服务
bindService(serviceIntent, svcConn, BIND_AUTO_CREATE);
}
@Override
public void onResume() {
super.onResume();
/**
注册广播消息的接收者,在android中服务与Activity的通信依靠广播发送消息,然后由Activity注册的接收者
接收到消息,进行相应的处理这里使用DataTimeServiceImpl.BROADCAST_ACTION来过滤,表明它只接收
DataTimeService中的调用sendBroadcast(broadcast)发送的广播消息;
*/
registerReceiver(receiver, new IntentFilter(
DataTimeServiceImpl.BROADCAST_ACTION));
}
@Override
public void onPause() {
super.onPause();
unregisterReceiver(receiver);
}
@Override
public void onDestroy() {
super.onDestroy();
unbindService(svcConn);
}
private void updateForecast() {
try {
String page = service.getForecastPage();
if (page != null) {
browser.loadDataWithBaseURL(null, page, "text/html", "UTF-8",
null);
browser.postDelayed(new Runnable() {
public void run() {
updateForecast();
}
}, 1000);
}
} catch (final Throwable t) {
svcConn.onServiceDisconnected(null);
}
}
//接收者实例
private BroadcastReceiver receiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
runOnUiThread(new Runnable() {
public void run() {
updateForecast();
}
});
}
};
}
分享到:
相关推荐
aidl文件的创建,service文件的创建,aidl通信的演示,服务的绑定
更好的设计Android软件应该熟悉掌握AIDL IPC机制,可以让你编写的组件类似Windows ActiveX COM一样更好的复用,提供类似像Symbian...我们创建一个aidl文件名为android123.aidl下面是示例代码,修改于Android SDK文档。
7.7 创建基于地图的活动 7.7.1 MapView和MapActivity简介 7.7.2 创建一个基于地图的活动 7.7.3 配置和使用MapView 7.7.4 使用MapController 7.7.5 对“Where Am I”示例使用地图 7.7.6 创建和使用覆盖(Overlay) ...
7.7.5 对“Where Am I”示例使用地图 7.7.6 创建和使用覆盖(Overlay) 7.7.7 MyLocationOverlay简介 7.7.8 ItemizedOverlay和Overlayltem简介 7.7.9 将View固定到地图和地图的某个位置上 7.8 对Earthquake示例添加...
7.7.5 对“Where Am I”示例使用地图 227 7.7.6 创建和使用覆盖(Overlay) 231 7.7.7 MyLocationOverlay简介 238 7.7.8 ItemizedOverlay和OverlayItem简介 239 7.7.9 将View固定到地图和地图的某个位置上 240 ...
11.3 使用服务的真实示例 11.3.1 Google翻译API 11.3.2 使用Google翻译API 11.4 参考资料 11.5 小结 第12章 包 12.1 包和进程 12.1.1 包规范的细节 12.1.2 将包名称转换为进程名称 ...
10.2.2 创建AIDL文件 383 10.2.3 将接口暴露给客户端 383 10.2.4 客户端访问AIDLService 385 10.3 电话管理器 (TelephonyManager) 393 10.4 短信管理器(SmsManager) 400 10.5 音频管理器 ...
11.3 使用服务的真实示例 11.3.1 Google翻译API 11.3.2 使用Google翻译API 11.4 参考资料 11.5 小结 第12章 包 12.1 包和进程 12.1.1 包规范的细节 12.1.2 将包名称转换为进程名称 ...
13.3.3 设计AIDL文件 327 13.3.4 编写AudioService 331 13.3.5 调用远程Service 336 13.3.6 组件间参数传递 343 本章小结 347 第14章 Broadcast Receiver和Notification 348 14.1 Broadcast Receiver 348 ...
2.1 创建Android工程 2.2 HelloAndroid详解 2.2.1 程序结构 2.2.2 代码分析 2.3 权限permission 2.4 LogCat日志调试 2.5 示例练习 2.5.1 登录界面 2.5.2 事件处理 2.6 本章小结 第二篇 Android开发关键组件 第3章 ...
2.4.2 使用文件共享 62 2.4.3 使用Messenger 65 2.4.4 使用AIDL 71 2.4.5 使用ContentProvider 91 2.4.6 使用Socket 103 2.5 Binder连接池 112 2.6 选用合适的IPC方式 121 第3章 View的事件体系 122 3.1 ...
2.4.2 使用文件共享 / 62 2.4.3 使用Messenger / 65 2.4.4 使用AIDL / 71 2.4.5 使用 Content Provider / 91 2.4.6 使用Socket / 103 2.5 Binder连接池 / 112 2.6 选用合适的IPC方式 / 121 第3章 ...
/ 42 2.3.1 Serializable接口 / 42 2.3.2 Parcelable接口 / 45 2.3.3 Binder / 47 2.4 Android中的IPC方式 / 61 2.4.1 使用Bundle / 61 2.4.2 使用文件共享 / 62 2.4.3 使用Messenger / 65 2.4.4 使用AIDL ...
本书是在分析Android源码的基础上展开的,而源码文件所在的路径一般都很长,例如,文件AndroidRuntime.cpp的真实路径就是framework/base/core/jni/AndroidRuntime.cpp。为了书 写方便起见,我们在各章节开头把该...
|--aidl调用系统未公开的方法代码示例2 |--android dp和px之间转换 |--android INSTALL_PARSE_FAILED_MANIFEST_MALFORMED |--android root下禁用组件 |--android 判断网络状态 |--android 对话框样式 |--android ...