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 ...
随机推荐
- Java——标准异常
Throwable这个java类被用来表示任何可以作为异常被抛出的类,Throwable可以分为两种类型,Error用来表示编译时和系统错误,Exception是可以被抛出的基本类型. 1.Runti ...
- NodeJs小试牛刀--聊天室搭建
最近研究聊天室功能,准备用nodejs实现.下面是自己的尝试!! nodejs的安装这里就不详细赘述了. 程序创建 引入required模块 var express = require('expres ...
- 为什么双重检查锁模式需要 volatile ?
双重检查锁定(Double check locked)模式经常会出现在一些框架源码中,目的是为了延迟初始化变量.这个模式还可以用来创建单例.下面来看一个 Spring 中双重检查锁定的例子. 这个例子 ...
- (二十九)c#Winform自定义控件-文本框(二)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- 一、Ansible入门篇
一.Ansible简介 Ansible是一个自动化运维的工具 基于python语言编写,因此机器需要具备python环境. 通过ssh的连接方式进行自动化部署,ansible优先使用OpenSSH,在 ...
- 数据算法 --hadoop/spark数据处理技巧 --(13.朴素贝叶斯 14.情感分析)
十三.朴素贝叶斯 朴素贝叶斯是一个线性分类器.处理数值数据时,最好使用聚类技术(eg:K均值)和k-近邻方法,不过对于名字.符号.电子邮件和文本的分类,则最好使用概率方法,朴素贝叶斯就可以.在某些情况 ...
- H5对自定义属性的规定和添加获取自定义属性的方法
H5对自定义属性的规定和添加获取自定义属性的方法 元素属性那么多,如何区分是自带的属性还是默认的属性呢? H5规定自带的属性有个data- 前缀,如data-index="1" & ...
- mybatis+spring+springMVC处理org.springframework.beans.factory.BeanDefinitionStoreException:java.lang.IllegalArgumentException异常
java.lang.IllegalArgumentException异常有三种情况 org.springframework.beans.factory.BeanDefinitionStoreExcep ...
- 二阶段js 入门知识点 自我总结复习
二阶段自我总复习 1.javascript基础 : 客户端 安全性 跨平台 脚本语言 三大结构: 顺序 .选择.循环 顺序:运算符和表达式 ...
- java两个对象属性比较
两个对象进行比较相等,有两种做法: 1,情况一:当仅仅只是判断两个对象是否相等时,只需重写equals()方法即可.这里就不用说明 2.情况二:当除了情况一之外,还需知道是那个属性不同,那么就需要采用 ...