Android学习笔记2-1--组件5--Activity

来源:互联网 发布:阿普利亚200圣甲虫数据 编辑:程序博客网 时间:2024/06/11 21:25

组件简介

一个Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务,例如拨号、拍照、发送email、看地图。每一个activity被给予一个窗口,在上面可以绘制用户接口。窗口通常充满屏幕,但也可以小于屏幕而浮于其它窗口之上。

activity.gif-64.6kB

组件定义

组件声明

组件方法

生命周期相关函数

// 再次唤醒时将会被调用。如果系统已经存在一个singleTask实例,系统就会将请求发送到这个实例上,但系统不会再调用通常情况(未杀死)下请求数据的onCreate,而是调用这个方法。系统可能会随时杀掉后台运行的Activity ,如果发生系统就会调用onCreate方法。一个好的解决方法就是在onNewIntent和onCreate方法中调用同一个处理数据的方法。onNewIntent()// 创建时将会被调用。如之前已抓取该Activity状态信息,则此Bundle中就包含了前一个状态的信息onCreate()// 在返回该activity响应时调用。(一定会在onRestart或onResume之前调用)onActivityResult()// 用户即将看到Activity之前将会被调用onStart()// 即将与用户交互之前将会被调用,此时该Activity会进入Activity栈的顶端onResume()// 当准备恢复另一个Activity的运行时将会被调用。本方法典型的用途是把未保存的改动保存为持久性数据、停止动画播放、以及其他可能消耗CPU的工作。onPause()// 无论执行什么操作都应迅速完成,因下个Activity在本方法返回前是不会被恢复运行的// 在Activity即将由系统原因销毁之前调用onSaveInstanceState()// 当Activity不再对用户可见时调用onStop()// 该方法有两个含义:1将此Activity从栈中移除。2调用Activity的onDestroy方法finish()// 只要没有调用finish,即使执行了onDestroy,但Activity栈中依然保留有它// 其将结束运行(调用finish)或系统为腾出空间而要临时销毁时调用。可用isFinishing来区分两种情况onDestroy()// 只要没有调用finish,即使执行了onDestroy,但Activity栈中依然保留有它

其他常用相关函数

// ContextThemeWrapper的N个函数,详情见Context笔记// ComponentCallbacks2的三个函数,详情见Context笔记-----------------------------------------------------------------------// Window.Callback的函数,详情见Window笔记onCreatePanelMenu和onCreatePanelView等一系列的创建函数onAttachedToWindow和onDetachedFromWindow等一系列的初始化函数onWindowAttributesChanged和onWindowFocusChanged等一系列的改变函数dispatchKeyEvent和dispatchTouchEvent等一系列的分发函数// KeyEvent.Callback的函数,详情见Event笔记onKeyDown和onKeyUp和onKeyLongPress-----------------------------------------------------------------------// View.OnCreateContextMenuListener的函数onCreateContextMenu// LayoutInflater.Factory2的函数onCreateView-----------------------------------------------------------------------// 自身函数getLoaderManager/getWindowManager/getContentTransitionManagergetParent/getActionBar/getTitle/getWindow/getCurrentFocusrunOnUiThreadregisterForContextMenuopenContextMenuopenOptionsMenusetContentViewfindViewById// Note that getIntent() still returns the original Intent. You can use setIntent(Intent) to update it to this new Intent.getIntent/setIntent函数setResult

组件状态

生命周期状态

如果Activity被pause或stop,系统就可以把它从内存中清理出去,这是通过请求终止(调用它的 finish方法)或者直接杀死进程。 当Activity被再次启动时(在被终止或者杀死后),它必须被完全重建。
当在初始onCreate方法或onResume方法中,用一个大于等于0的请求码调用startActivity或者startActivityForResult时,窗口在被启动的Activity返回结果前不会显示。这是为了避免跳转到另一Activity时可见的闪烁。

1) Stopped(后台状态)。本Activity完全被其他Activity盖住了,本Activity是不可见的,只要有其他内存需求它就会被系统杀死。一个被停止的Activity也仍然是存活的,其对象仍然保留在内存中,它保持着所有的状态和成员信息,但是不再与窗口管理器联接。

完整生存期是在onCreate()调用和onDestroy()调用之间进行。你的Activity应该在onCreate()方法里完成所有“全局性”状态的设置(比如定义Layout), 并且在onDestroy()方法里释放所有所占用的资源。比如你的Activity有一个后台运行的线程用于从网络下载数据,那么应该在onCreate()方法里创建这个线程并且在onDestroy()方法里停止这个线程。

2) Paused(可见状态)。另一个Activity位于前台并拥有焦点,本Activity是不可交互但可见,在系统内存严重不足时可能会被杀死。一个Paused的Activity是完全存活的,其对象仍然保留在内存中,它保持着所有的状态和成员信息,并且维持与窗口管理器的关联。

