http://express.ruanko.com/ruanko-express_22/webpage/tech-overnight_1.html
Android中的Service,其意思是“服务”,它是在后台运行,不可交互的。Service自己不能运行,需要通过某一个Activity或者其它Context对象来调用,如Context.startService()和Context.bindService()两种方式启动Service。
如果在Service的onCreate或者onStart方法中做一些很耗时的动作,最好是启动一个新线程来运行这个Service,因为,如果Service运行在主线程中,会影响到程序的UI操作或者阻塞主线程中的其它事情。
一个使用Service的典型的例子是,用户一边在手机做其他的事情,一边听手机上的音乐。其中,在后台播放音乐就可以使用Service来实现。在这个应用中,音乐播放这个功能并没有对应的Activity,因为使用者会认为在导航到其他屏幕时,音乐应该还在播放。
Service的生命周期方法比Activity要少一些,只有onCreate、onStart、onDestroy。有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。
1)通过startService启动
Service启动的时候会经历生成 开始(onCreateonStart)过程,Service停止的时候直接进入销毁过程(onDestroy)。而如果是调用者直接退出而没有调用stopService,Service会一直在后台运行。直到下次调用者再启动起来,并明确调用stopService。
2)通过bindServic启动
通过bindService方法启动Service,其只会运行onCreate方法,如果调用这退出了,Service会调用onUnbind onDestroyed方法。
Service的onCreate方法只会被调用一次。如果先绑定了,那么启动的时候就直接运行Service的onStart方法,如果先启动,那么绑定的时候就直接运行onBind方法。如果先绑定上了,就停止不了,也就是stopService不能用了,只能先unbindService,再stopService,所以,先启动还是先绑定,是有区别的。
下面以一个通过Service来播放音乐的例子说明Service的具体用法,其具体界面如下所示:
在这个界面中,点击“Start Playing”按钮,即开始打开音乐文件,进行循环播放。点击“Stop Playing”按钮,即关闭音乐,并退出应用程序。其程序结构如下图所示:
可以看到,其功能主要由Music与TestMusicService两个类组成,其源代码如下:
package com.shen.service;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class TestMusicService extends Activity {
private TextView tv;
private Button btn1,btn2;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn1 = (Button) this.findViewById(R.id.btn1);
btn1.setOnClickListener(new ButtonListener1());
btn2 = (Button) this.findViewById(R.id.btn2);
btn2.setOnClickListener(new ButtonListener2());
}
private class ButtonListener1 implements OnClickListener{
public void onClick(View v) {
TestMusicService.this.startService(new Intent("com.shen.music1"));
}
}
private class ButtonListener2 implements OnClickListener{
public void onClick(View v) {
TestMusicService.this.stopService(new Intent("com.shen.music1"));
finish();
}
}
}
package com.shen.service;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
public class Music extends Service {
private MediaPlayer mp;
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
public void onStart (Intent intent, int startId) {
super.onStart(intent, startId);
if (mp != null){
mp.stop();
}
mp = MediaPlayer.create(this,R.raw.music_1);
mp.setLooping(true);
mp.start();
}
public void onDestroy () {
super.onDestroy();
mp.stop();
mp = null;
}
}
另外,需要在Manifest.xml文件中对Service进行注册。其注册信息如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.shen.service"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".TestMusicService"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".Music">
<intent-filter>
<action android:name="com.shen.music1"/>
<category android:name="android.intent.category.default"/>
</intent-filter>
</service>
</application>
<uses-sdk android:minSdkVersion="2" />
</manifest>
分享到:
相关推荐
Android下Service组件的简单使用,具体可以参见博客:http://www.cnblogs.com/plokmju/p/Android_Service1.html
第6章 Android组件之间的信使Intent Android 组件之间的信使Intent,讲述了Intent对象及其属性、Intent的实现策略和Intent的常见应用 第7章 Android Service组件 Android Service组件,讲述了Android中的后台服务...
第二篇 技术篇第6章 Android组件之间的信使IntentAndroid 组件之间的信使Intent,讲述了Intent对象及其属性、Intent的实现策略和Intent的常见应用 第7章 Android Service组件Android Service组件,讲述了...
这是Android开发与应用,原书配套的课件,作者张荣,目录如下。 第1章 Android简介 1.1 手机操作系统 1.2 Android起源 1.3 Android特征 1.4 Android体系结构 1.4.1 应用层 1.4.2 应用框架层 1.4.3 ...
Android一个重要并且特殊的特性就是,一个应用的进程的生命周期不是由应用自身直接控制的,而是由系统,根据运行中的应用的一些特征来决定的,包括:这些应用对用户的重要性、系统的全部可用内存。 对于应用...
作为使用androidsdk构建这些应用程序的实用指南书籍,《android高级编程》从始至终穿插了一系列示例项目,每个项目都引入android的新功能和新技术,以助您达到最圆满的学习效果。书中介绍android的所有基本功能,并...
Android四大组件简述demo用例。
Android核心分析(23)----Andoird GDI之基本原理及其总体框架 Android核心分析(24)----Android GDI之显示缓冲管理 Android核心分析(25)----Android GDI之共享缓冲区机制 Android核心分析(26)----Android GDI...
1.2.2 android应用开发 8 1.2.3 android系统开发 9 1.3 android的sdk与源代码 10 1.3.1 基于sdk的android开发 10 1.3.2 基于源代码sdk android开发 11 第2章 android系统开发综述 13 2.1 android的系统架构 13 2.1.1...
关于startService的基本使用概述及其生命周期可参见《Android中startService基本使用方法概述》。 本文通过播放背景音乐的简单示例,演示startService的基本使用流程,具体内容如下 系统界面如下: 界面上面就两...
在内容上,《Android系统源代码情景分析(含CD光盘1张)》结合使用情景,全面、深入、细致地分析了Android系统的源代码,涉及到Linux内核层、硬件抽象层(HAL)、运行时库层(Runtime)、应用程序框架层...
主要介绍了Android系统中Service和IntentService的区别,与普通的服务相比,IntentService可以开启单独的线程来处理intent请求,需要的朋友可以参考下
第13章“Android应用程序概述及框架”,介绍Android应用程序层的基本概念和应用程序框架,这部分内容是Android自下而上的第4个层次,可以基于源代码或者SDK开发,它们之间的差别非常小。 第14章“Android应用...
Android 之 AIDL 和远程 Service 调用 Android 相对布局技巧 android开发环境之Logcat(日志)教程实例汇总 android网络通信之socket教程实例汇总 AsyncTask进度条加载网站数据到ListView 命令行开发、编译、打包...
1.通过本课程设计的实践及其前后的准备与总结,复习、领会、巩固和运用课堂上所学的Android手机应用开发知识。 2.为学生综合应用本专业所学习的多门课程知识(例如,软件工程、数据库、Java语言、Java Web开发等)...
生应用如:G oogle 地图及其衍生应用、 GMail 、 GTalk 等。 � GPS 卫星导航功能,手机照相, MP3 ,蓝芽等均被列为 Android 所提供支持的基本选项。 � Android 的平台基本上是免费的,虽然有部份原生链接库会...
Android核心分析(23)----Andoird GDI之基本原理及其总体框架 Android核心分析(24)----Android GDI之显示缓冲管理 Android核心分析(25)----Android GDI之共享缓冲区机制 Android核心分析(26)----Android GDI...