Android服务Service_详解

第8章 Android服务  8.1 Service起步  8.1.1 Service的生命周期  8.1.2 绑定Activity和Service  8.1.3 在BroadcastReceiver中启动Ser..  8.2.1 获得系统服务  8.2.2 在模拟器上模拟重力感应  8.3.1 计时器:Chronometer  8.3.2 预约时间Handler  8.3.4 在线程中更新GUI组件  8.3.5 全局定时器AlarmManager(1)  8.3.5 全局定时器AlarmManager(2)  8.3.5 全局定时器AlarmManager(3)  8.4.1 什么是AIDL服务  8.4.2 建立AIDL服务的步骤(1)  8.4.2 建立AIDL服务的步骤(2)  8.4.2 建立AIDL服务的步骤(3)  8.5 本章小结

第8章 Android服务 服务(Service)是Android系统中4个应用程序组件之一(其他的组件详见3.2节的内容)。服务主要用于两个目的:后台运行和跨进程访问。通过启动一个服务,可以在不显示界面的前提下在后台运行指定的任务,这样可以不影响用户做其他事情。通过AIDL服务可以实现不同进程之间的通信,这也是服务的重要用途之一。

本章内容 Service的生命周期 绑定Activity和Service 在BroadcastReceiver中启动Service 系统服务 时间服务 在线程中更新GUI组件 AIDL服务 在AIDL服务中传递复杂的数据 8.1 Service起步 Service并没有实际界面,而是一直在Android系统的后台运行。一般使用Service为应用程序提供一些服务,或不需要界面的功能,例如,从Internet下载文件、控制Video播放器等。本节主要介绍Service的启动和结束过程(Service的生命周期)以及启动Service的各种方法。

8.1.1 Service的生命周期 本节的例子代码所在的工程目录是src\ch08\ch08_servicelifecycle Service与Activity一样,也有一个从启动到销毁的过程,但Service的这个过程比Activity简单得多。Service启动到销毁的过程只会经历如下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方法会被调用多次。

下面编写一个服务类,具体看一下服务的生命周期由开始到销毁的过程。 1. package net.blogjava.mobile.service; 2. import android.app.Service; 3. import android.content.Intent; 4. import android.os.IBinder; 5. import android.util.Log; 6. 7. // MyService是一个服务类,该类必须从android.app.Service类继承 8. public class MyService extends Service 9. { 10. @Override 11. public IBinder onBind(Intent intent) 12. { 13. return null; 14. } 15. // 当服务第1次创建时调用该方法 16. @Override 17. public void onCreate() 18. { 19. Log.d("MyService", "onCreate"); 20. super.onCreate(); 21. } 22. // 当服务销毁时调用该方法 23. @Override 24. public void onDestroy() 25. { 26. Log.d("MyService", "onDestroy"); 27. super.onDestroy(); 28. } 29. // 当开始服务时调用该方法 30. @Override 31. public void onStart(Intent intent, int startId) 32. { 33. Log.d("MyService", "onStart"); 34. super.onStart(intent, startId); 35. } 36. } 在MyService中覆盖了Service类中3个生命周期方法,并在这些方法中输出了相应的日志信息,以便更容易地观察事件方法的调用情况。

读者在编写Android的应用组件时要注意,不管是编写什么组件(例如,Activity、Service等),都需要在AndroidManifest.xml文件中进行配置。MyService类也不例子。配置这个服务类很简单,只需要在AndroidManifest.xml文件的标签中添加如下代码即可:

1. 其中android:enabled属性的值为true,表示MyService服务处于激活状态。虽然目前MyService是激活的,但系统仍然不会启动MyService,要想启动这个服务。必须显式地调用startService方法。如果想停止服务,需要显式地调用stopService方法,代码如下:

