Android四大组件初识之Service
Service作为Android四大组件之一,可以与Activity建立双向连接(绑定模式),提供数据和功能。也能够接收Intent单方面请求(调用模式),进行数据处理和调度功能。
Service与Activity一样运行在主线程(UI线程),所以在Service中执行耗时操作,可能会造成Activity不能及时响应用户的交互请求,然后程序就被系统干掉啦。
个人看法 四大组件都是运行在主线程里面,应该有一个消息循环在调度。不同的操作,不同的消息。例开启一个Service,对应消息的处理,可能是new 一个Service然后调用onCreate、onStartCommand等。一个消息处理完,又返回消息循环处理下一个消息。至于消息可以用队列存储。
生命周期
Service只有在一开始创建实例的时候执行onCreate,后面所有的请求,无论是调用模式还是绑定模式都是在该实例里面处理。Service实例创建后只有两种销毁的方法,系统回收或者显示执行了stopService方法。在Service销毁的时候调用onDestroy。
调用模式
通过Context.startService请求一个Service的方式,称为调用模式。该方式Context就打个招呼,告诉Service该做事情了。Service的实例收到请求就调用自己的onStartCommand方法。
1、使用Intent确定请求的Service,然后startService。

2、Service主要是onCreate初始化,onStartCommand执行动作,或者发送一个开始的消息(Handler机制)。
代码
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log; public class StickyService extends Service {
private int callsum=0; public StickyService() {
}
@Override
public void onCreate() {
super.onCreate();
callsum++;
Log.d("StickyService","..............onCreate callSum="+callsum);
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
callsum++;
Log.d("StickyService","..............onStartCommand callSum="+callsum);
return START_STICKY;
} @Override
public void onDestroy() {
super.onDestroy();
callsum++;
Log.d("StickyService","..............onDestroy callSum="+callsum);
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
为了验证Service一直只有一个实例,用一个int变量callSum做访问统计。结果如下。

onStartCommand要求返回一个标志,有三种标志START_REDELIVER_INTENT、START_STICKY、START_NOT_STICKY。三种标志代表的是系统在内存不足回收该Service之后不同的操作模式。
l START_STICKY在回收之后,一旦系统有充足的资源便要重新创建该Service的实例,并且调用onStartCommand,intent为null。此模式除非显示调用stopService,不然它就“不死”。
l START_REDELIVER_INTENT操作相同,但是intent值为给Service收到的最后一个请求intent。这个模式关注的是每个intent的处理,用来确保每个intent的请求都能完成。
l START_NOT_STICKY说明系统可以无条件回收,也不用重新创建Service的实例。一般用于长期运行的Service,在onStartCommand中可以创建定时任务来唤醒自己。
绑定模式
在Activity和Service之间可以使用绑定模式。调用bindService,发送一个bind请求。如果bind成功,activity可以获得Service一个内部类(自己定义的)的引用,内部类可以访问Service所有的方法和属性。这样就建立一个连接。绑定模式不调用onStartCommand,调用onBind,解绑调用onUnBind.
Service代码
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.util.Log; public class BindService extends Service {
public BindService() {
}
@Override
public Binder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return new TBinder();
}
@Override
public boolean onUnbind(Intent intent) {
return false;
}
@Override
public void onCreate() {
super.onCreate();
Log.d("BindService",".................... onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("BindService","....................onStartCommand");
return START_NOT_STICKY;
}
//创建一个Binder的子类。TBinder是一个内部类,可以访问Service的所有属性和方法。
public class TBinder extends Binder {
public String printServiceName(){
return "BindService";
}
}
}
Activity代码
void onBindSer(){
Intent intent =new Intent(MainActivity.this,BindService.class);
intentList.add(intent);
/**
* sc为绑定成功或者失败之后的回调
* flag=BIND_AUTO_CREATE表示创建一个Service
*/
bindService(intent,sc,BIND_AUTO_CREATE);
}
//创建服务绑定的回调接口对象
ServiceConnection sc=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//传入参数很明显了,一个是组件名,一个是IBinder
Log.d("MainActivity",componentName+" bind success");
BindService.TBinder binder=(BindService.TBinder)iBinder;
Log.d("MainActivity","serviceName = "+binder.printServiceName());
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.d("MainActivity",componentName+" bind failed ");
}
};
日志输出

