`

Android4开发入门经典 之 第五部分:Service

 
阅读更多

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代码:
  1. <manifest ... >  
  2. <application ... >  
  3. <service android:name=".ExampleService" />  
  4. </application>  
  5. </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代码:
  1. public class MyService1 extends IntentService{  
  2. private int num = 0;  
  3. //需要这个构造方法来向父类传name值  
  4. public MyService1() {  
  5. super("MyService1");  
  6. }  
  7. protected void onHandleIntent(Intent in) {  
  8. //这里实现service的工作  
  9. Log.i("MyService1","onHandleIntent=="+num++);  
  10. try {  
  11. Thread.sleep(2000L);  
  12. catch (InterruptedException e) {  
  13. e.printStackTrace();  
  14. }  
  15. }  
  16. }  
  17.    

继承Service示例


java代码:
  1. public class MyService extends Service{  
  2. public IBinder onBind(Intent arg0) {  
  3. return null;  
  4. }  
  5. public int onStartCommand(Intent intent, int flags, int startId) {  
  6. //这里实现要处理的功能,这样实现会阻塞主线程,还应该在这里重新创建线程来执行功能  
  7. for(int i=0;i<10;i++){  
  8. Log.i("MyService","onStartCommand----------->"+startId+",i="+i);  
  9. try {  
  10. Thread.sleep(1000L);  
  11. catch (InterruptedException e) {  
  12. e.printStackTrace();  
  13. }  
  14. }  
  15. return super.onStartCommand(intent, flags, startId);  
  16. }  
  17. }  
创建Bound Service有三种方法:扩展Binder类、使用Messenger对象、使用AIDL(Android Interface Definition Language)

扩展Binder类来实现 Bound Service示例


java代码:
  1. public class MyService2 extends Service {  
  2. //定义给客户端使用的Binder  
  3. private final IBinder mBinder = new LocalBinder();  
  4. public class LocalBinder extends Binder {  
  5. MyService2 getService() {  
  6. //返回当前实例给客户端,这样,客户端就可以操作服务的方法了  
  7. return MyService2.this;  
  8. }  
  9. }  
  10. public IBinder onBind(Intent intent) {  
  11. return mBinder;  
  12. }  
  13. //响应客户端的服务方法  
  14. public int getData() {  
  15. Log.i("MyService2","now get Data==");  
  16. return new Random().nextInt(100);  
  17. }  
  18. }  

使用Bound Service的Activity示例

1:要实现一个绑定连接的回调实现

java代码:
  1. private MyService2 ms = null;  
  2. private ServiceConnection mConnection = new ServiceConnection() {  
  3.       public void onServiceConnected(ComponentName className, IBinder service) {  
  4. //首先要强制造型  
  5. LocalBinder binder = (LocalBinder) service;  
  6. ms = binder.getService();  
  7. }  
  8. public void onServiceDisconnected(ComponentName arg0) { }  
  9. };  
2:绑定Service

java代码:
  1. Intent in = new Intent();  
  2. in.setClass(HelloWorldActivity.this, MyService2.class);  
  3. HelloWorldActivity.this.bindService(in, mConnection,  
  4. 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 方法
视频配套PPT,视频地址【 Android4开发入门经典独家视频课程
1
3
分享到:
评论
1 楼 kimifdw 2012-07-05  
一天一更新速度很快 如果能多点例子就好了

相关推荐

    Android开发入门经典

    第一部份 Android的入门基础 第二部份 Android应用核心基础知识 第三部份 理解Activity 第四部份 用户界面 第五部份 Service 第六部份 BroadCast Receiver 第七部份 数据存储 第八部份 数据库操作

    android开发入门与实战(下)

    第5章 千里之行始于足下——第一个应用HelloWorld 5.1 HelloWorld应用分析 5.1.1 新建一个Android工程 5.1.2 填写工程的信息 5.1.3 编程实现 5.1.4 运行项目 5.2 调试项目 5.2.1 设置断点 5.2.2 Debug项目 5.2.3 ...

    android一步一步最基础学习__新手

    第五讲:用户界面 View(一) FrameLayout, LinearLayout 第六讲:用户界面 View(二) AbsoluteLayout,RelativeLayout 第七讲:用户界面 View(三) TableLayout 第八讲:Intent入门指南 Intent 第九讲:用户...

    android开发入门与实战(上)

    第5章 千里之行始于足下——第一个应用HelloWorld 5.1 HelloWorld应用分析 5.1.1 新建一个Android工程 5.1.2 填写工程的信息 5.1.3 编程实现 5.1.4 运行项目 5.2 调试项目 5.2.1 设置断点 5.2.2 Debug项目 5.2.3 ...

    《Google Android开发入门与实战》.pdf

     本书内容上涵盖了用android开发的大部分场景,从android基础介绍、环境搭建、sdk介绍、market使用,到应用剖析、组件介绍、实例演示等方面。从技术实现上,讲解了5个android平台下的完整综合实例及源代码分析,...

    《Google Android开发入门与实战》

    第5章 千里之行始于足下——第一个应用HelloWorld 第7章 良好的学习开端——Android基本组件介绍之我的美丽我做主——Android中应用界面布局 第7章 良好的学习开端——Android基本组件介绍之不积跬步无以至千里——...

    Google.Android开发入门与实战

     《Android开发入门与实战》内容上涵盖了用Android开发的大部分场景,从Android基础介绍、环境搭建、SDK介绍、Market使用,到应用剖析、组件介绍、实例演示等方面。从技术实现上,讲解了5个Android平台下的完整综合...

    android开发入门教程

    第16章 Android综合案例五——手机信息查看助手 16.1 手机信息查看助手功能规划和可行性分析 16.1.1 手机信息查看助手功能规划 16.1.2 手机信息查看助手可行性分析 16.2 手机信息查看助手功能实现 16.2.1 手机信息...

    老罗android开发视频教程全集百度网盘下载

    【第一版第五章】老罗Android开发视频--解析JSON数据(4集) 【第一版第六章】老罗Android开发视频--服务器端JDBC编程(2集) 【第一版第七章】老罗Android开发视频--服务器端Web编程(6集) 【第一版第八章】...

    Android入门到精通源代码.

    第5章 Android中的视图组件 5.1 视图组件 5.1.1 图片视图(ImageView) 5.1.2 滚动视图(ScrollView) 5.1.3 网格视图(GridView) 5.1.4 列表视图(ListView) 5.1.5 切换图片(ImageSwitcher和Gallery) 5.1.6 ...

    Google Android开发入门与实战.part2.rar

    一次只能传15MB,书太大,分三部分,第二部分 共17章 1、初识android 2、搭建android开发环境 3、androidSDK介绍 4、android market及应用发布 5、第一个应用Hello World 6、android应用程序结构介绍 7、良好的学习...

    Google Android开发入门与实战.part3.rar

    一次只能传15MB,书太大,分三部分,第三部分 共17章 1、初识android 2、搭建android开发环境 3、androidSDK介绍 4、android market及应用发布 5、第一个应用Hello World 6、android应用程序结构介绍 7、良好的学习...

    Google Android开发入门与实战.part1.rar

    5、第一个应用Hello World 6、android应用程序结构介绍 7、良好的学习开端 8、android的数据存储操作 9、Internet和Broadcast面对面 10、Service应用实例 11、开发android应用的基本步骤 12、android综合案例一 13、...

    Android入门.doc

    3. 第一个 Android 应用程序的开发:HelloWorld 第一步:新建 Android 项目 第二步:启动 Android 模拟器 第三步:部署 HelloWorld 应用程序到模拟器并运行 增加一个按钮,按钮显示的文字是“世界,你好” 4. ...

    Android高薪之路:Android程序员面试宝典 李宁

    第5章 文件存储 5 1 SharedPreferences 5 2 流文件 5 3 XML存储 5 4 JSON存储 第6章 数据库 6 1 SQLite基础知识 6 2 SQLite 函数 6 2 1 核心函数 6 2 2 日期和时间函数 6 2 3 聚合函数 6 3 在Android中使用SQLite 6 ...

    Google Android开发入门与实战的代码

    Google Android开发入门与实战的代码 1章 掀起你的盖头来——初识Android. 1 1.1 认识Android 1 1.2 Android的背景 2 1.2.1 Android的历史 2 1.2.2 Android的发展 2 1.3 我的Android我做主 2 ...

    Android从入门到精通(明日科技著)第十五章源代码家庭理财通

    内容包括Android快速入门、Android模拟器与常用命令、用户界面设计、高级用户界面设计、基本程序单元Activity、Android应用核心Intent、Android事件处理、资源访问、图形图像处理技术、多媒体应用开发、Content ...

    Android 4.X手机/平板电脑程序设计入门、应用到精通_源代

    《Android 4.X手机/平板电脑程序设计入门、应用到精通(第2版)》9大特色: 丰富的Eclipse开发环境操作技巧,帮助初学者快速学会Eclipse的强大功能以及程序调试技术,同时讲解了很多程序编辑辅助功能,可大大提升...

    Google Android SDK开发范例大全(第3版) 4/5

    第5章 交互式通信服务与手机控制 5.1 具有正则表达式的TextView 5.2 ACTION!CALL!拨打电话 5.3 自制发送短信程序 5.4 自制发送E-mail程序 5.5 自制日历手机数据库 5.6 手机振动的节奏 5.7 图文可视化提醒 5.8 状态...

    新版Android开发教程.rar

    Android Android Android Android 开发入门 System System System System Requirements Requirements Requirements Requirements The sections below describe the system and software requirements for developing...

Global site tag (gtag.js) - Google Analytics