`
isiqi
  • 浏览: 16044728 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Android 使用 aidl 文件创建服务示例

阅读更多

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();

  }

  });

  }

  };

  }

分享到:
评论

相关推荐

    Android aidl使用示例源码

    aidl文件的创建,service文件的创建,aidl通信的演示,服务的绑定

    掌握AIDL IPC机制

    更好的设计Android软件应该熟悉掌握AIDL IPC机制,可以让你编写的组件类似Windows ActiveX COM一样更好的复用,提供类似像Symbian...我们创建一个aidl文件名为android123.aidl下面是示例代码,修改于Android SDK文档。

    《Android高级编程》

    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) ...

    Android高级编程.pdf

    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示例添加...

    Android高级编程--源代码

    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 ...

    精通ANDROID 3(中文版)1/2

    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 将包名称转换为进程名称  ...

    疯狂Android讲义源码

     10.2.2 创建AIDL文件 383  10.2.3 将接口暴露给客户端 383  10.2.4 客户端访问AIDLService 385  10.3 电话管理器  (TelephonyManager) 393  10.4 短信管理器(SmsManager) 400  10.5 音频管理器  ...

    精通Android 3 (中文版)2/2

    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 将包名称转换为进程名称  ...

    Android开发案例驱动教程 配套代码

    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 ...

    Android典型技术模块开发详解

    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章 ...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    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 ...

    Android开发艺术探索

    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章 ...

    android开发艺术探索高清完整版PDF

    / 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:卷I--详细书签版

     本书是在分析Android源码的基础上展开的,而源码文件所在的路径一般都很长,例如,文件AndroidRuntime.cpp的真实路径就是framework/base/core/jni/AndroidRuntime.cpp。为了书 写方便起见,我们在各章节开头把该...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--aidl调用系统未公开的方法代码示例2 |--android dp和px之间转换 |--android INSTALL_PARSE_FAILED_MANIFEST_MALFORMED |--android root下禁用组件 |--android 判断网络状态 |--android 对话框样式 |--android ...

Global site tag (gtag.js) - Google Analytics