一.service的用途

1.1 一种是执行长时间运行的耗时操做

1.如网络下载、音乐播放
2.文件系统监控等

1.2 另一种是负责组件间的交互

1.将某些功能以Service组件形式封装,然后提供给其他组件调用

二.Service的生命周期

Service不能自己启动,必须由其他应用组件来调用
根据调用方式不同,分为两种运行模式:
运行模式不同,其生命周期也不同

启动模式                                                  绑定模式

2.1启动模式下的service,代码如下

创建启动模式运行的Service组件:

创建Service类,继承android.app.Service类
在Service类中实现onStartCommand等生命周期方法
在AndroidManifest.xml文件中配置Service组件

public class MyFirstService extends Service {

    @Override
public void onCreate() {
super.onCreate();
Log.i("First Service","First Service Create");
} //启动模式下,服务在onStartCommand方法中实现
MediaPlayer mp;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("First Service","First Service Running,"+intent.getStringExtra("message"));
if(mp==null) {
mp = new MediaPlayer();
}
mp.reset();
String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/nobody.mp3";
try {
mp.setDataSource(path);
mp.prepare();
mp.start();
} catch (IOException e) {
e.printStackTrace();
}
return START_NOT_STICKY;
} @Override
public void onDestroy() {
super.onDestroy();
Log.i("First Service","First Service Destroy");
if(mp!=null){
mp.stop();
mp.release();
mp=null;
}
//Intent intent=new Intent(this,MyFirstService.class);
//startService(intent);
} @Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
<!--配置服务-->
<service
android:label="Android系统服务"
android:enabled="true"
android:exported="true"
android:name="com.example.service.MyFirstService"/>

主要业务逻辑在onStartCommand方法中实现,该方法的返回值决定了不同的Service运行模式
START_NOT_STICKY:在Service意外被终止后将停止。适用场景:网上下载数据
START_REDELIVER_INTENT:在Service意外被终止后将停止将自动重新运行并保证Intent被处理。适用场景:关键业务处理
START_STICKY:确保Service一直保持启动状态,但不保证Intent执行。适用场景:后台播放音乐

2.1.1 IntentService代码如下

Service组件经常涉及多线程以及同步问题
使用IntentService帮助开发人员解决多线程同步问题
会创建一个工作队列,每次将一个Intent传递到onHandleIntent()方法,无需担心多线程同步问题。

创建启动模式运行的IntentService组件:

创建IntentService类,继承import android.app.IntentService;类
在Service类中重写MyIntentService方法
在AndroidManifest.xml文件中配置MyIntentService组件

public class MyIntentService extends IntentService {

    public MyIntentService() {
super("MyIntentService");
}
public MyIntentService(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent intent) {
for(int i=1;i<=100;i++){
Log.i("Intent Service","i="+i);
SystemClock.sleep(100);
}
}
<service
android:name="com.example.service.MyIntentService"/>

2.1绑定模式下的service,代码如下

创建Service类,继承android.app.Service类
在Service类中实现一个内部类,它继承Binder类。并在Service类的onBind()生命方法中返回该内部类对象
在AndroidManifest.xml文件中配置Service组件

public class MyBindService extends Service {

    /**
* 这是一个重点方法,返回调用对象一个Binder对象用来调用已经定义好的服务
* @param intent
* @return
*/
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i("MyBindService","MyBindService Bind");
return new MyBinder();
} //定义一个IBinder的实现类,在该类中实现一些具体的服务方法
public class MyBinder extends Binder{
public MediaPlayer mp;
public int current=0;
public double sum(double n1,double n2){
return n1+n2;
} public void playMusic(String path){
if(mp!=null)
return;
mp=new MediaPlayer();
try {
mp.reset();
mp.setDataSource(path);
mp.prepare();
mp.start(); new Thread(new Runnable() {
@Override
public void run() {
while (mp!=null&&current<=mp.getDuration()){
current=mp.getCurrentPosition();
SystemClock.sleep(200);
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void stopMusic(){
if(mp!=null){
mp.stop();
mp.release();
mp=null;
}
} } //取消Service组件的绑定
@Override
public boolean onUnbind(Intent intent) {
Log.i("MyBindService","MyBindService unBind");
return super.onUnbind(intent);
} @Override
public void onCreate() {
super.onCreate();
Log.i("MyBindService","MyBindService Create");
} @Override
public void onDestroy() {
super.onDestroy();
Log.i("MyBindService","MyBindService Destroy");
}
<service
android:name="com.example.service.MyBindService"/>

Android基础_Service的更多相关文章

  1. Android基础测试题(四)

    看了前两道题大家有没有发现,测试题少了(一),大家猜猜测试题(一)是什么? Android基础测试题(四): 需求: 建一个方法,格式化输出2016-11-14 10:15:26格式的当前时间,然后截 ...

  2. Android基础测试题(二)

    今天给大家带来的是Android基础测试题(二) 题目要求: 定义一个5位长度的整型数组并初始化,然后构建方法根据用户传入的数字判断是否存在数组中,如果存在,返回所在位置,如果不存在,返回-1 首先第 ...

  3. Mono.Android 基础

    Mono.Android 基础 (地址) Mono.Android项目结构是 — Project + Assets + Resources + drawable + layout + values R ...

  4. 深入理解gradle编译-Android基础篇

    深入理解gradle编译-Android基础篇 导读 Gradle基于Groovy的特定领域语言(DSL)编写的一种自动化建构工具,Groovy作为一种高级语言由Java代码实现,本文将对Gradle ...

  5. android基础---->JSON数据的解析

    上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ...

  6. 基础4 Android基础

    基础4 Android基础 1. Activity与Fragment的生命周期. Activity生命周期 打开应用 onCreate()->onStart()->onResume 按BA ...

  7. Android基础总结(8)——服务

    服务(Service)是Android中实现程序后台运行的解决方案,它非常适合用于去执行哪些不需要和用户交互而且还要长期运行的任务.服务的运行不依赖任何用户界面,即使当程序被切换到后台,或者用户打开了 ...

  8. 【Xamarin开发 Android 系列 4】 Android 基础知识

    原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...

  9. Android基础_web通信3

    在Android基础_web通信2中,我运用的JSONObject是Android原生的json类,通过import org.json.JSONObject来导入. 还有另外一种更简单的方法,就是用G ...

随机推荐

  1. git忽略文件

    .gitignore文件配置 ###################### # Project Specific ###################### /src/main/webapp/dis ...

  2. Unity优化之GC——合理优化Unity的GC

      转载请标明出处http://www.cnblogs.com/zblade/ 最近有点繁忙,白天干活晚上抽空写点翻译,还要运动,所以翻译工作进行的有点缓慢 =.= PS: 最近重新回来更新了一遍,文 ...

  3. iOS 多线程 之 GCD(大中枢派发)(一)

    导语: 本文个人原创,转载请注明出处(http://www.cnblogs.com/pretty-guy/p/8126981.html) 在iOS开发中多线程操作通常是一下3种,本文着重介绍Dispa ...

  4. 老生常谈之Block

    前面有一篇介绍Block的博客,主要介绍了Block的简单使用技巧.这篇博客主要更加深入地了解一下Block.包括:Block的实现.__Block的原理以及Block的存储域三方面. Block的实 ...

  5. 【JS】数据类型

    其他类型转化为boolean类型规则: number:非0为true,0和NaN为false: String:非空为true,空为false: Object:任何对象都为true 任何变量赋值为nul ...

  6. 【java】ArrayList、Iterator用法

    package com.tn.collect; import java.util.ArrayList; import java.util.Iterator; class Product{ public ...

  7. 小白的Python之路 day4 装饰器高潮

    首先装饰器实现的条件: 高阶函数+嵌套函数 =>装饰器 1.首先,我们先定义一个高级函数,去装饰test1函数,得不到我们想要的操作方式 import time #定义高阶函数 def deco ...

  8. 正则表达式 cheat sheet

  9. Java面试题汇总

    第一阶段:三年我认为三年对于程序员来说是第一个门槛,这个阶段将会淘汰掉一批不适合写代码的人.这一阶段,我们走出校园,迈入社会,成为一名程序员,正式从书本 上的内容迈向真正的企业级开发.我们知道如何团队 ...

  10. java 异常处理与返回

    try{ // 1. return ++x; }catch(){ }finally{ //2. x++; } 实际返回值还是 ++x后的结果,因为 ++x 后 x 的值会入栈,作为返回结果: 以上代码 ...