onDestroy()这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。 onRestart()这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。...在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行相互的,我们平时看到和接触最多的也这个状态下的活动。 3.活动在生命周期中最多中能有几种状态?...即使应用退出,服务也不会停止。当应用进程被杀死时(例如一键清理),服务便会停止。 13.本地服务与远程服务的优缺点各是什么?...另外一种 bindService() 方法的意思是,把这个Service 和调用 Service 的客户类绑起来,如果调用这个客户类被销毁,Service 也会被销毁。...调用者也可以通过调用unbindService方法来停止服务,这时候Srevice就会调用onUnbind->onDestroyed方法。
简介 定义:服务,是Android四大组件之一, 属于 计算型组件 作用:提供 需在后台长期运行的服务 如:复杂计算、音乐播放、下载等 特点:无用户界面、在后台运行、生命周期长 2....生命周期 具体请文章:Android:Service生命周期最全面解析 3. 类型 Service可按照运行地点、运行类型 & 功能进行分类,具体如下: 3.1 具体分类 3.2 详细介绍 4....其他思考 5.1 Service 与 Thread的区别 结论:Service 与 Thread 无任何关系 之所以有不少人会把它们联系起来,主要因为Service的后台概念 后台:后台任务运行完全不依赖...UI,即使Activity被销毁 / 程序被关闭,只要进程还在,后台任务就可继续运行 关于二者的异同,具体如下图: 注:一般会将 Service 和 Thread联合着用,即在Service中再创建一个子线程...带你学Android:页面活动-Activity Carson带你学Android:广播-BroadcastReceiver Carson带你学Android:服务-Service Carson带你学
参考简答: Handler在Android中主要有以下作用: 线程间通信:通过Handler,不同线程之间可以安全地传递消息,实现数据的交换。...出发点: 强调HandlerThread的便利性和在特定场景下的优势,例如在需要长时间运行的后台任务中。...通过HandlerThread,可以轻松地在新线程中执行一系列任务。 使用场景: 后台任务:当需要在后台执行长时间运行的任务时,可以使用HandlerThread,避免阻塞主线程。...使用WeakReference:将外部类通过WeakReference传递给Handler,使得外部类可以被垃圾回收。...结语 通过深入研究Android Handler技术,我们不仅能够更好地应对面试中的高级问题,也能在实际开发中更加熟练地运用Handler进行线程间通信和任务调度。
Android中的主线程主要处理和界面相关的事情,而子线程则往往用于执行耗时操作。线程的创建和销毁的开销较大,所以如果一个进程要频繁地创建和销毁线程的话,都会采用线程池的方式。...(2)在Android中除了Thread,还有HandlerThread、AsyncTask以及IntentService等也都扮演着线程的角色,只是它们具有不同的特性和使用场景。...FutureTask插入到任务队列tasks中,如果这个时候没有正在活动的AsyncTask任务,那么就会执行下一个AsyncTask任务,同时当一个AsyncTask任务执行完毕之后,AsyncTask...IntentService适合执行一些高优先级的后台任务,这样不容易被系统杀死。...4.如果步骤3中线程数量已经达到线程池规定的最大值,那么就拒绝执行此任务,ThreadPoolExecutor会调用RejectedExecutionHandler的rejectedExecution方法来通知调用者
在Android上,协程有助于解决两个主要问题: 管理长时间运行的任务,否则可能会阻止主线程并导致应用冻结。 提供主安全性,或从主线程安全地调用网络或磁盘操作。...如果您的应用程序为主线程分配了太多工作,那么应用程序可能会明显卡顿或运行缓慢。...由于ViewModel在配置更改(例如屏幕旋转)期间不会被销毁,因此您不必担心协同程序被取消或重新启动。 范围知道他们开始的每个协同程序。这意味着您可以随时取消在作用域中启动的所有内容。...使用适用于Android体系结构的KTX库组件,您还可以使用扩展属性viewModelScope来创建可以运行的协同程序,直到ViewModel被销毁。...启动一个协程 您可以通过以下两种方式之一启动协同程序: launch会启动一个新的协程,并且不会将结果返回给调用者。 任何被认为是“发射并忘记”的工作都可以使用launch来开始。
他们还可以设置为不同应用程序的组件运行在同一个进程中——假设这些应用程序共享同一个Linux用户ID且被分配了同样的权限。...当内存剩余较小且其它进程请求较大内存并需要立即分配,Android要回收某些进程,进程中的应用程序组件会被销毁。当他们再次运行时,会重新开始一个进程。...当决定终结哪个进程时,Android会权衡他们对用户重要性的相对权值。例如,与运行在屏幕可见的活动进程相比(前台进程),它更容易关闭一个进程,它的活动在屏幕是不可见(后台进程)。...因为用户界面必须很快地响应用户的操作,所以活动寄宿的线程不应该做一些耗时的操作如网络下载。任何不可能在短时间完成的操作应该分配到别的线程。...Android提供了做这些工作的所有代码,这样我们可以专注于定义和执行RPC接口本身。 一个RPC接口仅包含方法。所有的方法同步地执行(本地方法阻塞直到远程方法执行完成),即使是没有返回值。
Android 中主线程交 UI 线程,主要作用是运行四大组件以及处理它们和用户的交互;子线程的作业则是执行耗时任务。...Android 中的线程形态 1、AsyncTask AsyncTask 是一种轻量级的异步任务类,可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新 UI, AsyncTask...但是在 Android 3.0 以及后续的版本中,仍然可以通过 AsyncTask 的 executeOnExecutor 方法来并行地执行任务。...Android 中的线程池 线程池的优点 重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销; 能有效控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源而导致的阻塞现象; 能够对线程进行简单的管理...方法来通知调用者。
我们还可以到手机的应用程序管理界面来检查一下MyService是不是正在运行,如下图所示: ? 恩,MyService确实是正在运行的,即使它的内部并没有执行任何的逻辑。...而Service我们最初理解的时候,总会觉得它是用来处理一些后台任务的,一些比较耗时的操作也可以放在这里运行,这就会让人产生混淆了。...即使Activity被销毁,或者程序被关闭,只要进程还在,Service就可以继续运行。比如说一些应用程序,始终需要与服务器之间始终保持着心跳连接,就可以使用Service来实现。...但是Service就不同了,所有的Activity都可以与Service进行关联,然后可以很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的...如果你希望Service可以一直保持运行状态,而不会由于系统内存不足的原因导致被回收,就可以考虑使用前台Service。
) 特殊情况,可以在清单文件中配置service所在的进程,让service在另外的进程中执行。...如果仅仅只是为了开启一个后台任务那么可 以使用startService()方法。...stopService的haunted,Service会一直在后台运行 (2)通过bindService Service会运行onCreate,然后调用onBind(),这时候调用者和Service...*如果先是bind了,那么start的时候就直接运行Service中onStart方法,如果先是start那么bind的时候就直接运 行onBind方法。...,Service就会被销毁 *如果一个Service通过startService被start之后,多次调用startService的话,Service会多次调用onstart方法。
基础知识 定义:服务,属于Android中的计算型组件 作用:提供需要在后台长期运行的服务(如复杂计算、下载等等) 特点:长生命周期的、没有用户界面、在后台运行 ---- 2....使用场景 通过上述描述,你应该对Service类型及其使用非常了解; 那么,我们该什么时候用哪种类型的Service呢? 各种Service的使用场景请看下图: ? 6....其他思考 6.1 Service和Thread的区别 结论:Service和Thread之间没有任何关系 之所以有不少人会把它们联系起来,主要因为Service的后台概念 后台的定义:后台任务运行完全不依赖...UI,即使Activity被销毁,或者程序被关闭,只要进程还在,后台任务就可以继续运行 其实二者存在较大的区别,如下图: ?...:IntentService用法&源码 ---- 7.总结 本文对Service的所有知识进行了全面解析(基础认识、生命周期、使用和应用场景 接下来会介绍继续介绍Android开发中的相关知识,有兴趣可以继续关注
服务可由其他应用组件启动(如 Activity ),服务一旦被启动将在后台一直运行,即使启动服务的组件( Activity )已销毁也不受影响。...调用者也可以通过调用 unbindService 方法来停止服务,这时候 Srevice 就会调用 onUnbind -> onDestroyed 方法。...如果先是 bind 了,那么 start 的时候就直接运行 Service 的 onStart 方法,如果先是 start ,那么 bind 的时候就直接运行 onBind 方法。...如果仅仅只是为了开启一个后台任务那么可以使用 startService() 方法。...这些功能如果放到 Activity 中做的话,那么 Activity 退出被销毁了的话,那这些功能也就停止了,这显然是不符合我们的设计要求的,所以要将他们放在 Service 中去执行。
因此,您就不会希望任务被取消,例如,向数据库写入数据或者向您的服务器发送特定类型的请求。 下面我们就来介绍实现此类情况的模式。 协程还是 WorkManager? 协程会在您的应用进程活动期间执行。...在 Android 中,测试 UI 层需要执行插桩测试,而执行插桩测试需要运行一个模拟器。 3....✅ 好处: 调用者 (通常是 ViewModel 层) 可以控制这些层级中任务的执行和生命周期,也可以在需要时取消这些任务。...// 注意,如果正在调用的上下文被取消,那么异常将会被忽略。...就算 ViewModelScope 被销毁,使用 externalScope 的任务也会持续运行。
所以说,即使有很多个Activity分别都是来自于不同应用程序的,Android系统仍然可以将它们无缝地结合到一起。那这一切是怎么实现的呢?...等四大组件,其中的每一个组件,都是可以被跨应用复用的,这就是android的神奇之处。...(称其B应用)中的组件(称其B组件)就可以了,但是这就引发了一个新问题,A组件运行在A应用中,B组件运行在B应用中,自然都不在同一个进程中,那么从B组件中返回的时候,如何实现正确返回到A组件呢?...如果以这种方式启动的Activity被跨进程调用,在5.0之前新启动的Activity实例会放入发送Intent的Task的栈的顶部,尽管它们属于不同的程序,这似乎有点费解看起来也不是那么合理,所以在5.0...4:假如目前有两个任务栈,前台任务栈T4的情况为AB,后台任务栈t4里存有CD,假设CD的启动模式均为singleTask,现在由B去启动D,那么整个后台任务都会被切换到前台,这个时候整个栈就变成了ABCD
和Thread,我们都知道这两个东西都可以执行后台任务,但要注意的是Service是跑在主线程中的,如果不做特殊处理是会阻塞主线程的,而IntentService正好弥补了这一点,在《Android查缺补漏...,想比而言单纯的开启一个线程来执行后台任务,由于这个进程中没有活动的四大组件,所以非常容易被系统杀死。...其实在普通的Service中开启一个线程也能达到IntentService的效果,只是这样我们用起来更方便,那么在Service中开启线程或者使用IntentService相比在Activity中开启线程有什么优势呢...而如果我们在Service中创建了线程,然后如果线程中的任务没有执行完毕,我们可以让Service一直运行在后台去承载这个线程,这样的话我们以后在想操作这个线程的话就可以在外界通过bindService...的方式再绑定这个Service,从而可以控制运行在这个Service中的线程。
service一直被用来做后台运行的操作,包括一些保活,上传数据之类的,这个后台运行的弊端很多,比如耗电,比如设计用户隐私之类的,谷歌对这些后台行为进行了一些处理,从Android Oreo(API 26...,并非杀死进程还可以继续执行任务),这个技术适用于在应用退出之后任务还需要继续执行的需求,对于在应用退出的之后任务也需要终止的需求,可以选择ThreadPool、AsyncTask。...,那么其运行周期不能短与15分钟。...也就是说,如果某一个后台任务运行失败,或者取消,那么接下来的后台任务就都得不到运行了。...如果我们需要逐步建立一个长期的任务链,那么唯一的工作序列也会很有用,例如,照片编辑应用可能会让用户撤消一长串的操作,每个撤销操作可能需要一段时间,但必须按正确的顺序执行,在这种情况下,应用程序可以创建一个
等四大组件,其中的每一个组件,都是可以被跨应用复用的,这就是android的神奇之处。...虽然组件可以跨应用被调用,但是一个组件所在的进程必须是在组件所在的Aplication进程中。...(称其B应用)中的组件(称其B组件)就可以了,但是这就引发了一个新问题,A组件运行在A应用中,B组件运行在B应用中,自然都不在同一个进程中,那么从B组件中返回的时候,如何实现正确返回到A组件呢?...standard.png 如果以这种方式启动的Activity被跨进程调用,在5.0之前新启动的Activity实例会放入发送Intent的Task的栈的顶部,尽管它们属于不同的程序,这似乎有点费解看起来也不是那么合理...singleTask3.png 4:假如目前有两个任务栈,前台任务栈T4的情况为AB,后台任务栈t4里存有CD,假设CD的启动模式均为singleTask,现在由B去启动D,那么整个后台任务都会被切换到前台
Android 优化目录 ---- 优化的意义 减少 OOM,提高应用稳定性。 减少卡顿,提高应用流畅度。 减少内存占用,提高应用后台运行时的存活率。 减少异常发生,减少代码逻辑隐患。...这种情况很容易发生在短时间内申请大量 的对象时,并且它们在极少的情况下能得到有效的释放,这样会出现内存泄漏的情况。 一旦达到了剩余内存的阈值,垃圾回收活动就会启动。...比如 AsyncTask 或线程 new Runnable 都会有一个匿名内部类,因此它们对当前 Activity 都有一个隐式引用,如果 Activity 在销毁之前任务还未完成,那么将导致 Activity...忽略特定的弱引用 实现自己的 ExcludedRefs 忽略某些特定的弱引用对象,不对其进行内存泄漏的监视。...可以使用 IntentService,后台任务结束后会自动停止,从而极大程度上避免了 Service 内存泄漏的可能性。
领取专属 10元无门槛券
手把手带您无忧上云