1. public void onClick(View view) 2. { 3. switch (view.getId()) 4. { 5. case R.id.btnStartService: 6. startService(serviceIntent); // 单击【Start Service】按钮启动服务 7. break; 8. case R.id.btnStopService: 9. stopService(serviceIntent); // 单击【Stop Service】按钮停止服务 10. break; 11. } 12. }

其中serviceIntent是一个Intent对象,用于指定MyService服务,创建该对象的代码如下: 1. serviceIntent = new Intent(this, MyService.class); 运行本节的例子后,会显示如图8.1所示的界面。

图8.1 开始和停止服务 第1次单击【Start Service】按钮后,在DDMS透视图的LogCat视图的Message列会输出如下两行信息: 1. onCreate 2. onStart

然后单击【Stop Service】按钮,会在Message列中输出如下信息: 1. onDestroy 下面按如下的单击按钮顺序的重新测试一下本例。 【Start Service】→【Stop Service】→【Start Service】→【Start Service】→【Start Service】→【Stop Service】 测试完程序,就会看到如图8.2所示的输出信息。可以看出,只在第1次单击【Start Service】按钮后会调用onCreate方法,如果在未单击【Stop Service】按钮时多次单击【Start Service】按钮,系统只在第1次单击【Start Service】按钮时调用onCreate和onStart方法,再单击该按钮时,系统只会调用onStart方法,而不会再次调用onCreate方法。

图8.2 服务的生命周期方法的调用情况 在讨论完服务的生命周期后,再来总结一下创建和开始服务的步骤。创建和开始一个服务需要如下3步:

(1)编写一个服务类,该类必须从android.app.Service继承。Service类涉及到3个生命周期方法,但这3个方法并不一定在子类中覆盖,读者可根据不同需求来决定使用哪些生命周期方法。在Service类中有一个onBind方法,该方法是一个抽象方法,在Service的子类中必须覆盖。这个方法当Activity与Service绑定时被调用(将在8.1.3节详细介绍)。

(2)在AndroidManifest.xml文件中使用标签来配置服务,一般需要将标签的android:enabled属性值设为true,并使用android:name属性指定在第1步建立的服务类名。

(3)如果要开始一个服务,使用startService方法,停止一个服务要使用stopService方法。 8.1.2 绑定Activity和Service 本节的例子代码所在的工程目录是src\ch08\ch08_serviceactivity 如果使用8.1.1节介绍的方法启动服务,并且未调用stopService来停止服务,这个服务就会随着Android系统的启动而启动,随着Android系统的关闭而关闭。也就是服务会在Android系统启动后一直在后台运行,直到Android系统关闭后服务才停止。但有时我们希望在启动服务的Activity关闭后服务自动关闭,这就需要将Activity和Service绑定。

通过bindService方法可以将Activity和Service绑定。bindService方法的定义如下: 1. public boolean bindService(Intent service, ServiceConnection conn, int flags)

合集下载

androidService简单例子

androidService简单例子

androidService简单例⼦⾸先在实例之前先看下service的概念⽤途以及⽣命周期:Service概念及⽤途:Android中的服务,它与Activity不同,它是不能与⽤户交互的,不能⾃⼰启动的,运⾏在后台的程序,如果我们退出应⽤时,Service进程并没有结束,它仍然在后台运⾏,那我们什么时候会⽤到Service呢?⽐如我们播放⾳乐的时候,有可能想边听⾳乐边⼲些其他事情,当我们退出播放⾳乐的应⽤,如果不⽤Service,我们就听不到歌了,所以这时候就得⽤到Service了,⼜⽐如当我们⼀个应⽤的数据是通过⽹络获取的,不同时间(⼀段时间)的数据是不同的这时候我们可以⽤Service在后台定时更新,⽽不⽤每打开应⽤的时候在去获取。

注意:1.Service不能⾃⼰运⾏,需要通过某⼀个Activity或者其他Context对象来调⽤, Context.startService()和Context.bindService()。

通过startService:Service会经历 onCreate -> onStart, stopService的时候直接onDestroy,如果是调⽤者⾃⼰直接退出⽽没有调⽤stopService的话,Service会⼀直在后台运⾏。

下次调⽤者再起来可以stopService。

通过bindService:Service只会运⾏onCreate,这个时候调⽤者和Service绑定在⼀起,调⽤者退出了,Srevice就会调⽤onUnbind->onDestroyed所谓绑定在⼀起就共存亡了。

Service的onCreate的⽅法只会被调⽤⼀次,就是你⽆论多少次的startService⼜bindService,Service只被创建⼀次。

如果先是bind了,那么start的时候就直接运⾏Service的onStart⽅法,如果先是start,那么bind的时候就直接运⾏onBind⽅法。

Service

Service

Binder系统
Binder情景分析 可以将一个IPC通讯理解成客户端/服务器模式,一 个典型的Binder应用模式如下: 1.客户端通过某种方式得到服务器端的代理对象 ,从客户端看代理对象和他的本地对象没有什么分别,一 样可以调用方法,访问变量。 2.客户端通过调用服务器代理对象的方法向服务 器端发送请求。 3.代理对象将用户请求通过Android内核的Binder 驱动发送到服务器进程。 4.服务器进程处理用户请求,并通过Binder驱动 返回处理结果给客户端的代理对象。 5.客户端收到代理对象返回的处理结果。
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完 onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。 onStart 方法的创建的service一开始是onCreate 然后调用onStartCommand() (在老的版 本中是onStart()函数,新版本中调用onStartCommand的话还是会去调用onStart方 法,建议使用onStartCommand方式)。如果该service不stop的话,再点的话一直会是 onstart相应,onCreate只有在第一次启动的时候会调用。
绑定一个已经存在的Service
//连接对象
private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder ibinder) {Log.i(“Service”,“连接成功!”);} public void onServiceDisconnected(ComponentName name) {Log.i(“Service”,“断开连接!”);} }; //绑定Service bindService(intent,conn,Service.BIND_AUTO_CREATE);

