Activity常用的方法
Posted Objiect
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Activity常用的方法相关的知识,希望对你有一定的参考价值。
Activity,安卓四大基本组件之一,相当于windows的窗口
作用:界面呈现,用户交互
Activity生命周期图
虽然上图已经说明得很清楚了,但还是说一下吧!
Activity在内存中是以栈的形式被管理的,启动一个新的Activity会压入栈顶,旧的Activity就会进入onPause状态,如果此时按返回键就会返回旧的Activity并调用其onResume()方法,被弹出栈顶的新activity自然一步一步走向shut down。
上面是第一个循环,接下来onStop()->onRestart()
同样启动一个新的Activity会压入栈顶,旧的Activity就会进入onPause状态,如果栈顶的Activity背景是透明的(如Dialog),则旧Activity属于可见不会进入onStop()。如果旧Activty处于不可见状态一段时间,就会进入onStop(),此时点击返回键就会回到onStart()
接下来最后一个循环,如果应用正在运行时(处于界面Activity1),启动了另外一个应用,并且此时系统内存紧张,可能会结束上个应用的进程释放资源,如果此时再返回键回到上个应用,系统会重新启动应用并尝试恢复Activity1的界面
接下来讲Activity常用的一些方法
1、现场保护onSaveInstanceState(Bundle)/现场恢复onCreate(Bundle)或onRestoreInstanceState(Bundle)
使用过Intent在不同界面跳转传值就知道Bundle怎么用了,这里不说这个。
上面说过,当系统将之前的应用进程杀死后重回之前的应用,会恢复界面(onCreate/onRestoreInstanceState方法参数即是要恢复的数据),安卓的一些控件如textview之类的本身就会在onSaveInstanceState调用时保存一些值,比如说当前的字体颜色,尺寸等等
问题1:onSaveInstanceState什么时候被调用
答:
在onStop之前一定会调用,不保证一定在onResume之前(例外情况:比如返回键返回上个Activity,则原先的Activity是不会调用这个方法的,因为该Activity已经注定要回收,而onSaveInstanceState只适合保存一些瞬时数据,需要持久化存储的在onPause使用数据库或者本地文件存储,不要偷懒)
也可以说系统不知道Activity被压入栈顶下方时会不会被回收的情况下,就会先一步调用onSaveInstanceState以免Activty被回收了
- 例
1、跳转到新的Activity,旧Activity就会保存
2、关闭屏幕
3、去到其他应用程序界面
4、Activity横竖屏切换(默认会回收并重新创建Activity)
问题2:onCreate(Bundle)/onRestoreInstanceState(Bundle)什么时候被调用?
答:Activity确实被回收了,并通过返回键尝试返回已回收的Activity时
也就是说如果Activity并没有被回收,这时候返回是不会调用这些方法的。
2、finish()结束Activity
onDestroy是系统调用,我们最好不要去手动调用他,要结束一个Acticity使用Finish方法
3、runOnUiThread 在主线程运行一个任务
通常用于Activity中的子线程想更新界面时
4、overridePendingTransition Activity跳转时动画
在startActivity或finish前设置好跳转动画,就可以改变Activity切换时的动画效果
5、onBackPressed 返回键事件
Activity返回键按下时的响应方法,默认是结束Activity
6、onActivityResult上个Activity返回信息时
通过startActivityForResult启动一个新的Activity,新Activity通过setResult方法设置返回结果后返回Activity时就会调用此方法,用于处理 不同界面的返回结果及参数
7、Activity全屏无标题效果
Java:
//设置全屏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
//设置无标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
xml:
//直接使用一个全屏无标题的主题
Android:theme=”@android:style/Theme.NoTitleBar.Fullscreen”
//或者使用一个主题设置为全屏无标题
<style name="AppTheme" parent="android:Theme.Holo">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="windowFullscreen">true</item>
<item name="windowContentOverlay">@null</item>
</style>
8、Activity启动模式(配置文件LuanchMode属性)
- standard
标准启动,启动一个新的activity压入栈中(默认) - singleTop
如果activity处于栈顶,直接打开activity,如果不处于栈顶则实例化一个新的activity压入栈中 - singleTask
如果存在activity弹出activity上的所有栈显示acitivity,如果不存在则新建 - singleInstance
两个应用都要调到activity,如果发现另一个应用存在activity栈则共享不新建
以上是关于Activity常用的方法的主要内容,如果未能解决你的问题,请参考以下文章
从 ViewPager Activity 访问 Fragment 的方法
有没有办法从我的 Dialog 片段中的 Activity 调用方法?
将公共属性和方法公开给 Main Activity 的片段是不是是一种不好的形式?
Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段