Java优质资料,Java实战项目,Android开发教程,包括多线程,结构,算法,BATJ面试题等,大牛积累的经验~~~如果需要更多资料,可以加入我们Java交流学习基地免费获取:925050116!!!Activity是Android程序的四大组件之一,是Android程序的表现层。程序的每一个显示画面都是一个Activity,上面可以显示一些控件,也可以监听和处理一些控件来响应用户事件。活动通过Intent进行通信。1、Activity生命周期:为了理解生命周期,我们先来说说任务:任务其实就是“应用”,由一个或多个Activity组成,完成一次完整的用户体验。比如我们打开QQ,首先进入联系人列表界面。这个界面是一个Activity:点击“添加好友”进入搜索Activity:点击一个搜索结果进入名片Activity:一个任务Activity是以栈的形式存储的,栈底就是那个Activity启动整个任务,栈顶是当前运行的用户可以交互的Activity。当一个活动启动另一个活动时,新活动被压入堆栈并成为当前正在运行的活动。先前的活动保留在堆栈中。当用户按下BACK键时,当前活动从堆栈中弹出,前一个活动恢复为当前正在运行的活动。堆栈中的活动永远不会重新排列,只会被压入或弹出。任务中的所有活动作为一个整体移动。整个任务(也就是Activity栈)可以移到前台,也可以退到后台。例如,假设当前任务在堆栈中有四个Activity——三个在当前Activity之下。当用户按下HOME键后,回到系统界面,然后选择一个新的应用程序(即一个新的任务)。然后将当前任务转移到后台,显示新任务的根Activity。然后,用户返回系统界面,选择上一个应用(上一个任务)。因此,该任务及其堆栈中的所有四个活动再次出现在前台。当用户按下BACK键时,屏幕不会返回到用户刚刚离开的任务。相反,弹出当前任务堆栈中的顶部Activity,并显示倒数第二个Activity。Android系统是一个多任务(Multi-Task)操作系统,可以在用手机听音乐的同时执行其他多个程序。每执行一次应用程序,都会消耗更多的系统内存。当同时执行的程序太多,或者关闭的程序没有适当释放内存时,系统会感觉越来越慢,甚至不稳定。为了解决这个问题,Android引入了一种新的机制——生命周期(LifeCycle)。Android应用程序的生命周期由Android框架管理,而不是由应用程序管理。通常,每个应用程序(入口一般是一个Activity的onCreate方法)都会产生一个进程(Process)。当系统内存即将耗尽时,进程会根据优先级自动回收。用户和开发人员都无法确定何时回收应用程序。所以为了防止数据丢失等问题,了解生命周期很重要。一、四种状态:1、活动(Active/Running)状态:当Activity在屏幕前台运行时(在当前任务活动栈的顶部),此时它已经获取了焦点,可以响应用户的操作,属于运行状态。一次只能有一个Activity处于活动状态(Active)或运行状态(Running)。2.暂停状态:当Activity失去焦点但用户仍然可见时(比如上面有另一个透明的Activity或Toast、AlertDialog等弹窗时),处于暂停状态。挂起的Activity还活着(它保留了所有的状态和成员信息,并与窗口管理器保持连接),但是当系统内存极低时,它可以被系统杀死。3.停止(Stopped)状态:当它被另一个Activity完全阻塞时处于停止状态,它仍然保留着所有的状态和成员信息。它只是对用户不可见,当其他地方需要内存时,它往往会被系统杀死。4.Inactive(死)状态:Activity还没有启动,已经被手动终止,或者被系统回收时处于inactive状态。要手动终止Activity,可以调用程序中的“finish”方法。如果被系统回收(根据内存不足时的回收规则),可能是因为内存不足。当内存不足时,Dalvak虚拟机根据其内存回收规则回收内存:1.首先回收与其他Activity或Service/IntentReceivers无关的进程(即先回收独立的Activity),所以我们的一些(耗时)推荐后台操作,最好以Service的形式。2.不可见的(处于Stopped状态)Activity。3、服务进程(除非真的没有可用内存时才会销毁)。4.Inactive可见(Paused状态)Activity。5.当前正在运行(Active/Running状态)的Activity。2.七个重要方法。当Activity从一种状态进入另一种状态时,系统会自动调用以下相应的方法来通知用户这一变化:1.onCreate(BundlesavedInstanceState):当Activity第一次被实例化时系统有时会调用,并且整个生命周期只调用一次。该方法通常用于初始化设置,设置Activity要使用的布局文件,绑定监听器到按钮等静态设置。2.onStart():当Activity可见但不能与用户焦点交互时系统会调用。3.onRestart():当Activity停止然后重新启动时系统会调用。4.onResume():当Activity可见并且可以与用户焦点交互时系统会调用。5、onPause():当系统启动另一个新的Activity时,系统调用它来保存现有Activity中的持久化数据,在新的Activity启动前停止动画等。这种实现方法必须非常快。当系统而不是用户回收内存时关闭Activity之后。用户会期望当他返回到这个Activity时,它会保持上次离开时??的状态。这时候就用到了onSaveInstanceState()。onSaveInstanceState()方法用于保存Activity被杀死前的状态。它在onPause()之前触发。当系统为了节省内存(用户不想销毁)销毁Activity时,需要重写。方法,当再次实例化这个Activity时,保存的临时状态数据会通过onCreate(BundlesavedInstanceState)传入。因为onSaveInstanceState()方法并不总是被调用,因为有些场景不需要保存状态数据。例如,当用户按下BACK键退出Activity时,用户显然想要关闭Activity。这个时候就不需要为下次恢复保存数据了,也就是不会调用onSaveInstanceState()方法。onSaveInstanceState()方法的触发条件是(按HOME键,按电源键熄屏,横竖屏切换),只需要重写onSaveInstanceState()记录临时状态活动,而不是持久数据。onPause()应该用于存储持久数据。6.onStop():当Activity被新的Activity完全覆盖不可见时由系统调用。7、onDestroy():当Activity(用户调用finish()或系统内存不足)被系统销毁杀死时,系统调用(整个生命周期只调用一次)用于释放onCreate()方法中创建的资源,比如线程结束等。3、三层嵌套循环1、Activity的完整生命周期:从第一次调用onCreate()到onDestroy()调用结束2、Activity的可视化生命周期:从调用onStart()到对应的调用onStop()在这两个方法之间,可以保留显示Activity所需的资源。例如,在onStart()中注册广播接收器以监听影响您的UI的更改,并在onStop()中注销。3.Activity的前台生命周期:从调用onResume()到对应调用onPause()。例如:有3个Acitivity,分别用One、Two(透明)、Three表示。一个是应用启动时的主Activity;当第一个界面ActivityOne启动时,它的顺序是:onCreate(ONE)-onStart(ONE)-onResume(ONE)当你点击“打开透明Activity”按钮时,它的顺序是:onPause(ONE)-onCreate(TWO)-onStart(TWO)-onResume(TWO)然后点击back回到第一个在这个界面,Two会被杀掉,走的顺序是:onPause(TWO)-onActivityResult(ONE)-onResume(ONE)-onStop(TWO)-onDestroy(TWO)当你点击“OpenFullScreenActivity”按钮时,此时去顺序为:onPause(ONE)-onCreate(Three)-onStart(Three)-onResume(Three)-onStop(ONE)然后点击back返回到第一个界面,Three会被杀死。顺序是:onPause(Three)-onActivityResult(ONE)-onRestart(ONE)-onStart(ONE)-onResume(ONE)-onStop(Three)-onDestroy(Three)当你点击返回退出应用时,它的顺序是:onPause(ONE)-onStop(ONE)-onDestroy(ONE)2.代码示例:新建一个测试项目,在MainActivity中写入如下代码:/**在activity第一次创建时调用。*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);Toast.makeText(this,"onCreate(BundlesavedInstanceState)方法被调用。",Toast.LENGTH_SHORT).show();}@OverridepublicvoidonStart(){super.onStart();Toast.makeText(this,"调用了onStart()方法。",Toast.LENGTH_SHORT).show();}@OverridepublicvoidonRestoreInstanceState(BundlesavedInstanceState){super.onRestoreInstanceState(savedInstanceState);Toast.makeText(this,"onRestoreInstanceState(BundlesavedInstanceState)方法被调用。",Toast.LENGTH_SHORT).show();}@OverridepublicvoidonRestart(){super.onRestart();Toast.makeText(this,"onRestart()方法已被调用。",Toast.LENGTH_SHORT).show();}@OverridepublicvoidonSaveInstanceState(BundlesavedInstanceState){super.onSaveInstanceState(savedInstanceState);Toast.makeText(this,"onSaveInstanceState(BundlesavedInstanceState)方法被调用。",Toast.LENGTH_SHORT).show();}@OverridepublicvoidonPause(){super.onPause();Toast.makeText(this,"onPause()方法被调用。",Toast.LENGTH_SHORT).show();}@OverridepublicvoidonResume(){super.onResume();Toast.makeText(this,"调用了onResume方法。",Toast.LENGTH_SHORT).show();}@OverridepublicvoidonStop(){super.onStop();Toast.makeText(this,"调用了onStop()方法。",Toast.LENGTH_SHORT).show();}@OverridepublicvoidonDestroy(){super.onDestroy();Toast.makeText(this,"调用了onDestroy()方法。",Toast.LENGTH_SHORT).show();}@OverridepublicvoidonConfigurationChanged(ConfigurationnewConfig){super.onConfigurationChanged(newConfig);Toast.makeText(this,"onConfigurationChanged()方法已被调用。",Toast.LENGTH_SHORT).show();}运行后在模拟器上观察该方法的调用.三、横竖屏切换时Activity的生命周期:1、默认设置切换时的生命周期:运行新建的测试项目,Toast消息的提示调用顺序为:“onCreate”->"onStart"->"onResume"Press当crtl+f12将模拟器切换到横屏时,Toast消息的提示调用顺序为:"onSaveInstanceState"->"onPause"->"onStop"->"onDestroy"->"onCreate"->"onStart"->"onRestoreInstanceState"->"onResume"再次按crtl+f12将模拟器切换为竖屏,发现Toast消息两次显示相同的调用顺序:"onSaveInstanceState"->“onPause”->“onStop”->“onDestroy”->“onCreate”->“onStart”->“onRestoreInstanceState”->“onResume”->“onSaveInstanceState”->“onPause”->“onStop”->"onDestroy"->"onCreate"->"onStart"->"onRestoreInstanceState"->"onResume"2、修改AndroidManifest.xml,在Activity中添加android:configChanges="orientation":
