Service基本概念
Service是什么
是一种能在后台运行,不需要用户界面,用来执行需要长时间处理的组件。
Service的说明
1:它通常由其他组件启动,并在后台持久的运行,即使用户已经切换到其他的应用,它仍然可以继续在后台运行。
2:其他组件能够跟service绑定,甚至能进行跨进程的通讯(IPC:interprocess communication)
3:一个service通常用来执行:网络传输、音乐播放、文件I/O、或者是与content provider进行交互等等。当然所有的操作过程都在background。
Service的两种形式
1:Started
如果是其他应用组件通过调用startService()方法启动的service,就被称为“Started” Service。
一旦启动了Service,它就会在后台运行,即使启动它的组件已经被销毁了,Service仍然会继续运行。一般这种启动Service的操作是不需要返回值的,当Service完成工作后,它自己会停止运行。
2:Bound
如果是其他应用组件通过调用bindService()方法绑定的service,就被称为“bound” Service。
绑定Service提供了Client和Server之间的交互,也就是允许组件和Service进行交互,发送请求,获得返回值等。甚至能够实现跨进程的通讯(IPC)。
绑定Service和绑定它的组件的运行周期是一样的,多个组件可以绑定到同一个Service,当所有绑定它的组件都销毁了的时候,Service也就销毁了。
nService和进程、线程
要注意一点:一个Service是运行在主线程和它的宿主进程中的,Service不会创建它自己的线程,也不会运行在单独的进程中。
因此,如果Service要执行特别耗费CPU的工作,或者是其他导致阻塞的工作,最好在Service里面创建新的线程来执行这些工作,这样能避免典型的ANR(Application Not Response)错误。
Service和线程的使用建议
1:Service适用于在后台运行,不需要用户在界面上操作的功能。
2:Thread适用于你希望在应用之外执行一些功能,而且用户还需要操作界面,那么建议使用Thread;还有一种情况就是Service里面执行的工作特别耗费资源,容易引起主线程的阻塞,那么也建议使用线程。
Service基本的API-1
创建Service非常简单,写一个类继承Service,然后覆盖实现相应的回调方法即可,一些重要的回调方法如下:
1:onStartCommand():当其他组件启动Service的时候调用。当这个方法执行后,Service就启动起来在后台运行了。你可以调用stopSelf()或stopService()来停止Service。如果只是绑定服务,没有必要实现这个方法。
2:onBind():当其他组件绑定Service的时候调用。你必须提供一个接口给客户端,让它通过这个接口来和服务端通讯,通常会返回一个IBinder,你应该始终实现该方法,如果不用绑定的话,返回null。
3:onCreate():当Service第一次创建的时候由系统调用该方法。如果服务已经启动运行,将不会调用该方法。
4:onDestroy():当Service将要被销毁的时候调用该方法。你应该实现该方法来释放Service所使用的资源,比如:线程、注册的监听器、广播消息接受者等。
销毁Service
1:如果是通过其他组件调用startService()来创建的Service,需要调用stopSelf()或stopService()来停止Service
2:如果是绑定的Service,它会一直运行到所有绑定它的组件销毁后,由系统来销毁Service。
3:如果系统急需要资源,它会强行停止一些长时间运行,且运行级别较低的service,比如没有界面,在后台运行的某些service。
在manifest文件里面声明Service
要想使用Service,需要在manifest文件里面声明Service,比如:
java代码:
- <manifest ... >
- <application ... >
- <service android:name=".ExampleService" />
- </application>
- </manifest>
创建Started Service
创建Started Service
通常有两个类可以选择:
1:service:这是所有Service的父类。当你直接继承这个类的时候,要注意在Service里面创建一个新的线程来执行工作,因为Service是运行在主线程里面的,否则容易引起主线程阻塞。
2:IntentService:这是Service的一个子类,它使用一个Worker Thread来处理请求,通常继承它是一个好的实现方式。你需要实现onHandleIntent()方法。
IntentService完成的工作
1:创建一个Worker Thread来处理请求,与Main Thread区别开来。
2:创建一个工作队列,每次传递一个intent到onHandleIntent()方法,你无需担心多线程的问题
3:当所有的请求都被处理后,自动停止Service。
4:提供onBind()方法的默认实现,返回null
5:提供onStartCommand()方法的默认实现,来把请求分发到onHandleIntent()方法
使用IntentService示例
java代码:
- public class MyService1 extends IntentService{
- private int num = 0;
-
- public MyService1() {
- super("MyService1");
- }
- protected void onHandleIntent(Intent in) {
-
- Log.i("MyService1","onHandleIntent=="+num++);
- try {
- Thread.sleep(2000L);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
-
继承Service示例
java代码:
- public class MyService extends Service{
- public IBinder onBind(Intent arg0) {
- return null;
- }
- public int onStartCommand(Intent intent, int flags, int startId) {
-
- for(int i=0;i<10;i++){
- Log.i("MyService","onStartCommand----------->"+startId+",i="+i);
- try {
- Thread.sleep(1000L);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- return super.onStartCommand(intent, flags, startId);
- }
- }
创建Bound Service有三种方法:扩展Binder类、使用Messenger对象、使用AIDL(Android Interface Definition Language)
扩展Binder类来实现 Bound Service示例
java代码:
- public class MyService2 extends Service {
-
- private final IBinder mBinder = new LocalBinder();
- public class LocalBinder extends Binder {
- MyService2 getService() {
-
- return MyService2.this;
- }
- }
- public IBinder onBind(Intent intent) {
- return mBinder;
- }
-
- public int getData() {
- Log.i("MyService2","now get Data==");
- return new Random().nextInt(100);
- }
- }
使用Bound Service的Activity示例
1:要实现一个绑定连接的回调实现
java代码:
- private MyService2 ms = null;
- private ServiceConnection mConnection = new ServiceConnection() {
- public void onServiceConnected(ComponentName className, IBinder service) {
-
- LocalBinder binder = (LocalBinder) service;
- ms = binder.getService();
- }
- public void onServiceDisconnected(ComponentName arg0) { }
- };
2:绑定Service
java代码:
- Intent in = new Intent();
- in.setClass(HelloWorldActivity.this, MyService2.class);
- HelloWorldActivity.this.bindService(in, mConnection,
- HelloWorldActivity.this.BIND_AUTO_CREATE);
3:然后就可以调用Service提供的方法了
4:如果不想绑定这个服务了,可以使用unbindService方法
在Foreground运行Service
Foreground
某些时候,我们需要Service到前台来运行,这样它就能向用户提供很多用户关心的服务运行信息,而且不会被系统销毁掉。
在Foreground的Service必须在status bar提供notification,除非服务被停止或者服务重新回到后台运行。
startForeground 方法
要在Foreground运行service,只需要在Service中准备好相应的notification,方法和以前准备是一样的,只是最后调用的方法不是以前的mNotificationManager.notify方法,而是使用startForeground 方法
stopForeground 方法
要取消在Foreground运行service,可以调用stopForeground 方法
分享到:
相关推荐
“第五部分 Service”将讲解Service的定义及其作用,包括StartedService和Bound Service这两种形式,以及它们的API和生命周期。Service在Android中用于执行长时间运行的操作,而不提供用户界面。Service的生命周期...
《Android4开发入门经典》是一本专为初学者设计的指南,旨在帮助读者掌握Android 4(也称为Ice Cream Sandwich)平台的应用程序开发。这本书通过详细的笔记和分章节的PDF文档,逐步介绍了Android开发的基本概念和...
《Android开发入门与实战 第二版》是一本专为初学者设计的Android编程书籍,旨在帮助读者快速掌握Android应用开发的基础知识和实践技巧。书中涵盖了从安装开发环境到创建完整应用的全过程,提供了丰富的实例和源码,...
《Android应用开发入门经典(第二版)》是学习Android编程的经典教材,其源代码提供了丰富的实践案例和示例,帮助初学者深入理解Android应用开发的基本概念和技术。在这些压缩包的文件名中,我们可以看到一系列以...
在Android开发领域,入门与实践是提升技能的关键步骤。"Android开发入门与实践体验-光盘代码"提供了宝贵的资源,帮助初学者通过实际操作来学习Android应用开发。这本书的代码部分旨在让读者深入理解Android应用的...
在本资源中,我们聚焦于"Android开发从入门到精通"这一主题,特别是关于第9章的源码。这表明该压缩包包含了Android应用开发的一个关键章节的学习资料,特别是实战案例,这对于初学者和进阶者都极具价值。以下是根据...
4. **布局设计**: 使用XML文件创建UI布局是Android开发的重要部分,如线性布局、相对布局、网格布局等,学习如何合理布局以实现美观且用户友好的界面是关键。 5. **事件处理**: 学习如何监听用户操作,如点击按钮、...
在Android App开发领域,入门是每个开发者必经的阶段。这个"Android App开发入门范例程序"集合提供了多个章节的学习材料,旨在帮助新手快速掌握Android应用的基础开发技能。以下是各个章节和FlagAPI部分可能涉及的...
在Android开发领域,Google Android开发入门与实战是一本颇受欢迎的书籍,旨在引导初学者进入Android应用开发的世界。这本书由靳岩和姚尚朗合著,由人民邮电出版社出版,提供了丰富的实例和源代码来辅助学习。由于...
"Android开发入门与实战"是一个绝佳的学习平台,它包含了丰富的实践项目和源代码,旨在帮助你从零基础快速掌握Android应用开发的核心知识。这个压缩包很可能是这样一个集合,提供了27个精心设计的源代码示例,涵盖了...
《Android开发从入门到精通》是一本专门为Android编程新手量身打造的教程。这本书全面覆盖了Android开发的基础知识,旨在帮助读者快速掌握Android应用开发的核心技能。以下是对书中的主要知识点进行的详细解读: 1....
《Android开发从入门到精通源码》是一套全面解析Android应用开发的教程,涵盖了从基础知识到高级技巧的全过程。此教程分为两个部分,第一部分包括第2至6章,第二部分涵盖第7至12章,旨在帮助初学者快速掌握Android...
### Android应用开发入门教程知识点概览 #### 一、Android系统结构与SDK使用 ##### 1.1 系统介绍 - **Android** 是一个基于Linux内核的开放源代码移动操作系统,它由Google公司领导并支持。Android系统的设计目标...
以上只是《Android应用开发入门经典教程》中部分内容的概述,实际教程会更深入地探讨每个主题,通过实例和练习帮助读者巩固知识,真正掌握Android应用开发。如果你对Android开发感兴趣,这无疑是一份值得深入学习的...
《谷歌Android开发入门指南(第三版)》源代码是一份宝贵的学习资源,旨在帮助初学者深入理解Android应用程序的开发过程。这份源代码包含了书中各个章节的实例,涵盖了Android开发的基础到进阶内容,让读者可以通过...
这两部PDF教程,"Android开发入门教程"和"Android手机程序电子书开发",都是针对初学者精心编写的指南,旨在帮助他们快速理解和掌握Android应用开发的基础知识。 首先,"Android开发入门教程"可能涵盖了以下几个...
### Google Android 开发入门指南(第二版)知识点总结 #### 一、书籍基本信息与作者介绍 - **书名**:《Google Android 开发入门指南》第二版 - **作者**:Mark L. Murphy 编著;王世江 改编 - **出版时间**:2009...
"Android开发从入门到精通PPT"是一份详尽的教程资源,旨在帮助初学者快速理解并掌握Android应用开发的核心概念和技术。明日科技作为知名的IT教育机构,其提供的这套教程通常包含了丰富的理论讲解、实例演示和实践...