一.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. springboot 热部署 idea版本(转)

    spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用. devtool ...

  2. 10个最有用的 IntelliJ IDEA 插件

    IntelliJ IDEA鼓舞了许多Java开发人员编写插件,从J2EE到代码编辑工具再到游戏.现在,它拥有了一个强大的插件生态系统,超过1500可用的插件以及几乎每周都有新的插件出现.在这篇文章中, ...

  3. 肖秀荣8套卷2018pdf下载|2018肖秀荣冲刺8套卷pdf下载电子版

    肖秀荣8套卷2018pdf下载|2018肖秀荣冲刺8套卷pdf下载电子版 下载链接: https://u253469.ctfile.com/fs/253469-229815828

  4. 53、css补充

    css其余问题补充 一.默认的高度和宽度问题 1.父子都是块级元素 <!DOCTYPE html> <html> <head> <title>...&l ...

  5. 【NOIP模拟】【USACO】 Bovine Genomics

    Description 给定两个字符串集合A,B,均包含N个字符串,长度均为M,求一个最短的区间[l,r],使得不存在字符串\(a\in A,b\in B,\)且\(a[l,r]=b[l,r]\) , ...

  6. [array] leetcode - 48. Rotate Image - Medium

    leetcode - 48. Rotate Image - Medium descrition You are given an n x n 2D matrix representing an ima ...

  7. Winccflexable触摸屏的报警

    1.报警的分类 2.自定义报警分类 3.报警组成 4.Winccflexable中预定义的报警类别 5.报警的确认 6.WinccFlexable报警的显示 1)报警视图 2)报警窗口 3).报警指示 ...

  8. android中Log类的封装

    1.为了方便的使用Log打印日志,以及后续方便撤销日志打印,所以对Log类进行封装是一件好事. package market.phone; import android.util.Log; /** * ...

  9. 在Ubuntu14.04下安装 ffmpeg-2.4.13(处理视频用,将视频保存为图片序列)

    首先在 http://www.ffmpeg.org/olddownload.html 下载 ffmpeg-2.4.13.tar.bz2 : 然后安装 yasm 和 libx264: apt-get i ...

  10. Python下载一张图片与有道词典

    1.下载一张图片代码1 import urllib.request response = urllib.request.urlopen('http://photocdn.sohu.com/201009 ...