Service组件

服务没有可视化接口,可以在后台运行。
生命周期:onCreate() ------->onStart(Intent intent , int startId)----------->onDestroy()
服务必须显示调用才可启动。
开机启动一个服务:
需要借助BroadCast监听开机事件,然后在onReceive()中启动服务。


启动服务的2中方法:context.startService() 和context.bindService()

1、context.startService()

此种方式启动service时会一次调用

context.startService() -------->onCreate()----->onStart()(service可被启动多次,如果service正在运行,则直接调用此方法)------>service running

context.stopService() --------> onDestroy()

2、context.bindService()

此种方式启动service时会一次调用

context.startService() -------->onCreate()----->onBind()(只可绑定一次)------>service running

context.stopService() --------> onUnbind()----->onDestroy()

onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service的运行状态等。

此时调用者和Service绑定在一起,Context退出了,service就会调用相应的onUnbind()方法。


AIDL(Android Interface Definition Language)实现跨进程访问

AIDL(android接口描述语言)是一个IDL语言,它可以生成一段代码,可以使在一个android设备上运行的两个进程使用内部通信进程进行交互。如果你需要在一个进程中(例如:在一个Activity中)访问另一个进程中(例如:一个Service)某个对象的方法,你就可以使用AIDL来生成这样的代码来伪装传递各种参数。

要使用AIDL,Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务类。Service的实现类需要去继承这个stub服务类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了,参见下例:

service端进程:

首先建立一个android项目,并建立一个简单的AIDL服务(可看做一个接口),如下:

在包下建立一个aidl文件IService.aidl:

package com.service;

interface IService{
String getValue();
}

写一个Service类,在类中定义一个内部类MyServiceImpl ,该类实现aidl文件对应的stub服务类,如下:

[java] view plain copy print ?
  1. publicclassMyServiceextendsService{
  2. privateStringtext="";
  3. @Override
  4. publicIBinderonBind(Intentintent){
  5. returnnewMyServiceImpl();//此处必须返回一个IService的实现类
  6. }
  7. publicclassMyServiceImplextendsIService.Stub{
  8. @Override
  9. publicStringgetValue()throwsRemoteException{
  10. text=text+"io";
  11. returntext;
  12. }
  13. }
  14. }


在manifest文件中配置此service,如下:

<service android:name=".MyService">
<intent-filter >
<action android:name="com.service.serviceio"/>//此处是客户端用来访问AIDL服务的ID
</intent-filter>
</service>

调用服务的进程:

建立一个android项目作为客户端。

第一步:将service端项目生成的gen文件夹下的类(包括包)复制到调用服务的进程的src目录下。

第二步:写一个activity调用此服务:

[java] view plain copy print ?
  1. packagecom.client;
  2. importcom.service.IService;
  3. importandroid.app.Activity;
  4. importandroid.content.ComponentName;
  5. importandroid.content.Context;
  6. importandroid.content.Intent;
  7. importandroid.content.ServiceConnection;
  8. importandroid.os.Bundle;
  9. importandroid.os.IBinder;
  10. importandroid.os.RemoteException;
  11. importandroid.view.View;
  12. importandroid.view.View.OnClickListener;
  13. importandroid.widget.Button;
  14. importandroid.widget.TextView;
  15. publicclassIClientextendsActivityimplementsOnClickListener{
  16. privateIServiceiService=null;
  17. privateButtonbind,invoke;
  18. privateTextViewtext;
  19. privateServiceConnectionserviceConnection=newServiceConnection(){
  20. @Override
  21. publicvoidonServiceDisconnected(ComponentNamename){
  22. //TODOAuto-generatedmethodstub
  23. }
  24. @Override
  25. publicvoidonServiceConnected(ComponentNamename,IBinderservice){
  26. //TODOAuto-generatedmethodstub
  27. iService=IService.Stub.asInterface(service);
  28. invoke.setEnabled(true);
  29. }
  30. };
  31. @Override
  32. publicvoidonCreate(BundlesavedInstanceState){
  33. super.onCreate(savedInstanceState);
  34. setContentView(R.layout.main);
  35. bind=(Button)findViewById(R.id.bind);
  36. invoke=(Button)findViewById(R.id.invoke);
  37. invoke.setEnabled(false);
  38. bind.setOnClickListener(this);
  39. invoke.setOnClickListener(this);
  40. text=(TextView)findViewById(R.id.text);
  41. }
  42. @Override
  43. publicvoidonClick(Viewv){
  44. //TODOAuto-generatedmethodstub
  45. switch(v.getId()){
  46. caseR.id.bind:
  47. bindService(newIntent("com.service.serviceio"),serviceConnection,Context.BIND_AUTO_CREATE);
  48. break;
  49. caseR.id.invoke:
  50. try{
  51. text.setText(iService.getValue());
  52. }catch(RemoteExceptione){
  53. //TODOAuto-generatedcatchblock
  54. e.printStackTrace();
  55. }
  56. break;
  57. }
  58. }
  59. }


此时就可实现访问service端的数据。

注意:AIDL服务只支持有限的数据类型,因此,如果用AIDL服务传递一些复杂的数据就需要进一步的处理。

AIDL服务支持的数据类型有:

java的简单类型:int char boolean 等

String 和CharSequence

List和Map;对象元素的类型也必须是AIDL服务支持的类型

AIDL自动生成的接口(需要import)

实现android.os.Parcelable接口的类(需要import)


来自于:http://blog.csdn.net/kay_wyong/article/details/6707645

更多相关文章

  1. android动态修改drawable颜色及大小
  2. android 内置的短信等调用代码
  3. Android(安卓)PackageManagerService(四)本地安装流程详解
  4. Android(安卓)调用Remote Service方法
  5. Android(安卓)View刷新机制
  6. Android(安卓)O media difference(add HIDL)
  7. Android标准调用播放器流程
  8. Android(安卓)JNI 篇 - ffmpeg 获取音视频缩略图
  9. android hessian通信

随机推荐

  1. sqlserver存储过程中SELECT 与 SET 对变
  2. sqlserver Case函数应用介绍
  3. SQL 中sp_executesql存储过程的使用帮助
  4. SQL 复合查询条件(AND,OR,NOT)对NULL值的
  5. SQL 中 NULL值测试代码
  6. SQLServer 2000定时执行SQL语句
  7. sql 游标使用笔记
  8. sqlserver 手工实现差异备份的步骤
  9. SQL Server复制功能要避开缺陷的干扰小结
  10. SQL Server允许重复空字段不空字段值唯一