美文网首页
Activity生命周期的总结

Activity生命周期的总结

作者: 84ed7ae0e2ba | 来源:发表于2016-02-23 14:51 被阅读260次

启动和销毁Activity

生命周期可由下图来说明,

如何实现一个用户期待的app

      1 当使用app的时候,不会因为来电或者其它app的界面而导致crash

      2 当用户没有激活某个组件的时候不要消耗宝贵的资源

      3 当离开你的app并且一段时间后返回,不要丢失用户的使用进度

      4 当设备发生屏幕旋转的时候,不会crash或者丢失用户的使用进度

Activity的三种生命状态是可以存在一断比较长的时间,其他几个状态是很快就会切换掉,停留的时间较短

       resumed:这个状态Activity是最前端的,用户可与之交互,running

       paused:这个状态,Activity被另外一个Activity所遮盖;;另外的Activity来到了最前端,但是不会覆盖整个屏幕,被暂停的Activity不会再接受用户的输入和失去了主线程的控制权。

       Stoped:这个状态,Activity被完全覆盖,不被用户可见,可认为在后台,当stoped,Activity的实例与他的所有状态信息都会被保留,但是Activity不能执行任何代码

其它的状态,Created和started都是短暂的,系统会快速执行哪些回调函数,并通过下一阶段回调函数移动到下一个状态。

首次启动的Activity

在android manifest.xml 指定你的那个activity作为主Activity

用户从主界面点击的你的程序时,用户会调用你的app里面的声明为lanucher或者为main的activitity的onCreate()的方法。

note:如果你的app中没有一个Activity声明为Main Action或者LAUNCHER category,那么设备的主界面将不会呈现的你的app图标。

创建一个新的实例

onCreate(), 声明ui元素,定义成员变量,以及配置ui等,尽量少做时间,避免启动太久都看不到界面。

onCreate()执行完成之后,会迅速执行onStart()和onResume(),理论上来说当执行完onStarted的方法之后,就开始能被用户所看下。

销毁Activity

Activity的最后一个生命周期为onDestory(), 系统执行这个方法作为你的activity要从系统中完全移除的信号。

大多数不需要实现这个方法,因为局部的reference会随着activity的销毁而销毁,并且你的Activity应该在onPause()和onStop()去释放资源,清楚资源。然后在你的Activity中包含你onCreate()创建的后台线程,或者其它有可能造成内存泄漏的问题,你应该在onDestory()杀死他们。

note:在Activity中onCreate()调用finish()方法,会直接执行onDestory()的方法,而不会执行其它的生命的周期的方法。

暂停和恢复Activity

前端的Activity有时候会被其它的可见的组件而阻塞,这个会导致Activity进入到暂停的状态,可要这个Activity部分可见,那么的这个Activity会处于的Paused的阶段。

一旦Activity被完全阻塞并完全不可见的时候,它则会进入到Stoped 的状态

暂停你的Activity你需要做的事

     1 停止动画或者其它的正在运行的操作,后台线程除外,哪些回导致cpu的浪费。

     2 提交没有保存的状态,但是仅仅是用户离开时候期待保存的内容。

     3 释放系统资源,例如broadcastReceiver,sensors,或者其它会影响你电量的资源。

    4 如果用到camera,选择在onpaused是比较好的地方去释放资源。

避免在onpause()做一些cpu-intensive的工作,比如数据库操作,因为它会导致切换到下一个activity的变得缓慢(下一个activity的onstart()方法会在上一个Activity的onPause()执行完之后执行),把这些工作交给onStop()去做。

停止或者重启Activity

Activity提供了onStop()和onRestart()的方法来允许Activity的停止和重启进行调用,不想暂停的状态是部分阻塞ui的,停止的状态是ui不再可见并且用户的焦点转移到另一个actvity中。

停止和暂停的状态Activity 都会在内存保留实例。

无论什么原因导致Activity 停止,系统总是会在onStop()之前执行onPause()的方法的。

停止Activity你应该做的事

      1 释放资源,一旦你的Activity停止了,系统会在不再需要这个Activity时摧毁它的实例(栈结构的问题),防止极端条件下,系统直接杀死你的app,不执行onDestory(),从而造成内存泄漏等问题。

      2 尽管onPause()会在onStop()之前调用,你还是应该将CPU intensive的工作放在onStop()来做。

停止状态,系统会自动保存Resumed状态的,不需要我们手动去保存的,及时是在极端条件下,这个Activity被销毁,也会自动保存一些信息。

onRestart()的方法会只在你的Activity从stoped的状态恢复的时候才会被调用,因此你可以在使用来执行一些特殊的恢复工作。

      1 创建你在onStop()的清理的资源,重新连接你在onStop()释放的资源

      2 用户很可能在在回到这个activity的之前需要过一段时间,所以你可以在onStart()方法中去验证一些东西。比如locationmanager或者有无网络等。

重新创建Activity

当你的Activity是因为用户点击了back键或者Activity通过finish() 来结束自己的系统就丢失Activity实例的概念,因为前面的行为已经意味着你不再需要这个Activity了,然而如果因为系统资源紧张而导致Activity的Destory,系统会在用户回到这个Activity有过这个Activity的纪录,系统会使用哪些保存的纪录数据(描述当Activity被Destory时的状态)来重新创建一个新的Activity的实例。那些被系统用来恢复之前状态而保存的数据被叫做"instanceState",他是用来存放在bundle对象的key-value

为了能使你的Android 系统能够恢复到Activity恢复View 的状态,没个View 都必须有唯一的一个id。

onSaveInstanceState(),为了使额外的数据保存到SaveInstanceState中,当用户离开Activity的时候(比如,打开其它的app或者点击home键 ,即是这种情况可能会被destory(),当系统停止你的Activity,再重新创建的时候才会调用onRestoreInstanceState(),

当你的Activity开始stop的时候,系统会调用onSaveInstanceState(),因为你的Activity可以用键值对的来保存信息,

当你的Activity 被Destory中重建的时候,你可以从系统的传递给你的Activity的Bundle中恢复状态,其中onCreate()和onRestoreInstanceState()回调方法都接受到同样的Bundle的对象。包含着同样的实例的状态信息。

相关文章

网友评论

      本文标题:Activity生命周期的总结

      本文链接:https://www.haomeiwen.com/subject/nyvmkttx.html