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 ...
随机推荐
- springboot项目中的普通Session和使用redis存储session
普通session: session store type使用来存放session的存储方式,目前Spring boot中只支持Redis方式, 由于本应用暂无需将session放入redis的需求, ...
- JavaScript中一个方法同时发送两个ajax请求问题
今天在做项目中遇到一个问题,大概是在一个jsp页面同时有一个select下拉搜索条件框和一个Bootstrap表格展示列表.这两个都要通过ajax向后台拿数据,而且要在页面加载时完成.当时的做法是: ...
- 服务器小白的我,是如何将 node+mongodb 项目部署在服务器上并进行性能优化的
前言 本文讲解的是:做为前端开发人员,对服务器的了解还是小白的我,是如何一步步将 node+mongodb 项目部署在阿里云 centos 7.3 的服务器上,并进行性能优化,达到页面 1 秒内看到 ...
- HandlerMethodArgumentResolver(二):Map参数类型和固定参数类型【享学Spring MVC】
每篇一句 黄金的导电性最好,为什么电脑主板还是要用铜? 飞机最快,为什么还有人做火车? 清华大学最好,为什么还有人去普通学校? 因为资源都是有限的,我们现实生活中必须兼顾成本与产出的平衡 前言 上文 ...
- springboot报 org.thymeleaf.exceptions.TemplateInputException: Error resolving template "succeed";
--------------------- 本文转自 林晓风 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/Lin_xiaofeng/article/details/ ...
- Flutter学习笔记(25)--ListView实现上拉刷新下拉加载
如需转载,请注明出处:Flutter学习笔记(25)--ListView实现上拉刷新下拉加载 前面我们有写过ListView的使用:Flutter学习笔记(12)--列表组件,当列表的数据非常多时,需 ...
- Codeforces 975D
题意略. 思路:我们来写一下公式: P1:(x1 + t * Vx1,y1 + t * Vy1) P2:(x2 + t * Vx2,y2 + t * Vy2) x1 + ...
- Leetcode之深度优先搜索&回溯专题-491. 递增子序列(Increasing Subsequences)
Leetcode之深度优先搜索&回溯专题-491. 递增子序列(Increasing Subsequences) 深度优先搜索的解题详细介绍,点击 给定一个整型数组, 你的任务是找到所有该数组 ...
- I-Just Jump_2019牛客暑期多校训练营(第八场)
题目链接 Just Jump 题意 有L+1个点,初始在第0个点上,要跳到第L个点,每次至少跳d格,也就是在点x至少要跳到x+d,且有m个限制 \((t_i, p_i)\)指跳第\(t_i\)次不能跳 ...
- E-MAZE_2019牛客暑期多校训练营(第二场)
题意 给出n行m列的迷宫0可走1不可走,有两个操作,操作1变换点(a,b)的值,操作2查询(1,a)到(n,b)的方案数 题解 设\(F[i][j]\)为第i-1行到达第i行第j列的方案数,若点\(( ...