android学习—service

android学习—service

ServicesService是一种应用程序组件,可以在后台执行长时间运行的操作,并不提供一个用户界面。

另一个应用程序组件可以启动服务,它将继续在后台运行,即使在用户切换到另一个应用程序。

此外,一个组件可以绑定到与之进行交互,甚至执行进程间通信(IPC) 的服务。

例如,服务可能会处理网络交易、播放音乐、执行文件i/o 操作,或与内容提供商,所有从背景进行交互。

一种服务基本上是可以采取两种形式:开始一种服务是""启动时启动应用程序组件(如活动)它通过调用startService()。

一旦启动,服务可以在后台运行下去,即使开始它的组件已被破坏。

通常情况下,启动的服务执行单个操作,并不向调用方返回一个结果。

例如,它可能会下载或上传文件在网络上。

当操作完成后时,该服务应自行停止。

绑定一种服务"绑定"时应用程序组件绑定到它通过调用bindService()。

绑定的服务提供了一个允许组件,与该服务进行交互,发送请求,获得的结果,,甚至做到跨进程的进程间通信(IPC) 的客户端-服务器界面。

绑定的服务只运行,只要另一个应用程序组件绑定到它。

多个组件可以将绑定到该服务一次,但当所有人都解除绑定,该服务已被破坏。

虽然本文档通常单独讨论这两种类型的服务,您的服务可以工作这两种方法——它可以开始(要无限期地运行),还允许具有约束力。

这是只需您是否实现一对夫妇的回调方法:onStartCommand(),允许组件启动它,onBind()允许绑定。

无论是否您的应用程序启动时,绑定,或两个,则任何应用程序组件可以在相同的方式的任何组件可以使用一个活动中使用(即使从单独的应用程序),服务——通过启动它Intent。

但是,您可以声明为私有的在清单文件中,该服务并阻止从其他应用程序的访问权限。

