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的更多相关文章

  1. 入职小白随笔之Android四大组件——服务(Service)

    Service Android多线程编程 当我们在程序中执行一些耗时操作时,比如发起一条网络请求,考虑到网速等原因,服务器未必会立刻响应我们的请求,此时我们就需要将这些操作放在子线程中去运行,以防止主 ...

  2. Android 四大组件之二(Service)

    service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务 ...

  3. Android四大组件之服务-Service 原理和应用开发详解

    一.Android 服务简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟Acti ...

  4. [Android四大组件之二]——Service

    Service是Android中四大组件之一,在Android开发中起到非常重要的作用,它运行在后台,不与用户进行交互. 1.Service的继承关系: java.lang.Object → andr ...

  5. Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)

    转载于:http://blog.csdn.net/byxdaz/article/details/9708491 http://blog.csdn.net/q876266464/article/deta ...

  6. Android四大组件之一:Service(服务)

    Service跟Activity也是出于统一级别的组件,且与Activity的最大区别之一主要是没有人机界面,主要是运行在程序的后台(我是这么理解的),帮助文档上说的是运行于进程的主线程中,但是服务并 ...

  7. Android四大组件--服务(Service)

    1. startService和bindService的区别 1. startService: 生命周期: onCreate---onStartCommand---onDestory 与服务的通讯: ...

  8. Android 四大组件学习之Service六

    上几节.我们学习怎样用StartServer启动一个服务,用bindServer去绑定一个服务.以及服务的生命周期,以及什么是IntentService. 也许有读者会发现,我们BindServer中 ...

  9. Android 四大组件学习之Service五

    本节学习IntentService, 可能就有人问了. 什么是IntentService, IntentService有什么作用? 不是已经有了Service,那为什么还要引入IntentServic ...

随机推荐

  1. 阿里架构师浅析Java设计模式之虚拟代理模式

    虚拟代理模式(Virtual Proxy)是一种节省内存的技术,它建议创建那些占用大量内存或处理复杂的对象时,把创建这类对象推迟到使用它的时候.在特定的应用中,不同部分的功能由不同的对象组成,应用启动 ...

  2. tk.mybatis扩展通用接口

    一.tk.mybatis已经为我们封装好了许多拆箱即用的通用mapper,但在实际的项目开发中想必不少小伙伴在数据库设计中都会采用逻辑删除这种方案,再去使用通用的mapper接口就不行了.这时候就需要 ...

  3. JVM 栈帧之操作数栈与局部变量表

    目录 前置知识 引子 基于寄存器的设计模式 基于栈的设计模式 一个简单的例子 如何查看局部变量表? 实例方法中的局部变量表 结论 前置知识 阅读本文需要对以下知识有所了解: * 栈 * 汇编 * Ja ...

  4. 重学计算机网络(二) - 曾记否,查IP地址

    先献上几个梗 1.1.1.1 不是测试用的,原来一直没分配,现在被用来做一个DNS了,宣传是比谷歌等公司的dns服务 更保护用户隐私. IP地址255.255.255.255,代表有限广播,它的目标是 ...

  5. springboot + jedisCluster

    如果使用的是redis2.x,在项目中使用客户端分片(Shard)机制. 如果使用的是redis3.x中的集群,在项目中使用jedisCluster. 1.项目结构 2.pom.xml 1 <? ...

  6. SpringBoot:Java High Level REST Client 搜索 API

    Springboot整合最新版elasticSearch参考之前的文章:SpingBoot:整合ElasticSearch 7.2.0 Search API SearchRequest用于与搜索文档, ...

  7. bilibili弹幕爬取与比对分析

    最近受人之托研究了下b站的数据爬取做个小工具,最后朋友说不需要了,本着开源共享的原则,将研究成果与大家分享一波,话不多说直接上干货 需求分析 给定up主uid和用户uid,爬取用户在该up主所有视频中 ...

  8. .net core 单元测试之 JustMock第一篇

    前面介绍了单元测试的框架NUnit,它可以很好的帮助我们建立测试,检验我们的代码是否正确.但这还不够,有时候我们的业务比较重,会依赖其它的类.基于隔离测试的原则,我们不希望依赖的其它类影响到我们的测试 ...

  9. UVA 10395 素数筛

    Twin Primes Twin primes are pairs of primes of the form (p; p + 2). The term \twin prime" was c ...

  10. Java IO体系之File类浅析

    Java IO体系之File类浅析 一.File类介绍 位于java.io下的Java File类以抽象的方式代表文件名和目录路径名.该类主要用于文件和目录的创建.文件的查找和文件的删除等.File对 ...