Android基础_Service
一.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&¤t<=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的更多相关文章
- Android基础测试题(四)
看了前两道题大家有没有发现,测试题少了(一),大家猜猜测试题(一)是什么? Android基础测试题(四): 需求: 建一个方法,格式化输出2016-11-14 10:15:26格式的当前时间,然后截 ...
- Android基础测试题(二)
今天给大家带来的是Android基础测试题(二) 题目要求: 定义一个5位长度的整型数组并初始化,然后构建方法根据用户传入的数字判断是否存在数组中,如果存在,返回所在位置,如果不存在,返回-1 首先第 ...
- Mono.Android 基础
Mono.Android 基础 (地址) Mono.Android项目结构是 — Project + Assets + Resources + drawable + layout + values R ...
- 深入理解gradle编译-Android基础篇
深入理解gradle编译-Android基础篇 导读 Gradle基于Groovy的特定领域语言(DSL)编写的一种自动化建构工具,Groovy作为一种高级语言由Java代码实现,本文将对Gradle ...
- android基础---->JSON数据的解析
上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ...
- 基础4 Android基础
基础4 Android基础 1. Activity与Fragment的生命周期. Activity生命周期 打开应用 onCreate()->onStart()->onResume 按BA ...
- Android基础总结(8)——服务
服务(Service)是Android中实现程序后台运行的解决方案,它非常适合用于去执行哪些不需要和用户交互而且还要长期运行的任务.服务的运行不依赖任何用户界面,即使当程序被切换到后台,或者用户打开了 ...
- 【Xamarin开发 Android 系列 4】 Android 基础知识
原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...
- Android基础_web通信3
在Android基础_web通信2中,我运用的JSONObject是Android原生的json类,通过import org.json.JSONObject来导入. 还有另外一种更简单的方法,就是用G ...
随机推荐
- Shell编程之文本处理
cut 截取自定列 可以按照某个字符进行分割,然后取出其中的指定列: [root@iz8vbbqbnh4ug2q9so5jflz logs]# --.txt /Dec/::: +] - /Dec/:: ...
- 聊聊js中的typeof
内容: 1.typeof 2.值类型和引用类型 3.强制类型转换 typeof 官方文档:typeof 1.作用: 操作符返回一个字符串,指示未经计算的操作数的类型. 2.语法: typeof ope ...
- 青否云 - 小程序待办事项 wxapp开源系统
青否云最新开源系统:小程序待办事项 wxapp-demo 青否云 小程序 demo 下载地址:https://github.com/qingful/wxapp-demo 官网 http://cloud ...
- OC学习8——异常处理
1.和Java一样,OC也有自己的一套异常处理机制,不同的是,OC中的异常处理机制并不是作为常规的编程实践,通常只是作为一种程序调试.排错机制. 2.与Java中类似,OC中也是采用@try...@c ...
- 使用SplitContainer来实现隐藏窗口的部分内容(转)
有两种方法: (1) Splitter:比较老的方法 (2) SplitContainer:比较新的方法 最终界面如下: 方法一:使用Splitter实现 (1) 在窗口中添加一个Panel控件,即P ...
- xml文件生成方式一(字符串拼接,将多实体类对象写入xml文件)
1.xml文件生成,拼接字符串使用StringBuffer或StringBuilder 2.拼接好后写入文件即可,将多个实体类写入xml文件 3.这种方式比较简单,但是操作也比较麻烦 4.下面是我的代 ...
- [置顶]
Xamarin android 调用Web Api(ListView使用远程数据)
xamarin android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有这个疑问.xamarin android调用远程数据主要有两种方式: 在Android中保存数据或调用数 ...
- bzoj 3192: [JLOI2013]删除物品
Description 箱子再分配问题需要解决如下问题: (1)一共有N个物品,堆成M堆. (2)所有物品都是一样的,但是它们有不同的优先级. (3)你只能够移动某堆中位于顶端的物品. ( ...
- mkdir 命令详解
rmdir <man.linuxde.net> 作用: rmdir 命令用来创建目录,该命令创建由dirname 命名的目录.如果在目录名的前面没有添加任何路径名,则在当前目录下创建由d ...
- Web API系列之二WebApi基础框架搭建
本文主要介绍如何搭建一个WebApi的项目.关于如何搭建WebApi的方式一共有两种: 一.通过vs直接新建一个WebApi的项目,步骤如下: 第一步: 新建一个空的Web应用程序,可以理解为作为We ...