`
44289533
  • 浏览: 68330 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

android 堆栈 清理

阅读更多
启动任务

当一个activity被指定一个“android.intent.action.MAIN”做为动作,以及“android.intent.category.LAUNCHER”做为类别的intent过滤器之后,它就被设置为一个任务的入口点。这样的过滤器设置会在应用程序加载器中为此activity显示一个图标和标签,以供用户加载任务或加载之后在任意时间回到这个任务。

第二个能力相当重要:用户必须可以离开一个任务,并在一段时间后返回它。出于这个考虑,加载模式被设定为“singleTask”和“singleInstance”的activity总是会初始化一个新任务,这样的activity仅能用于指定了一个MAIN和LAUNCHER过滤器的情况之下。我们来举例说明如果没指定过滤器的情况下会发生的事情:一个intent加载了一个“singleTask”的activity,初始化了一个新任务,用户在这个任务中花费了一些时间来完成工作。然后用户按下了HOME键。于是任务被要求转至后台并被主屏幕所掩盖。因为它并没有在应用程序加载器中显示图标,这将导致用户无法再返回它。

类似的困境也可由FLAG_ACTIVITY_NEW_TASK标记引起。如果此标记使一个activity启动了一个新任务继而用户按下了HOME键离开了它,则用户必须要有一些方法再次回到这个任务。一些实体(诸如通知管理器)总是在另外的任务中启动新activity,而不是做为它们自己的一部分,所以它们总是将FLAG_ACTIVITY_NEW_TASK标记包含在intent里面并传递给startActivity()。如果你写了一个能被外部实体使用这个标记调用的activity,你必须注意要给用户留一个返回这个被外部实体启动的任务的方法。

当你不想让用户再次返回一个activity的情况下,可以将 <activity> 元素的 finishOnTaskLaunch设置为“true”。参见下面的“清理堆栈”。

清理堆栈

如果用户离开一个任务很长一段时间,系统会清理该任务中除了根activity之外的所有activity。当用户再次回到这个任务的时候,除了只剩下初始化activity尚存之外,其余都跟用户上次离开它的时候一样。这样做的原因是:在一段时间之后,用户再次回到一个任务的时候,他们更期望放弃他们之前的所作所为,做些新的事情。

这些属于默认行为,另外,也存在一些activity的属性用以控制并改变这些行为:

alwaysRetainTaskState 属性

如果一个任务的根activity中此属性设置为“true”,则上述默认行为不会发生。任务将在很长的一段时间内保留它堆栈内的所有activity。

clearTaskOnLaunch属性

如果一个任务的根activity中此属性设置为“true”,则每当用户离开这个任务和返回它的时候,堆栈都会被清空至只留下rootactivity。换句话说,这是alwaysRetainTaskState的另一个极端。哪怕仅是过了一小会儿,用户回到任务时,也是见到它的初始状态。

finishOnTaskLaunch属性

这个属性与clearTaskOnLaunch属性相似,但它仅作用于单个的activity,而不是整个的task。而且它可以使任意activity都被清理,甚至根activity也不例外。当它设置为“true”的时候,此activity仅做为任务的一部分存在于当前回话中,一旦用户离开并再次回到这个任务,此activity将不复存在。

此外,还有别的方式从堆栈中移除一个activity。如果一个intent对象包含FLAG_ACTIVITY_CLEAR_TOP标记,而且目标任务的堆栈中已经存在了一个能够响应此intent的activity类型的实例。则这个实例之上的所有activity都将被清理以使它位于堆栈的顶部来对intent做出响应。如果此时指定的activity的加载模式为“standard”,则它本身也会从堆栈中移除,并加载一个新的实例来处理到来的intent。这是因为加载模式为“standard”的activity总会创建一个新实例来处理新的intent。

FLAG_ACTIVITY_CLEAR_TOP与FLAG_ACTIVITY_NEW_TASK经常合并使用。这时,这些标记提供了一种定位其它任务中现存的activity并将它们置于可以对intent做出响应的位置的方法。
分享到:
评论

相关推荐

    Android-Floo支持AOP堆栈控制跨页消息和动态路由的URL路由器

    Floo提供了一种机制,可以控制Activity如何被添加到堆栈中,何时返回,甚至可以进行堆栈清理,从而避免状态混乱和不必要的资源消耗。 ### 跨页消息传递 在大型应用程序中,不同页面之间的通信是常见的需求。Floo的...

    android开发指南中文版

    * 清理堆栈:了解清理堆栈的概念和应用场景是开发高质量 Android 应用的前提。 * 启动任务:了解启动任务的概念和应用场景是开发高质量 Android 应用的前提。 * 远程过程:了解远程过程的概念和应用场景是开发高质量...

    Eclipse开发android教程

    该教程涵盖了Android应用开发的所有主要概念,包括应用程序基础、应用程序组件、Intent机制、manifest文件、Activity和任务、Affinity和新任务、加载模式、清理堆栈、启动任务等。 应用程序基础是指Android应用程序...

    Android 本地日志记录

    当应用遇到未捕获的异常时,系统应该能够自动生成包含异常堆栈信息的日志。这通常通过实现一个全局的`UncaughtExceptionHandler`来完成。例如,我们可以创建一个名为`TestCrashHandler`的类,继承自`Thread....

    非常详细的Android开发指南中文版

    Android提供了一些机制来清理Activity堆栈,例如finish()方法可以结束当前Activity,BACK键也可以回退到上一个Activity,达到清理栈的效果。 **启动任务** 启动任务通常是通过Intent启动新的Activity,系统会根据...

    UncaughtException不让Android应用异常退出

    通过实现`Thread.UncaughtExceptionHandler`接口,我们可以在异常发生时执行清理工作或显示用户友好的错误信息。 2. **android:process** 属性: 在AndroidManifest.xml中,我们可以通过在Activity、Service等组件...

    android+arm-linux-androideabi+gdb+android-api>=21+android 10

    - 现在,你可以设置断点、查看变量、单步执行、跟踪调用堆栈等,如同在本地调试一样。 6. **注意事项**: - 虽然这个版本的GDB不需要gdbserver,但确保设备和开发机之间的网络连接稳定仍然很重要。 - 调试过程中...

    android 开发指南中文版

    11. **清理堆栈**:通过FLAG_ACTIVITY_CLEAR_TOP或FLAG_ACTIVITY_SINGLE_TOP标志,可以清理任务栈中的其他Activity,或者只保留目标Activity。 12. **启动任务**:使用Intent的FLAG_ACTIVITY_NEW_TASK标志可以启动...

    android 抓取奔溃日志并保存

    // 可能需要执行一些清理工作,然后终止应用 android.os.Process.killProcess(android.os.Process.myPid()); } private void saveCrashInfo(Throwable ex) { // 将异常信息写入文件或上传服务器 } } // 设置...

    Android开发指南中文版推荐.pdf

    “清理堆栈”涉及到Activity的销毁策略,比如当用户按后退键时,系统可能按照后进先出(LIFO)的原则清理Activity堆栈。 “启动任务”解释了如何通过Intent启动一个新的任务,以及如何影响任务的生命周期。 最后,...

    android的webkit介绍

    5. **Chromium 组件**: Android WebKit 也包含了来自 Chromium 项目的一些组件,如网络堆栈,用于处理 HTTP/HTTPS 请求和响应。 **二、WebView 的使用** 在 Android 应用程序中,开发者可以通过以下方式使用 ...

    Android系统优化从入门到精通_胡郁.

    - 掌握Android内存管理的基础知识,包括堆(Heap)和堆栈(Stack)的区别、垃圾回收机制(GC)等。 - 理解内存泄漏的成因及其对应用性能的影响。 4. 电池使用优化: - 学习如何编写节能代码,减少后台活动,合理...

    Android开发指南中文版android1.5.ophone8

    清理堆栈(clear top)是一种启动模式,会移除目标Activity之上的所有Activity,使目标Activity成为栈顶。启动任务则涉及如何启动新的任务或者重新激活现有任务。 Android应用的运行环境分为多个进程,每个组件可以...

    android常见问题汇总,疑难

    5. **清理并重新构建项目**:执行`Clean Project`和`Rebuild Project`,这有助于清理缓存和重建项目,有时能解决问题。 6. **检查`build.gradle`文件**:确保在`dependencies`块中没有冗余或错误的配置。如果有的话...

    Android权威开发指南

    清理堆栈通常指的是结束一个任务,这可能涉及到销毁堆栈中的所有Activity,以释放系统资源。例如,当用户按下后退键或系统需要回收内存时,可能会触发任务的清理。 **进程和线程** **进程**:每个Android应用都在...

    Android开发指南中文版

    Intent的FLAG_ACTIVITY_NEW_TASK标志可以用来启动新任务,而FLAG_ACTIVITY_CLEAR_TOP可以用来清理堆栈并重启目标Activity。 **进程和线程** **进程** 在Android中,每个应用都运行在自己的进程中。进程是系统分配...

    Android开发指南中文版.doc

    清理堆栈通常指的是回退栈(Back Stack)管理,当用户按下返回键时,会关闭当前Activity并返回上一个Activity,这就是“后进先出”原则。开发者还可以通过代码控制Activity的回退行为。 **启动任务** 启动任务涉及到...

    Android Logcat 的使用

    5. **发布前的日志清理**:在发布应用之前,应移除或调整Debug级别的日志输出,以保护用户隐私并减少不必要的资源消耗。 总结,Logcat是Android开发不可或缺的一部分,熟练使用Logcat能极大地提升开发效率和问题...

    Android中文开发指南

    - **清理堆栈**:Android使用任务堆栈来管理Activity,当用户返回到上一个Activity或者退出应用时,系统可能会销毁堆栈中的部分或全部Activity。 - **启动任务**:通过Intent可以启动新的任务,也可以将Activity...

Global site tag (gtag.js) - Google Analytics