zoukankan      html  css  js  c++  java
  • android 进程什么时候被销毁

    http://wear.techbrood.com/guide/components/processes-and-threads.html

    每一个 android 应用默认会起一个进程,除非你用 android:process 实现多进程。

    每一个进程里面都有一个 dalvik 虚拟机实例用来执行代码。

    进程中默认只有一个主线程(UI线程), 4 大组件默认都运行在 UI 线程中, 所以 4 大组件中都不能直接做耗时操作,否则会 ANR。

    service 和 broadcastreceiver 中要做耗时操作都必须开启单独的线程来做。

    但按 back 键退出应用后,进程什么时候被回收呢??

    android 会尽可能长时间的去保留一个应用进程不被回收,这样下次可以快速启动,只有当内存紧张时才会回收进程,而回收哪些进程则根据进程的优先级来判断。

    默认有 5 种进程优先级, 根据进程中组件的状态来判断:

    Foreground process

    简单来说就是正在前台与用户交互的进程,优先级最高。
    Visible process

    可见但没有与用户交互

    Service process

    不是 1 和 2 但含有用 startService 启动的 service 的进程。

    Background process

    非 1 2 3 不可见的进程

    Empty process

    空进程,主要做缓存。

    android 推送都是在 service 中进行 socket 通信,进程优先级默认是 3 ,所以内存紧张时也是有可能被 Kill 掉的,就收不到推送了。

    service 可以通过  startForground() 来设置为前台进程,这样优先级就变为 1 了,不容易被 kill 掉。而且通过 onStartCommand 的返回值

    可以控制进程在被意外 kill 掉时是否需要重启,这样就达到了长时间运行,应用永远在线, 用 tcp 长连接实现推送。

    看有些人用 System.exit(0) 和 Process.killProcess 来 kill 掉进程,这 2 个方法确实都能 kill 掉进程,但有些情况下会导致应用重启,例如

    当 A 启动 B 你在 B 中调用 System.exit(0) 或  Process.killProcess 时会 kill 掉当前进程然后重启一个新的进程。

    我之前说过 90% 的情况下你是不需要手动 kill 掉一个应用的进程的,这样第二次启动肯定非常慢。进程是由 OS 底层进行管理的,退出应用你只需要

    finish 掉所有的 activity 就行了。如果有些需求确实需要 kill 掉进程,上面的 2 个方法也可以,前提是任务站内只有一个 activity 时再调用。反正我目前

    还没有遇到过需要每次退出应用都必须杀死进程的场景,不要跟我说是为了节省内存,上面说了 5 种进程等级,系统自己会管理,不需要人为干预。

    而且你自己杀死进程后第二次启动又需要创建新的进程,应用启动就非常慢了。

  • 相关阅读:
    .NET 压缩解压库发布,支持进度查看
    WPF 蒙罩层 LoadingPage
    WPF如何用TreeView制作好友列表、播放列表
    WPF多线程UI更新——两种方法
    .NET责任链模式(混合单例模式,模板方法模式)-----制作与扩展能力验证
    .NET单例模式-------各种写法&&验证
    迭代器模式和组合模式混用
    正确理解DTO、值对象和POCO
    理解POCO
    VM
  • 原文地址:https://www.cnblogs.com/lesliefang/p/5379212.html
Copyright © 2011-2022 走看看