Android四大组件初识之Service的更多相关文章
- 入职小白随笔之Android四大组件——服务(Service)
Service Android多线程编程 当我们在程序中执行一些耗时操作时,比如发起一条网络请求,考虑到网速等原因,服务器未必会立刻响应我们的请求,此时我们就需要将这些操作放在子线程中去运行,以防止主 ...
- Android 四大组件之二(Service)
service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务 ...
- Android四大组件之服务-Service 原理和应用开发详解
一.Android 服务简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟Acti ...
- [Android四大组件之二]——Service
Service是Android中四大组件之一,在Android开发中起到非常重要的作用,它运行在后台,不与用户进行交互. 1.Service的继承关系: java.lang.Object → andr ...
- Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)
转载于:http://blog.csdn.net/byxdaz/article/details/9708491 http://blog.csdn.net/q876266464/article/deta ...
- Android四大组件之一:Service(服务)
Service跟Activity也是出于统一级别的组件,且与Activity的最大区别之一主要是没有人机界面,主要是运行在程序的后台(我是这么理解的),帮助文档上说的是运行于进程的主线程中,但是服务并 ...
- Android四大组件--服务(Service)
1. startService和bindService的区别 1. startService: 生命周期: onCreate---onStartCommand---onDestory 与服务的通讯: ...
- Android 四大组件学习之Service六
上几节.我们学习怎样用StartServer启动一个服务,用bindServer去绑定一个服务.以及服务的生命周期,以及什么是IntentService. 也许有读者会发现,我们BindServer中 ...
- Android 四大组件学习之Service五
本节学习IntentService, 可能就有人问了. 什么是IntentService, IntentService有什么作用? 不是已经有了Service,那为什么还要引入IntentServic ...
随机推荐
- 利用DoHome APP和音箱控制LED灯实验参考步骤
准备材料: Arduino Uno 一块 Arduino 扩展板 购买链接 DT-06模块一个 购买链接 安卓手机一个 小度音箱一个 小灯珠一个 杜邦线若干 1.DT-06固 ...
- java后端_百度一面
参考: https://www.nowcoder.com/discuss/215891?type=2&order=0&pos=10&page=1 1.会啥框架.不会. 2.锁的 ...
- ES6中比较实用的几个特性
1.Default Parameters(默认参数) in ES6 es6之前,定义默认参数的方法是在一个方法内部定义 var link = function (height, color, url) ...
- CSV Data Set Config 拓展开发
1.目的 在日常的性能测试项目中,经常会遇到参数化的问题,我们所熟知的LR工具对参数化支持非常友好,然而JMeter相对逊色一些.大家都知道在使用JMeter工具参数化时常用CSV Data Set ...
- Alfred上可提高工作效率的Workflow推荐
温馨提示:本文中Alfred是Mac平台的工具,不适用于其他平台. Alfred是Mac平台上被很多人吹爆的一款效率提升软件,我刚毕业工作的时候就看到公司内网有人推荐,但没有尝试. 后来我跳槽后自己买 ...
- 重读《学习JavaScript数据结构与算法-第三版》- 第5章 队列
定场诗 马瘦毛长蹄子肥,儿子偷爹不算贼,瞎大爷娶个瞎大奶奶,老两口过了多半辈,谁也没看见谁! 前言 本章为重读<学习JavaScript数据结构与算法-第三版>的系列文章,主要讲述队列数据 ...
- Go-json解码到结构体-踩坑
package main import ( "encoding/json" "fmt" ) type User struct { Name string `js ...
- python实现RSA加密和签名以及分段加解密的方案
1.前言 很多朋友在工作中,会遇到一些接口使用RSA加密和签名来处理的请求参数,那么遇到这个问题的时候,第一时间当然是找开发要加解密的方法,但是开发给加解密代码,大多数情况都是java,c++,js等 ...
- jQuery实现发送验证码30s倒计时,且刷新页面时有效
在这里讲一讲这个案例的实现思路吧(个人见解)..核心思想:为防止页面刷新时倒计时失效的解决方案是:当每次刷新一次页面时都执行一个函数 即下面讲到的 setStyle() 函数.这个函数会根据当前的 c ...
- 基本图像操作和处理(python)
基本图像操作和处理(python) PIL提供了通用的图像处理功能,以及大量的基本图像操作,如图像缩放.裁剪.旋转.颜色转换等. Matplotlib提供了强大的绘图功能,其下的pylab/pyplo ...