这是多节中讨论有关声明,在清单中的服务.警告:在其宿主进程的主线程中运行的服务——服务并不创建其自己的线程和不(除非您另行指定,否则)在一个单独的进程中运行。

Android知识点之Service篇

Android知识点之Service篇

1.Service的基本认识1.1 Service是什么? Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的组件。

它运行于UI线程,因此不能进行耗时的操作。

1.2 Service和Thread的区别 Service的运行是在UI线程当中的,是绝对绝对不能进行耗时操作的,而Thread开启的子线程则可以进行耗时操作,但是Thread开启的子线程是不能直接对UI进行操作的,否则极有可能发生直接让程序崩掉,这就是它们的区别。

2.启动Service的2种方式2.1 startService()方法开启Service 步骤: a.定义一个类继承Service。

b.在AndroidManifest.xml文件中配置该Service。

c.使用Context的startService(Intent)方法启动该Service。

d.不再使用该Service时,调用Context的stopService(Intent)方法停止该Service。

2.2 bindService方法开启Service(Activity与Service绑定) 步骤: a.创建BinderService服务端,继承自Service并在类中创建一个实现IBinder接口的实现实例对象并提供公共方法给客户端调用。

b.从onBind()回调方法返回此Binder实例。

c.在客户端中,从onServiceConnected回调方法接收Binder,并使用提供的方法调用绑定服务。

3.Service的生命周期 服务的生命周期有两种,因为服务可以跟Activity绑定起来,也可以不绑定,Activity 和服务进行通信的话,是需要把服务和Activity进行绑定的。

因此服务的生命周期分为未绑定Activity的和绑定Activity的。

没有绑定Activity的服务生命周期图:绑定Activity的服务生命周期图:1.通过Intent和startService()方法启动了一个服务,接下来执行onCreate()方法,首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用onStartCommand() 或onBind() 之前)。

android service原理

android service原理

android service原理Android Service是Android操作系统中的一个核心概念之一,它是在后台中运行的一个应用程序组件,可以执行长时间运行的任务且不依赖于界面界面。

这篇文章将详细地解释Android Service的原理和功能。

1. 什么是Android ServiceAndroid Service是一种可以在后台执行操作的组件,它可以执行长时间运行的任务而不会干扰用户的操作。

Service不需要用户界面,可以在后台运行。

Service 可以执行诸如播放音乐、下载文件等耗时操作,而这些操作都是在后台执行的。

2. Android Service的工作原理在Android系统中,Service是一个独立的线程,它可以在后台运行,并执行特定的任务。

通过向Service发送命令,应用程序可以与Service进行交互。

在Android 系统中,Service通常会绑定到应用程序的活动中。

当应用程序需要Service执行某些操作时,它可以通过以下两种方式之一向Service发送命令:① 使用Intent:应用程序可以使用Intent来启动和停止Service。

当Service收到Intent的请求时,它将根据请求执行相应的操作。

② 使用绑定应用程序可以使用绑定机制来连接Service。

这种连接是基于“客户端-服务器”模式,并且它构成了Service 的一部分。

当应用程序与Service绑定时,它可以使用Service提供的API进行交互。

Service可以在后台运行,因此它可以一直保持运行状态,即使应用程序已经关闭。

Service的这种特性使得它非常适合执行一些与用户界面无关的任务,例如:下载文件、播放音乐等。

3. Android Service的类型Android系统中有两种Service类型:前台(Service.FOREGROUND)和后台(Service.BACKGROUND)。

Android9 Service

Android9 Service

