Android学习笔记2-1--组件5--Activity
来源:互联网 发布:阿普利亚200圣甲虫数据 编辑:程序博客网 时间:2024/06/11 21:25
组件简介
一个Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务,例如拨号、拍照、发送email、看地图。每一个activity被给予一个窗口,在上面可以绘制用户接口。窗口通常充满屏幕,但也可以小于屏幕而浮于其它窗口之上。
组件定义
组件声明
组件方法
生命周期相关函数
// 再次唤醒时将会被调用。如果系统已经存在一个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的启动方式
- Android学习笔记2-1--组件5--Activity
- Android:Activity组件学习笔记
- Android学习笔记5---四大组件之Activity
- Android 学习笔记1(activity中组件)
- Android学习笔记--四大组件之Activity
- Android开发学习笔记----Activity组件
- 学习笔记:Android基本组件之Activity
- android四大组件学习笔记--Activity
- Android学习笔记四大组件之Activity
- Android学习--Activity组件
- Android学习笔记 day06 _ Android四大组件之Activity
- Android学习第2步--Activity组件
- Android学习笔记(1)————Android四大组件之一(Activity)
- Android学习笔记(1)————Android四大组件之一(Activity)
- Activity组件之学习笔记
- Android四大组件之一Activity的生命周期<学习笔记>
- Android学习笔记之四大组件篇--->Activity
- android学习笔记之三:四大组件之Activity
- OBS bit rate推流比特率最佳设置
- 关于网站易用性理解
- 通过 Apache 代理访问 NodeJS 服务
- 【Docker】Docker的简介
- C# 中的委托和事件
- Android学习笔记2-1--组件5--Activity
- 运算符、流程控制——反选
- PagedPool 和 NoPagedPool的区别
- Android学习笔记2-1--组件6--Fragment
- MySql 中 case when then else end 的用法
- 一些公式/定理积累
- Android学习笔记2-2--视图1--View
- 【Nginx】nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
- 中科爱讯WiFi探针在企业考勤上的运用