Activity的生命周期和一些常用技巧1

来源:互联网 发布:怎样找网络兼职 编辑:程序博客网 时间:2024/06/04 20:11

Activity 是android的一个重要组件,相当重要,它可以说成是android的躯体。activity包含的东西比较多,比较杂,在这里介绍一些常用的知识点和几个稍微偏门的点。


activity的生命周期,很经典的一张图

activity的生命周期比较复杂,常用的几个回调方法就是上图几个方法,简要说明一下各个方法的作用

1,onCreate()(创建):Activity启动时会先调用onCreate(),绘制视图,然后调用onStart()(开始),使Activity可见,UI显示出来,然后调用onResume()(继续),使的Activity可被操作即可交互。这是可以点击或者触摸屏幕和按钮

2,onPause()(暂停):Activity失去了焦点,是不可操作和交互

3,onStop()(停止):当前这个Activity不再可见,也就是这个Activity被完全覆盖了,比如跳转到另外一个页面,或者点击了Home键

4,onDestory()(销毁):调用Finish()或者系统内存不足回收当前Activity的时候,会调用这个方法。

5,onRestart()(重新开始)当前Activity从不可见到可见的状态时并且这个Activity一直存在,先调用onRestart(),再调用onStart(),然后再调用onResume()

生命周期使用的小技巧:
比如activity中有一个EditText,这时候你往上面写了一个字符串 a,这时候页面关闭,又重新进入该页面,想重新展示该数据,最典型的例子,微信聊天界面,你输入了半句话,这是退到主界面,信息列表会显示草稿箱,重新点击进去,半句话还在 这时候就需要onDestory()和onResume()两个生命周期合作了。在onDestory()中对EditText控件的内容做判断,如果有内容,则进行存储;在onResume()进行判断,是否有存储内容,如果有,就把存储内容显示到EditText上面,同时清空该存储数据。

平常用到比较多的是onResume()和onPause()方法,因为activity获得焦点和失去焦点但没有完全被覆盖的情况比较多,所以activity走这两个方法比较频繁。这里就引出一个容易出错的地方,Dialog。
Dialog有两种表现形式,一种是继承Dialog,自定义layout布局,另一种是把activity做成Dialog形式,被这两种不同的dialog覆盖时,activity的生命周期如何呢?

Activity被一个Dialog(覆盖失去焦点不可交互,当前Activity的一部分被覆盖,可以看到之前Activity的部分界面的,或者被完全覆盖,activity生命周期仍然保持在当前状态,因为此时可以把Dialog看出activity的一部分,生成Dialog时必须把activity自身传进去。

Activity被一个Dialog(弹出框)形式的的Activity覆盖失去焦点,当前Activity的一部分被覆盖,可以看到之前Activity的部分界面的,此时,activity会调用onPause()方法,不会再调用onStop()方法。然后,Dialog消失,Activity由覆盖状态回到前台显示后,activity会调用onResume()方法

Activity被一个常规的Activity覆盖或者Dialog(弹出框)形式的的Activity覆盖失去焦点,指的是被完全覆盖,完全看不到之前的Activity界面,activity会调用onPause()后,再调用onStop()方法。然后,当前activity由覆盖状态回到前台显示后,activity会调用onRestart(),再调用onStart(),onResume()方法

一个小小的Dialog就隐藏了几个坑,一部留神,很容易就出错了。


activity的启动模式有四种,这里介绍一下使用场景:
standard 默认启动模式是activity一个叠加一个,就是一个栈,先进后出,这个最简单。

singleTop 栈顶正好存在该activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(不管之前有没有存在activity) (会调用实例的onNewIntent()。例如qq的聊天界面)

singleTask 中已经有该Activity的实例,就重用该实例。重用时,在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。 (会调用实例的onNewIntent()。例如很多app的主界面)

singleInstance 也是单例,但是单独在一个栈里,相当于多个app共同使用一个activity实例,例如打开浏览器,这个一般都是系统的app会用到,非系统的app用的最多的是钱三种。


activity里有时候会需要全屏显示,不显示标题栏和电源信号等等。两种方法,一种是配置清单修改,一种是代码修改。

在该项目的AndroidManifest.xml文件中,在需要全屏的Activity元素中添加属性
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
这样就可以实现这个Activity的全屏显示,如果只是不要标题栏,即需要保留系统自带的任务栏的话,则使用
android:theme="@android:style/Theme.NoTitleBar"
如果所有activity的都风格一至,可以在application的跟节点配置android:theme

在代码里修改,无标题栏:requestWindowFeature(Window.FEATURE_NO_TITLE);
全屏:getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                                                                     WindowManager.LayoutParams.FLAG_FULLSCREEN);
注意一点,要在super.onCreate(savedInstanceState);之前调用才有效。
如果所有activity的都风格一至,可以抽取activity父类,在父类里处理。


0 0
原创粉丝点击