代码示例
• 通过TelephoneManager提供的系列方法获 取手机网络、SIM卡的相关信息,并以 ListView的形式显示在手机屏幕上。
步骤1
• <?xml version="1.0" encoding="utf-8"?> • <LinearLayout xmlns:android="/apk/res/and roid" • android:layout_width="fill_parent" • android:layout_height="fill_parent" • android:background="#F0F0F0" • android:orientation="vertical" > • <ListView • android:id="@+id/showPhoneLV" • android:layout_width="fill_parent" • android:layout_height="wrap_content" /> • </LinearLayout>
创建、配置Service
• 和开发Activity的步骤类似,创建Service需要经过 以下两步:
– (1)编写一个继承自Service的类创建自己的服务,根据 需要重写onCreate()、 onDestroy() 、onBind()、 onStartCommand()方法。如果希望Service组件做某些 事情,一般只要在onCreate()或onStartCommand()方 法中定义相关的业务代码即可。 – (2)在AndroidManifest.xml文件中的<application>节点 里注册service,要添加的节点语法如下,其中关键的 属性“android:name”指的是服务类的名称,如必要, 需带包名。

android service用法

android service用法Android Service是Android中的一个非常重要的概念,它是一种可以在后台运行的组件。

Service可以用来执行长时间运行的操作而不需要用户交互。

这些操作可以是播放音乐、下载文件、上传日志等等。

Service是Android四大组件之一,它与Activity、BroadcastReceiver、Content Provider共同构成了Android应用程序的组成部分。

当我们开发Android应用程序时,会不可避免地遇到一些需要在后台运行一段时间的任务,这时就可以用到Service来解决这些问题。

Service的用途:1.执行一些耗时的任务,不会阻塞UI线程。

2.在后台接收和处理广播,并且不会为了响应广播而启动用户界面。

3.提供远程接口,用于与其他应用程序进行通信。

Android系统根据服务的工作状态,将Service分为两种类型:Started Service和Bound Service。

1.Started Service最常用的一种是Started Service,它是一种没有任何输入或输出数据流的服务,只负责执行一些计算或操作,这些操作不需要与应用程序的其他组件进行交互。

- onCreate()方法:当Service第一次创建时,系统会调用该方法,只会调用一次。

使用startService()方法启动Service。

startService()方法可以传递Intent作为参数,在Intent中可以携带数据。

Bound Service需要与其他组件进行交互,它可以被客户端连接和解绑。

客户端可以在Activity、Service、BroadcastReceiver里面创建与Bound Service的连接。

Bound Service通常需要提供一些公共方法供客户端调用。

Bound Service的生命周期:Service的生命周期分为创建、运行和销毁三个阶段。

Android中的Service:默默的奉献者(1)

Android中的Service:默默的奉献者(1)前言这段时间在看一些IPC相关的东西,这里面就不可避免的要涉及到service,进程线程这些知识点,而且在研究的过程中我惊觉自己对这些东西的记忆已经开始有些模糊了——这可要不得。

于是我就干脆花了点心思温故了一下,就有了这篇博文。

非常感谢Google的官方文档——尤其是其中部分文章有中文版了之后。

正文1,什么是service?Service是一个可以在后台执行长时间操作而不使用用户界面的应用组件。

那么问题来了,既然它不使用用户界面,那么它怎么知道应该什么时候开始执行什么操作呢?答案是——它可以与其他的引用组件形成一些联系,从而可以根据其传来的信息在合适的时候执行合适的操作。

一般来讲,这种联系分为两种:startService()以及bindService()。

这两种联系都可以使得一个service开始运行,但是在其他方面有着诸多不同。

喵~启动service的方式停止service的方式service与启动它的组件之间的通信方式service的生命周期startServ ice 在其他组件中调用startService()方法后,服务即处于启动状态service中调用stopSelf()方法,或者其他组件调用stopService()方法后,service将停止运行没有提供默认的通信方式,启动service后该service就处于独立运行状态一旦启动,service即可在后台无限期运行,即使启动service的组件已被销毁也不受其影响,直到其被停止bindServi ce 在其他组件中调用bindService()方法后,服务即处于启动状态所有与service绑定的组件都被销毁,或者它们都调用了unbindService()方法后,service将停止运行可以通过ServiceConnection进行通信,组件可以与service进行交互、发送请求、获取结果,甚至是利用IPC跨进程执行这些操作当所有与其绑定的组件都取消绑定(可能是组件被销毁也有可能是其调用了unbindService()方法)后,service将停止注:1.表格中的“其他组件”不包括Broadcast receiver,其无法直接启动或绑定service。

