android四大组件之Service和子类IntentService

2024-02-09 13:18

本文主要是介绍android四大组件之Service和子类IntentService,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

四大组件中, Service跟Activity的生命周期非常类似,它也是可执行的.甚至可看做是没有界面的"Activity", 因为它的运行,用户并不会像Activity那样能看到它能呈现出来具体的视图界面. 同样,就像Activity一样, 需要继承Service来使用它的子类. 并且同样需要在AndroidManifest.xml中配置所定义的Service.


Service的生命周期


简述上面周期中的几个方法:

1, 如图示,Service 的几个方法onCreate(), onDestroy()是跟Activity一样的,都是创建和销毁前回调的方法.Service在Activity里被创建启动和停止, 也可以在自身使用stopSelf()来停止.


2, onStart() 在新版本已经被onStartCommand()所代替,如果是应用支持旧版本的系统,则继续用onStart().  onStart(0 和onStartCommand() 都是Service启动时会回调的方法. 如果是通过startService()来启动Service,那么每次启动都会回调onStartCommand() 这个方法.


3, onBind(), Service被绑定时回调的方法. 


4, onUnbind(), Service和所绑定的所有Activity都断开时会回调该方法.


这里要强调下Activity启动Service的两种方法和区别:

Activity可以通过startService() 和 bindService() 两个方法来启动. startService()启动Service, Activity和Service之间没有关联, 当Activity退出了,Service会继续存在并运行. 而bindService() 方式启动的话,Activity和Service是有关联的,Activity不仅能和Service通信,并且当Activity退出时,Service也会中止.下面会上个例子,通过代码看出区别:


配置方式

<Service android:name="com.test.service.MyBindService"><intent-filter><!-- 配置action就能像广播一样,通过action启动指定的Service --><action android:name="com.test.com.test.service.My_MSG"></intent-filter>
</Service>


新建两个Service:

*** 通过StartService()来启动的Service对象* @author Mr.Et**/
public class MyStartService extends Service{private String TAG = "MyStartService";@Overridepublic void onCreate(){Log.i(TAG, "onCreate()");super.onCreate();}/*** Service被启动后会回调该方法*/@Overridepublic int onStartCommand(Intent intent,int flags,int startId){Log.i(TAG, "onStartCommand()");super.onStartCommand(intent, flags, startId);return START_STICKY;}/*** (该方法必须被实现)* 绑定Service时会回调该方法*/@Overridepublic IBinder onBind(Intent intent) {//这里默认为空,如果需要传回Binder对象跟Activity通信//则可以继承Binder来实现返回对象即可.Log.i(TAG, "onBind()");return null;}@Overridepublic void onDestroy(){super.onDestroy();Log.i(TAG, "onDestroy()");}}

/*** 通过bindService()来启动的Service对象* @author Mr.Et**/
public class MyBindService extends Service{private String TAG = "MyBindService";public class MyBinder extends Binder{public void printContent(){Log.i(TAG, "print the content in Class - MyBinder.");}}/*** Service被创建是会回调该方法*/@Overridepublic void onCreate(){Log.i(TAG, "onCreate()");super.onCreate();}/*** Service被启动后会回调该方法*/@Overridepublic int onStartCommand(Intent intent,int flags,int startId){Log.i(TAG, "onStartCommand()");super.onStartCommand(intent, flags, startId);return START_STICKY;}/*** 绑定Service时会回调该方法*/@Overridepublic IBinder onBind(Intent intent) {Log.i(TAG, "onBind()");// 返回Binder的子类MyBinder和Activity通信return new MyBinder();}/*** 如果前面是通过bindService()来绑定启动Service的,* 那么当解绑停止Service时会调用该方法*/@Overridepublic boolean onUnbind(Intent intent){Log.i(TAG, "onUnbind()");return true;}/*** Service被销毁前会回调该方法*/@Overridepublic void onDestroy(){Log.i(TAG, "onDestroy()");super.onDestroy();}}

启动Service的方法

第一种,startService()启动Service

Intent StartIntent = new Intent(this,MyStartService.class);/*** 通过startService()启动Service* 这种方式*/private void doStartService(){	//类似广播,也可以用setAction("XXX")使特定的Service启动//StartIntent.setAction("com.test.service.My_MSG");//创建Intent,跟跳转Activity的方式类似Intent StartIntent = new Intent(this,MyStartService.class);startService(StartIntent);}/*** 停止Service*/private void doStopService(){stopService(StartIntent);}

第二种,bindService()启动(绑定)Service

private MyBinder myBinder;private ServiceConnection conn = new ServiceConnection() {//当Activity和Service连接成功时会调用该方法@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stub//在这里通过自定义的Binder与Service通信myBinder = (MyBinder)service;}//当Activity和Service断开连接时会调用该方法@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stub}};/*** 通过bindService()启动(绑定)Service*/private void doBindSerive(){Intent bindIntent = new Intent();bindIntent.setAction("com.test.service.My_MSG");//当Service还没创建时,//第三个参数如果为0则不自动创建Service,为Service.BIND_AUTO_CREATE则自动创建bindService(bindIntent, conn, Service.BIND_AUTO_CREATE);}/*** 解除绑定Service*/private void doUnbindService(){unbindService(conn);}

ServiceConnection对象 conn是通过绑定方式启动,和Service通信的重要中介.当和Service连接成功和断开连接时都会回调里面的onServiceConnected() 和onServiceDisconnected() 方法. 但如果是用户主动使用unBindService()断开Activity和Service之间的连接,onServiceDisconnected()并不会被调用.因为系统将这视为正常情况. 只有是由于内存不足或其他原因导致异常中止Service和Activity之间的连接时,才会调用该方法. 并且可以通过在conn中获取Binder对象, 实现和Service的通信.

IntentService和Service的区别

系统提供了IntentService, 它是Service的子类.默认新建新的线程在运行. 而Service是缺少这个特质的,因为Service和调用者( 比如某个Activity )是运行在同一个进程中,会直接和调用竞争有限的资源,所以Service不适合用于处理耗时耗资源的任务,否则极易阻塞主线程导致ANR错误.

而IntentService 是这一情况的比较好的解决方案. 它自动实现多线程, 会新建工作线程专门处理任务, 同时使用了队列来管理请求启动IntentService的各个Intent. 比如当有3个intent都请求该IntentService,那么IntentService会按照队列顺序依次去新建线程,处理任务,保证在同一时间内只有一个intent在调用该intentService.当调用完毕会intentService会自动停止自身,并处理下一次的调用.直至最后.所以如果使用intentService, 用户并不需要主动的使用stopService() 或者在intentService中使用stopSelf()来停止.

继承IntentService必须实现onHandleIntent()方法, 将耗时的任务放在这个方法内即可. 其他方面,IntentService跟普通Service一样.




这篇关于android四大组件之Service和子类IntentService的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/694321

相关文章

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

SpringQuartz定时任务核心组件JobDetail与Trigger配置

《SpringQuartz定时任务核心组件JobDetail与Trigger配置》Spring框架与Quartz调度器的集成提供了强大而灵活的定时任务解决方案,本文主要介绍了SpringQuartz定... 目录引言一、Spring Quartz基础架构1.1 核心组件概述1.2 Spring集成优势二、J

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle