Android Activity

Activity大家都会用,工作之余看到了Android官方文档对于Activity的解释,看完之后有点儿意外的收获,特此记录一下。

Activity是什么

几乎所有的Activity都是为了和用户交互,所以它的主要工作是创建一个可以放置UI的Window。Activity经常是全屏显示,有时候Activity可以作为一个浮动的窗口使用(设置Theme windowIsFloating)。

Activity生命周期

系统中存在一个管理Activity的栈,当启动一个新的Activity时就会把该Activity加入到栈顶,之前的Activity将会放到下面。

Activity生命周期回调:

  • onCreate: Activity第一次创建时调用,通常在这里做一些配置例如:创建View,把数据绑定到List等等,onCreate(Bundle)方法,当调用了 onSaveInstanceState方法的,重新创建Activity时Bundle不为空,其他情况则为空。
  • onStart: Activity开始被用户可见时回调此方法。
  • onReume: Activity可以和用户交互,此时Activity位于Activity栈的栈顶。
  • onPuase: 系统启动了别的Activity ,此时应该做一些保存状态,停止动画,和其它一些消耗CPU的操作,但是这个方法中不宜做耗时操作,因为onPause执行完 以后,下个Activity才会回调onResume方法。
  • onStop:当Activity不再被用户可见(例如当被其他Activity覆盖,或者新的Activity启动,其它已经存在的Activity重新回到栈顶,或者此Activity被销毁)都会回调此方法。
  • onDestory:在Activity销毁之前最后一次回调。调用finished()方法或者系统为了节省内存都可能会调用,可以使用isFinishing()方法来区分。

Activity存在的四种状态

  • Activity在屏幕的最前面(栈顶),此时Activity处于Running状态。
  • Activity失去了焦点但是仍然可见(例如被透明的Activity盖住),此时处于Pause状态,这时Activity仍然完全活着(保持着所有的状态,和变量信息,仍然attach在Window Manager上),但是当系统的内存非常低时,可以被系统回收。
  • Activity被完全遮盖,此时状态为Stopped,它仍然保持着所有的状态和变量,但是因为此时Activity不可见,所有没有attach到windowManager上,当可用内存很少时会被系统Kill掉。
  • 当Activity处于Paused或者Stopped状态,系统可以强制Kill这个Activity,但是当它重新显示的时候必须重新启动。

PS:onPause onStop状态的Activity系统都可以杀掉,官方推荐在onPause中持久化数据(保存状态),当系统杀掉Activity时,回调生命周期的方法执行完super代码后,后会返回不再往下执行,当然我们也可以使用onSaveInstanceState来保存,但是 onSaveInstanceState(Bundle)不是Activity生命周期的一部分,所以并不是所有的情景都会回调此方法,所以官方推荐最好在onPause的时候处理数据。

开发中常用的三种Activity生命周期的循环,以及每组生命周期内应该做的一些工作

  • 完整生命周期 onCreate—>onDestory 在onCreate时应该做一下初始化操作,在onDestory时应该释放所有的资源(例如一 个线程在后台从网络下载数据,在onDestory的时候应该停止这个线程)。
  • 可见生命周期 onStart–>onStop 在此生命周期之前 用户可以在屏幕上看到Activity(即使它没有在前台和用户交互) 两个生命周期之间可以保留需要展示给用户的资源文件。例如:可以在onStart的时候注册广播,通过接收广播来改变UI,此时应该在onStop的时候unRegister(因为此时UI已经不可见) onStart和onStop可能会被重复调用。
  • 前台生命周期 onResume–>onPause 在这之间 Activity正在前台和用户交互, Activity可能频繁的在这两个状态切换,所以这两个生命周期内最好不要做一下重量级的工作。

Android杀掉Activity的优先级

Android系统会尽量保证我们的Activity长时间保留,但是当内存非常低的时候需要移除一些旧的Activity,此时移除哪个与Activity和交互状态有关。
Activity的重要性大致可以分为四种,下面是按照重要程度排序,系统会先移除重要程度较低的Activity。

  • 前台Activity(当前屏幕显示的和用户直接交互的Activity)认为是最重要的Activity,为了保证用户的交互,只有此Activity占用的内存超过系统剩余的内存后,系统才会将它杀死。
  • 可见的Activity(可以被用户看见,但是没有在前台)被认为是很重要的Activity,为了保证前台Activity的运行才会杀掉它。
  • 后台Activity(用户不可见,处于Pause状态)认为是不再重要,所以系统可能会杀掉它来释放内存供前台Activity使用。当它被杀掉以后,重新回到此Activity的时候,回重新调用onCreate(Bundle)方法, onSaveInstanceState(Bundle)方法中保存的数据会恢复回来。
  • 空Process是没有引用Activity或者其他组件的任务,当内存变的少的时候它会很快被杀死。所以一个Activity之外的后台的操作必须要持有Activity的Context来让系统保留你的Process。

PS:有时候一些工作会独立与Activity生命周期来长时间执行,例如:相机拍完照以后,上传图片到服务器需要很长时间,APP应该允许用户离开Activity后继续上传,这时可以在Activity里启动一个Service来做上传操作,在这期间系统会认为该Service比一些不可见的Activity要重要一些,不论启动它的Activity处于暂停还是销毁状态。

官方文档对Activity生命周期的解释

Activity Configuration Changes

当设备的屏幕旋转时,除了特殊声明之外,都会引起当前Activity销毁,也会适当的回调 onPause onStop等生命周期。

如果一个Activity在前台被用户可见,当设备的设置发生变化的时候,上一个Activity实例的onDestory()回调时,一个新的Activity的实例会被创建(onCreate(Bundle) 会得到上一个实例保存的数据)。

在某些特殊场合想要在多种Config变化下重启 Activity,可以在清单文件中注册 android:configChanges配置好,当config发生变化时会执行onConfigurationChanged(Configuration)。

Activity Permissions

权限通常是在在清单文件中注册,另外在跳转到某个Activity的时候可以设置 Intent.FLAG_GRANT_READ_URI_PERMISSION,表示可以允许指定的Activity访问特定的URI(知道该Activity销毁),如果使用onNewIntent()的方式启动Activity则会将新的URI访问权限添加到已经存在的Activity上。(onNewIntent 一般结合Activity的启动方式来使用,大家可以去百度)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值