Android服务报告.docx

上传人:b****5 文档编号:3412708 上传时间:2022-11-22 格式:DOCX 页数:24 大小:33.75KB
下载 相关 举报
Android服务报告.docx_第1页
第1页 / 共24页
Android服务报告.docx_第2页
第2页 / 共24页
Android服务报告.docx_第3页
第3页 / 共24页
Android服务报告.docx_第4页
第4页 / 共24页
Android服务报告.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

Android服务报告.docx

《Android服务报告.docx》由会员分享,可在线阅读,更多相关《Android服务报告.docx(24页珍藏版)》请在冰豆网上搜索。

Android服务报告.docx

Android服务报告

机构图标

{项目名称}

Android服务(Service)

文件状态:

[√]草稿

[]正式发布

[]正在修改

文件标识:

Company-Project-Service-MODULE

当前版本:

0.1

作者:

XXX

完成日期:

2011-5-4

XXXXX

信息工程中心嵌入式与RFID实验室

版本历史

版本/状态

作者

参与者

起止日期

备注

0.1

XXX

2011/5/1

草稿

0.1

XXX

2011/5/3

添加事例代码

0.1

XXX

2011/5/3

格式规范化

0.1

XXX

2011/5/7

正文中文改为非倾斜

0.1

XXX

2011/5/11

修改陶博士指出的错误之处

0.1

XXXX

2011/8/9

修订错误

0.1

XXX

2011/8/9

根据许博士的修订更正错误

目录

0.文档介绍4

0.1文档目的4

0.2文档范围4

0.3读者对象4

0.4参考文献4

0.5术语与缩写解释4

1.系统环境5

2.Android服务的简介5

2.1服务是什么5

2.2服务的作用5

2.3服务的启动方式6

2.4服务的分类9

2.5系统服务9

3.服务的生命周期10

3.1服务生命周期的概念和组成10

3.2服务生命周期的实例12

3.3创建和开始服务的步骤14

4.绑定Activity和Service14

4.1绑定Activity和Service14

4.2Activity和Service绑定的总结17

5.在BroadcastReceiver中启动Service19

6.跨进程访问(AIDL服务)20

6.1什么是AIDL服务20

6.2使用AIDL实现IPC(ImplementingIPCUsingAIDL)21

6.2.1 使用AIDL实现IPC服务具体步骤21

6.2.2 创建.aidl文件21

6.2.3实现接口(ImplementingtheInterface)21

6.2.4向客户端暴露接口(ExposingYourInterfacetoClients)22

6.2.5使用可打包接口传递参数22

6.2.6调用IPC方法(CallinganIPCMethod)22

7.总结23

0.文档介绍

0.1文档目的

本文档主要是介绍Android的服务(Service)类,作者希望通过本文档的介绍能使读者对Android的服务有所了解,并通过一些小的实例,加深对服务的理解和灵活运用。

0.2文档范围

本文档主要用于Android的服务类,本文主要从以下几个方面来介绍:

什么是服务、服务的作用、服务的启动方式、服务的生命周期,以及服务和Activity的联合使用,还有一些简单的实例等。

0.3读者对象

本文适合于对Android系统开发有兴趣的读者,还有想要研究Android系统下服务的读者,文档涉及到Android系统,因此还是要求读者对其具有一些基本概念,例如,关于JAVAAPI中关于Service概念的理解和关于Android中有关Activity类的理解等。

0.4参考文献

AndroidSDKDocuments

0.5术语与缩写解释

缩写、术语

解释

APK

AndroidPackage的缩写

AIDL

AndroidInterfaceDefinitionLanguage(接口定义语言)

RPC

RemoteProcedureCall(远程过程调用)

1.系统环境

宿主机

Win7(Android2.2)

补充说明

2.Android服务的简介

2.1服务是什么

举一个常见的例子:

Mediaplayer从播放列表播放音乐,播放器有一些Activities能够使用户选定歌曲并开始播放。

但是,播放本身不需要Activity处理,因为用户希望关闭Activity后歌曲会继续播放。

因此此时Mediaplayer的Activity会启动一个Service。

当用户离开窗体后,系统还可以保持歌曲的播放。

我们还可以与正在运行的Service通信。

与Service通信依赖于Service公开的接口。

例如音乐播放,接口可能允许用户暂停、启动、停止、继续播放列表等等。

因此,我们给出了服务的下述概念。

服务(Service)是Android系统中4个应用程序组件之一(其他的组件为活动组件(Activity)、广播接收器(BroadcastReceivers)、内容提供器(AccessingContentProviders))。

服务是提供并没有与用户进行交互的实际界面,而是一直在Android系统的后台运行的应用程序组件。

它跟Activity的级别差不多,但是不能自己运行,只能在后台运行,并且可以和其他组件进行交互。

但通常存在对服务是进程还是线程理解的误区,我们特解释如下:

(1)服务不是一个单独的进程。

服务对象本身并不能够执行它自己的进程,除非另有规定,它才能够执行作为应用程序中的一部分的相同进程。