Android之Service组件

保证原创精品已受版权保护Service是运行在后台的一种服务程序,一般很少和用户交互,因此没有可视化界面一个定义好的service必须在AndroidMainfest.xml配置文件中通过<service>元素声明才能使用定义Service类-- 继承Service类实现其生命周期中的方法---onBind(Intent intent) 必须实现的方法返回一个绑定的借口给service---onCreate() 当service第一次被创建时,由系统调用---onStart(Intent intent,int startId) 通过startService()方法启动Service时,该方法被调用---onDestory() 当service不再使用,系统调用该方法-- 启动和停止service---context.startService(Intent intent)----被调用的service调用其的onCreate()方法[如果该service没有被创建]----被调用的service调用onStart()---一直运行到调用context.stopService()或者stopSelf()-- 绑定一个已经存在的service---bindService(intent,conn,Service.BIND_AUTO_CREATE)方法---参数列表说明:----第一个是intent----第二个是ServiceConnection对象创建该对象实现onServiceConnected()和onServiceDisconnected()来判断连接成功或者断开连接----第三个是如何创建service 一般指定绑定时自动创建---过程:----被调用的service调用其的onCreate()方法[如果该service没有被创建]----调用onBind()返回客户端一个IBinder接口---一般用在远程service调用远程service调用Android各组件运行在不同的进程中,它们之间不能相互访问Android进程间实现相互通信轻量级实现方式ALDL RPC机制都是通过接口来实现的--远程进程调用RPC Remote Proecdure Call完成进程间通信--接口定义语言Android Interface Definition Language AIDL 生成两个进程间相互访问的代码客户端和被调用实现之间是通过代理模式来实现的代理类和被代理类实现同一接口即Ibinder接口步骤如下:-创建AIDL文件--与接口语法类似文件的扩展名是.aidl--文件中可以声明任意种方法方法可以带参数也可以带返回值--参数和返回值可以是任何类型--必须导入除内建类型外的任何类型具体规则---Java原始类型不需要导入---String List Map CharSequence不需要导入-实现AIDL文件生成的java接口--AIDL文件会生出一个和.aidl文件同名的java接口文件1。

Android_Service生命周期及用法

Android Service生命周期及用法!大伙儿好,上一节我讲解了Android Activity的生命周期,这一节我将讲解一下Service,第一咱们要明白Service具体是干什么的,何时用到和它的生命周期等。

Service概念及用途:Android中的效劳,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,若是咱们退出应历时,Service进程并无终止,它仍然在后台运行,那咱们何时会用到Service呢比如咱们播放音乐的时候,有可能想边听音乐边干些其他情形,当咱们退出播放音乐的应用,若是不用Service,我们就听不到歌了,因此这时就得用到Service了,又比如当咱们一个应用的数据是通过网络获取的,不同时刻(一段时刻)的数据是不同的这时咱们能够用Service在后台按时更新,而不用每打开应用的时候在去获取。

Service生命周期 :Android Service的生命周期并非像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方式,当咱们第一次启动Service时,前后挪用了onCreate(),onStart()这两个方式,当停止Service时,那么执行onDestroy()方式,那个地址需要注意的是,若是Service已经启动了,当咱们再次启动Service时,可不能在执行onCreate()方式,而是直接执行onStart()方式,具体的能够看下面的实例。

Service与Activity通信:Service后端的数据最终仍是要呈此刻前端Activity之上的,因为启动Service时,系统会从头开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL)这一节我不作过量描述,当咱们想获取启动的Service实例时,咱们能够用到bindService和onBindService方式,它们别离执行了Service中IBinder()和onUnbind()方式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档