可见生存期会在onStart()调用和onStop()调用之间发生。在这期间用户可在屏幕上看见这个Activity并可与之进行交互。在这两个方法之间,可以保存那些显示Activity所需的资源。比如可以在 onStart()方法里注册一个BroadcastReceiver用于监控影响用户界面的改动,并且当用户看不见显示内容时在onStop()方法里注销掉它。 因为Activity会在可见和隐藏状态之间来回切换,所以系统可能会在Activity的整个生存期内进行多次onStart()和onStop()调用。

3) Resumed(前端状态)。本Activity位于屏幕前台并且拥有用户焦点,本Activity是可交互的,系统一般不会杀死该进程。

前端生存期将在onResume()调用和onPause()调用之间发生。在这段时间内,该Activity位于屏幕上所有其他Activity之前,并且拥有用户的输入焦点。 Activity可以频繁地进入和退出前台——例如当设备进入休眠时或者出现一个对话框时, onPause()就会被调用。因为状态可能经常会发生切换,为了避免切换迟缓引起的用户等待,这两个方法中的代码应该非常轻量化。

保存生命状态

一旦系统为了回收内存而销毁Activity,则Activity对象就会被销毁,系统就无法简单地恢复状态完整的Activity,如果用户要返回到这个Activity,系统必须重新创建Activity对象。可通过实现另一个回调方法onSaveInstanceState(),以确保将Activity状态的相关重要信息都保存下来。如果系统要调用onSaveInstanceState(),那么通常会在onStop()方法之前并且可能是在onPause()之前调用。
父类实现的onSaveInstanceState()将有些Activity状态保存下来。比较典型的是用一个Paracelable 对象保存Fragment的所有状态或为Layout中的每个具有ID属性的View实现了调用相应的该方法,这使得每一个View都能给出自己需被保存的信息。Android框架中几乎所有的Widget都会适时实现此方法,这样任何用户界面中可见的变化都会被自动保存下来并在Activity重建后自动恢复。注意如果这个Widget没有ID的话,系统是无法保存它们的状态的。

1) 因为缺省实现的onSaveInstanceState()方法已经保存了一些UI的状态,所以如果你重写此方法是为了保存更多的状态信息,那么在执行自己代码之前应确保调用一次父类的onSaveInstanceState()。同理如果重写onRestoreInstanceState()的话,也应该调用一次父类的同名方法,这样缺省的代码就能正常恢复View的状态。
2) Activity被销毁之前并不能确保每次都会调用onSaveInstanceState()。调用的情况是当系统存在“未经你许可”时销毁activity的可能时(如按下home、电源、切换屏幕方向、启动activity等),则会被系统调用,这是系统的责任。当用户用BACK键离开了Activity,却不会调用,这是用户的责任。依照Android官方源码的解释,onSaveInstanceState方法一定是在onStop方法之前调用,但不保证在onPause方法之前或之后调用,
3) 因为不能确保一定会被调用,onSaveInstanceState()方法只适合保存瞬态数据。比如UI控件的状态, 成员变量的值等,而不应该用来保存持久化数据。持久化数据应该当用户离开当前的activity时,在 onPause()中保存(比如将数据保存到数据库或文件中)。还要说一点的就是在onPause()中不适合用来保存比较费时的数据,这点要理解

旋转设备是一种检测应用程序状态恢复能力的好方法。当屏幕的方向发生变化时,为了换用符合屏幕参数的资源,系统会销毁并重建当前Activity。 因此Activity能够在重建时完整地恢复状态是非常重要的,因为在使用应用程序的过程中用户经常会旋转屏幕。

在现实场景中的状态切换

1、在实际应用场景中,假设ActivityA位于栈顶,此时用户操作,从ActivityA跳转到ActivityB。那么对AB来说,具体会回调哪些生命周期中的方法呢?回调方法的具体回调顺序又是怎么样的呢?

1) 开始时A被实例化:执行的回调有A:onCreate -> A:onStart -> A:onResume
2) 点击A中按钮来到B时,假设B全部遮挡住了A:将依次执行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop
3) 点击Back键:将依次执行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy

2、在Android中,有两个按键在影响Activity生命周期这块需要格外区分下,即Back键和Home键。接着实验1继续(Activity栈中只有A):

1) 如果按下Back键系统返回到桌面:执行A:onPause -> A:onStop -> A:onDestroy
2) 如果按下Home键系统返回到桌面:执行A:onPause -> A:onStop。由此可见Back键和Home键主要区别在于是否会执行onDestroy。
3) 如果长按Home键不同手机可能弹出不同内容,Activity生命周期未发生变化(由小米2s测的,不知道其他手机是否会对Activity生命周期有影响)。

问题1:当前不少应用程序都是采取如Home键的效果,当点击了Back键系统返回到桌面,然后点击应用程序图标,直接回到之前的Activity界面,这种效果是怎么实现的呢?

@Overridepublic void onBackPressed() {    Intent home = new Intent(Intent.ACTION_MAIN);    home.addCategory(Intent.CATEGORY_HOME);    startActivity(home);}// 为达到此类效果,Activity实际上提供了直接的方法。activity.moveTaskToBack(true);// 此方法直接将当前Activity所在的Task移到后台,同时保留activity顺序和状态

组件堆栈

activity的堆栈管理

activity的启动方式

原创粉丝点击