(2)服务也不是一个线程。

但这并不意味着它本身不能够关闭主线程(以避免应用程序无响应的错误)。

因此应该尽量避免在Service的onCreate或者onStart做一些很耗时间的事情,最好在Service里启动一个线程来完成(如音乐播放),因为Service是运行在主线程中,这样会影响到UI操作或者阻塞主线程中的其他事情。

  

2.2服务的作用

一般使用服务为应用程序提供一些服务,或不需要界面的功能,服务主要用于两个目的:

后台运行和跨进程访问。

通过启动一个服务,可以在不显示界面的前提下在后台运行指定的任务,这样可以不影响用户做其他事情。

例如,从Internet下载文件、控制Video播放器等。

另外,通过AIDL服务可以实现不同进程之间的通信,这也是服务的重要用途之一。

2.3服务的启动方式

服务有两种启动方式:

context.startService()和context.bindService()。

但需要注意的是需要在androidMainfest.xml中注册才能使用服务。

这两种方法都可以启动Service,但它们使用的场所不同:

(1)使用startService()方法启动服务,调用者与服务之间没有关联,即使调用者退出,服务仍可运行。

(2)使用bindService()方法启动服务,调用者与服务绑定在一起,调用者一旦退出,服务也就终止。

这两种不同的启动服务方法的具体流程如下:

(1)如果使用startService()方法启动服务,在服务还未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。

如果调用onStart()方法之前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。

采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

(2)如果使用bindStart()方法启动服务,在服务还未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法,此时,调用者和服务绑定在一起,如果调用者退出,系统则会先调用服务的onUnbind()方法,接着调用onDestroy()方法。

如果调用bindService()方法之前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会多次被调用)。

如果调用者希望与正在绑定的服务解除绑定,可调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()和onDestroy()方法。

例子如下:

一个利用后台服务播放音乐的小例子,点击start按钮运行服务,点击stop按钮停止服务。

  

1.package com.example;  

2.  

3.import android.app.Service;  

4.import android.content.Intent;  

5.import android.media.MediaPlayer;  

6.import android.os.IBinder;  

7.import android.util.Log;  

8.import android.widget.Toast;  

9.  

10.public class MyService extends Service {  

11.    private static final String TAG = "MyService";  

12.    MediaPlayer player;  

13.      

14.    @Override  

15.    public IBinder onBind(Intent intent) {  

16.        return null;  

17.    }  

18.      

19.    @Override  

20.    public void onCreate() {  

21.        Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();  

22.        Log.d(TAG, "onCreate");  

23.          

24. player = MediaPlayer.create(this, R.raw.braincandy);//运行例子是,需要替换音乐的名称  

25.        player.setLooping(false); // Set looping  

26.    }  

27.  

28.    @Override  

29.    public void onDestroy() {  

30.        Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();  

31.        Log.d(TAG, "onDestroy");  

32.        player.stop();  

33.    }  

34.      

35.    @Override  

36.    public void onStart(Intent intent, int startid) {  

37.        Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();  

38.        Log.d(TAG, "onStart");  

39.        player.start();  

40.    }  

41.}  

除此之外还要在Manifest里面声明服务:

1.

xml version="1.0" encoding="utf-8"?

>  

2.

android="  

3.  package="com.example" android:

versionCode="1" android:

versionName="1.0">  

4.  

icon="@drawable/icon" android:

label="@string/app_name">  

5.    

name=".ServicesDemo" android:

label="@string/app_name">  

6.        

7.        

name="android.intent.action.MAIN" />  

8.        

name="android.intent.category.LAUNCHER" />  

9.        

10.      

11.    

enabled="true" android:

name=".MyService" />  

12.    

13.  

minSdkVersion="3" />  

14.   

定义Activity,ServicesDemo.java

1.package com.example;  

2.  

3.import android.app.Activity;  

4.import android.content.Intent;  

5.import android.os.Bundle;  

6.import android.util.Log;  

7.import android.view.View;  

8.import android.view.View.OnClickListener;  

9.import android.widget.Button;  

10.  

