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中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的