一.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. 深入理解计算机系统_3e 第四章家庭作业(部分) CS:APP3e chapter 4 homework

    4.52以后的题目中的代码大多是书上的,如需使用请联系 randy.bryant@cs.cmu.edu 更新:关于编译Y86-64中遇到的问题,可以参考一下CS:APP3e 深入理解计算机系统_3e ...

  2. 关于Idea中右边的maven projects窗口找不到了如何调出来

    关于Idea中右边的maven  projects窗口找不到了如何调出来? 具体的idea版本我不太清楚,我用的是2016版,其他版本应该也是一样的. 首先idea自带了maven控件,不像Eclip ...

  3. 【python】lambda创建匿名函数

  4. DataBase MongoDB高级知识-易使用

    MongoDB高级知识-易使用 mongodb是一个面向文档的数据库,而不是关系型数据库.不采用关系模型主要是为了获取更好的扩展性.当然还有其他的一些好处. 与关系型数据库相比,面向文档的数据库不再有 ...

  5. Java中的集合概述

    Java中的集合类有两个重要的分支,分别是接口Collection(包括List,Set等)和接口Map. 由于HashSet的内部实现原理使用了HashMap,所以我们先来了解Map集合类. 1.H ...

  6. android测试

    1.测试是否知道源代码: --黑盒测试 不知道代码 --白盒测试 知道源代码 2.按照测试粒度: --方法测试 --单元测试 Junit测试 --集成测试 --系统测试 3.按照测试暴力程度 --冒烟 ...

  7. 自定义bootstrap样式-9行样式自定义漂亮大气bootstrap导航栏

    有人说前端发展太快,框架太多,各有所需,各有所长.看看这幅图,估计都知道这些框架,但是大部分公司中实际要用到的也就那么几个. 发展再快,框架再多.还是得回到原点,不就是Html+Css+JavaScr ...

  8. java中可变长参数

    ** * Created by Lenovo on 2017/12/10. * java中可变长参数 */ public class reflect04 { //m1有一个int类型的可比变长参数 / ...

  9. UVA 10891 Game of Sum

    题目大意就是有一个整数串,有两个人轮流取,每次可以取走一个前缀或后缀.两人都足够聪明,且都会使自己收益最大.求取完后先手比后手多多少. 每次我看见上面那句就会深感自己的愚笨无知. 所以来推推性质? 1 ...

  10. bzoj 1492: [NOI2007]货币兑换Cash

    Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...