11.public class ServicesDemo extends Activity implements OnClickListener {  

12.  private static final String TAG = "ServicesDemo";  

13.  Button buttonStart, buttonStop;  

14.  

15.  @Override  

16.  public void onCreate(Bundle savedInstanceState) {  

17.    super.onCreate(savedInstanceState);  

18.    setContentView(R.layout.main);  

19.  

20.    buttonStart = (Button) findViewById(R.id.buttonStart);  

21.    buttonStop = (Button) findViewById(R.id.buttonStop);  

22.    buttonStart.setOnClickListener(this);  

23.    buttonStop.setOnClickListener(this);  

24.  }  

25.  public void onClick(View src) {  

26.    switch (src.getId()) {  

27.    case R.id.buttonStart:

  

28.      Log.d(TAG, "onClick:

 starting srvice");  

29.      startService(new Intent(this, MyService.class));  

30.      break;  

31.    case R.id.buttonStop:

  

32.      Log.d(TAG, "onClick:

 stopping srvice");  

33.      stopService(new Intent(this, MyService.class));  

34.      break;  

35.    }  

36.  }  

37.} 

2.4服务的分类

由于Android的独特的线程模型,Service被同一个Apk调用和不同Apk调用原理是不同的,因此分成以下两种:

(1)本地服务(LocalService):

就是在同一个Apk内被调用。

当服务和访问者在同一个进程内部,就叫本地服务。

因为是在同一个内存块,所以访问者可以直接通过“服务”的内存引用就可以与服务交互。

(2)远程服务(RemoteSercie):

被另外一个Apk调用。

服务不在同一进程,甚至在另一个本地应用程序中,就是一个应用要访问另一个应用启动的服务。

在Android中,每个应用程序都有自己的进程。

不同的进程之间通信,也就是说要把一个对象,传递到另一个应用,并且能供目标应用使用。

这需要把对象解析成操作系统能够理解的数据格式,才能达到跨界对象访问的目的。

Android中,采用AIDL(AndroidInterfaceDefinitionLanguage:

接口定义语言)方式来实现。

AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现Android设备上的两个进程间通信(IPC)。

进程与进程之间的通信信息,首先会被转换成AIDL协议消息,然后发送给对方,对方收到AIDL协议消息后再转换成相应的对象。

整个过程有点类似于WebService的远程调用机制。

由于进程之间的通信信息需要双向转换,所以Android采用代理类(注意:

也就是说,当我们获取到某个进程传过来的对象时,这个对象只是一个代理)在背后实现了信息的双向转换。

由于此类应用比较重要,所以我们单独的拿出一章来介绍其应用。

2.5系统服务

在Android系统中有很多内置的软件,例如,当手机接到来电时,会显示对方的电话号。

也可以根据周围的环境将手机设置成震动或静音。

如果想把这些功能加到自己的软件中应该怎么办呢?

答案就是"系统服务"。

在Android系统中提供了很多这种服务,通过这些服务,就可以像Android系统的内置软件一样随心所欲地控制Android系统了。

系统服务实际上可以看作是一个对象,通过Activity类的getSystemService方法可以获得指定的对象(系统服务)。

getSystemService方法只有一个String类型的参数,表示系统服务的ID,这个ID在整个Android系统中是唯一的。

例如,audio表示音频服务,window表示窗口服务,notification表示通知服务。

为了便于记忆和管理,AndroidSDK在android.content.Context类中定义了这些ID,例如,下面的代码是一些ID的定义。

1.public static final String AUDIO_SERVICE = "audio";      

//  定义音频服务的ID 

2.public static final String WINDOW_SERVICE = "window";  

//  定义窗口服务的ID 

3.public static final String NOTIFICATION_SERVICE = 

"notification";       //  定义通知服务的ID 

下面的代码获得了剪贴板服务(android.text.ClipboardManager对象)。

1.//  获得ClipboardManager对象 

2.android.text.ClipboardManager clipboardManager= 

3.             (android.text.ClipboardManager)

getSystemService(Context.CLIPBOARD_SERVICE); 

4.clipboardManager.setText("设置剪贴版中的内容"); 

在调用ClipboardManager.setText方法设置文本后,在Android系统中所有的文本输入框都可以从这个剪贴板对象中获得这段文本。

窗口服务(WindowManager对象)是最常用的系统服务之一,通过这个服务,可以获得很多与窗口相关的信息,例如,窗口的长度和宽度,如下面的代码所示:

1.//  获得WindowManager对象 

2.android.view.WindowManager windowManager = (android.view.WindowManager)  

3.                                               

4.getSystemService(Context.WINDOW_SERVICE); 

5.//  在窗口的标题栏输出当前窗口的宽度和高度,例如,320*480 

6.setTitle(String.valueOf(windowManager.getDefaultDisplay().getWidth()) + "*" 

7.                              + String.valueOf

(windowManager.getDefaultDisplay().getHeight())); 

本节简单介绍了如何获得系统服务以及两个常用的系统服务的使用方法。

3.服务的生命周期

3.1服务生命周期的概念和组成

像activity一样,service也有可以通过监视状态实现的生命周期,即也有一个从启动到销毁的过程,但Service的这个过程比Activity简单得多。

Service启动到销毁的过程只会经历如下3个阶段:

(1)创建服务

(2)开始服务

(3)销毁服务

一个服务实际上是一个继承android.app.Service的类,当服务经历上面3个阶段后,会分别调用Service类中的3个事件方法进行交互,这3个事件方法如下:

(1)public void onCreate();                     //  创建服务 

(2)public void onStart(Intent intent, int startId);            //  开始服务 

(3)public void onDestroy();                        //  销毁服务 

因此,由上可知一个服务只会创建一次,销毁一次,但可以开始多次,因此,onCreate和onDestroy方法只会被调用一次,而onStart方法会被调用多次。

通过实现这3个方法,可以监视service生命周期的2个嵌套循环:

整个生命周期从onCreate()开始,从onDestroy()结束,像activity

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1