大家好,今天小编来为大家解答以下的问题,关于高效活动总结:提炼关键经验与收获,这个很多人还不知道,现在让我们一起来看看吧!
一、任务和返回栈
一个应用程序通常包含多个活动。 Android系统使用任务来管理这些活动。任务是存储在堆栈中的活动的集合。该堆栈也称为返回堆栈。活动按照自己的顺序开始。排列在栈上(即返回栈)。
任务可以跨应用程序,这是任务存在的重要原因。虽然有些Activity不在同一个应用程序中,但为了保持用户操作的连续性,它们被放在同一个任务中。例如,在我们的应用程序中,在Activity A 中单击发送电子邮件,将启动邮件程序的Activity B 来发送电子邮件。这两个Activity存在于不同的应用程序中,但是被系统放置在一个任务中,因此用户发送邮件后,按返回键返回到原来的Activity A,从而保证了用户体验。
返回堆栈
我们知道,栈是一种“后进先出”的数据结构。默认情况下,每次创建一个新的Activity时,它都会被推入返回栈并位于栈顶。当我们按下返回按钮或者调用finish()销毁栈顶的activity时,栈顶的activity就会被弹出栈,之前的栈成为新的栈顶。系统始终向用户显示堆栈顶部的活动。
二、Activity 生命周期
(1)Activity的四种状态活动在其生命周期中最多有四种状态:
运行状态
当一个Activity位于返回栈的顶部时,该Activity就处于运行状态。暂停状态
当一个Activity 不在栈顶但仍然可见时,该Activity 就会被挂起。例如,如果一个Activity被一个没有填满屏幕的弹出对话框Activity覆盖,但又没有完全覆盖,此时该Activity就会处于暂停状态。
当一个Activity 不再位于堆栈顶部并且完全不可见时,该Activity 将被停止并销毁。
当一个Activity被从返回栈中移除时,它就进入了销毁状态。
对于以上四种状态的Activity,为了保证手机有足够的内存,系统最有可能回收处于destroyed状态的Activity,其次是处于stopped状态的Activity。对于可见状态(暂停状态和运行状态)的Activity,只有那些内存极低的Activity才会被回收。系统只有在某些情况下才会考虑回收,系统最不愿意回收正在运行的Activity,因为此时的Activity是直接与用户交互的,强制回收会带来极差的用户体验。(2)Activity的七种回调方法Activity的生命周期如上图所示。 Activity 类定义了七个回调方法来表示Activity 生命周期的不同方面:
onCreate()
首次创建Activity 时调用。 onStart()
当Activity 从不可见变为可见时调用。 onResume()
当活动准备好与用户交互时调用。此时Activity必须处于运行状态并且位于返回栈的顶部。 onPause()
当系统准备好启动或恢复另一个Activity 时调用。这种方法一般用于保存一些关键数据,释放一些消耗CPU的资源。 onStop()
当Activity 完全不可见时调用。 onDestory()
在Activity 销毁之前调用。之后,该Activity 就会被销毁。 onRestart()
在Activity从停止状态变为运行状态之前调用,即Activity重新启动(3)Activity的三种生存期。上述七个方法中,用到了onRestart()方法。其他方法都是成对对应的。我们可以将Activity分为三种生存期:
(1)完整的生命周期:onCreate()--onDestory()
(2)可见生命周期:onStart()--onStop()
(3)前台生命周期:onResume()--onPause()
(4)Activity的几种典型生命周期变化我总结了几种典型情况下Activity生命周期的变化:
Activity第一次创建时,会依次执行:
onCreate()--onStart()--onResume() 当Activity被另一个Activity阻塞(完全阻塞)时,依次执行:
onPause()--onStop()然后按返回键返回上一个Activity:
onRestart()--onStart()--onResume()以对话框的形式打开另一个Activity(部分被遮挡):
onPause()--按后退键返回--onResume() 按后退键退出程序:
onPause()--onStop()--onDestroy()(5)Activity被回收的处理在Activity 生命周期中,Android 在销毁Activity 之前调用onSaveInstanceState() 以保存有关应用程序状态的数据。
@覆盖
公共无效onSaveInstanceState(捆绑保存实例状态)
{
super.onSaveInstanceState(savedInstanceState);
saveInstanceState.putString("消息", text.getText().toString());
}我们可以通过在onCreate()中取出Activity被销毁前保存的数据来恢复Activity状态。
@覆盖
protected void onCreate(Bundle savingInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState!=null)
{
字符串消息=savedInstanceState.getString("消息");
}
}除了在onCreate()中恢复之外,我们还可以使用onRestoreInstanceState()函数来恢复数据,如下所示:
@覆盖
公共无效onRestoreInstanceState(捆绑保存实例状态)
{
super.onRestoreInstanceState(savedInstanceState);
字符串消息=savedInstanceState.getString("消息");
}需要注意的是,onSaveInstanceState()和onRestoreInstanceState()与Activity生命周期方法没有什么不同,也不一定会被触发。
例如,当应用程序遇到意外情况(如内存不足、用户直接按下Home键)而系统销毁某个Activity时,onSaveInstanceState()就会被调用。但是当用户主动销毁一个Activity时,比如在应用程序中按下返回键,onSaveInstanceState()将不会被调用。因为在这种情况下,用户的行为决定了Activity的状态不需要保存。
onRestoreInstanceState()被调用的前提是Activity确实被系统销毁了,但是不太可能被系统销毁。例如,当Activity A正在显示时,用户按HOME键返回主界面,然后用户返回到Activity A。这种情况下,Activity A一般不会因为内存原因而被系统销毁,所以Activity A的onRestoreInstanceState()方法不会被执行。
通常onSaveInstanceState()只适合保存一些临时状态,而onPause()适合持久保存数据。
三、Activity的启动模式
Activity有四种启动模式,分别是standard、singleTop、singleTask、singleInstance。如果要使用这四种启动模式,则必须在manifest文件中的标签中的launchMode属性中进行配置,如下所示。如果不配置,默认模式为标准模式:
standard标准模式,每次创建一个新的实例对象singleTop如果在任务栈顶找到相同的实例(注意是栈顶),则原栈顶的onNewIntent()方法调用堆栈的实例是为了重用该实例,并且不会创建新的实例。否则,创建一个新的并将其推入堆栈顶部singleTask。如果在任务堆栈中找到相同的实例,则终止并删除其上方的任务,并重新使用该实例。否则,创建一个新实例并将其压入堆栈singleInstance,允许不同的应用程序、进程线程等共享一个实例。无论哪个应用程序调用该实例,它都会被重用。为了便于理解,特意画了几张示意图来说明:
(1)标准:每次激活一个Activity(startActivity)时,都会创建一个Activity实例并放入任务栈中。
从图中可以看出标准模式。虽然当前栈顶是Activity2,但是如果打开另一个Activity2,则会将一个新的实例压入栈中,成为新的栈顶。这种模式其实是不合理的,而且每次都创建一个新的实例,实在是太浪费了。其实我们可以根据实际情况从以下三种方式进行优化。
(2)singleTop:如果一个Activity自己激活,即任务栈顶就是该Activity,则无需创建。在其他情况下,必须创建一个Activity 实例。
singleTop模式就是利用该模式来解决栈顶重复的问题。但是,如果该Activity 不在堆栈顶部,仍然会重复创建多个实例。有没有一种方法可以让某个Activity 在整个应用程序的上下文中只存在一个实例?这就需要使用singleTask模式。
(3)singleTask:如果任务栈中存在要激活的Activity,则无需创建。你只需要将这个Activity放到栈顶,并从栈中移除这个Activity之上的所有Activity实例。
SingleTask模式从上图可以看到,当前栈顶是Activity3。打开活动1。此时栈中存在Activity1。然后移除Activity1上面的Activity3和Activity2,使Activity1成为新的栈顶。
singleTop和singleTask似乎可以解决大部分重复创建实例的问题。但是,如果一个应用程序的某个Activity被其他应用程序频繁调用,会发生什么情况呢?我们知道每个应用程序都会有自己的返回堆栈。如果同一个Activity被不同的应用程序调用,必然会在不同应用程序的返回栈中创建新的实例。使用singleInstance可以解决这个问题。
关于本次高效活动总结:提炼关键经验与收获和的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。
【高效活动总结:提炼关键经验与收获】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
这次活动真有趣!
有16位网友表示赞同!
活动回顾总是让我更加珍惜过去的美好时光。
有13位网友表示赞同!
总结一下活动的精彩内容,方便下次学习参考呢。
有20位网友表示赞同!
分享一下活动期间遇到的趣事吧!
有12位网友表示赞同!
期待下一个更精彩的活动呀!
有18位网友表示赞同!
从活动总结中可以发现很多值得借鉴的地方。
有8位网友表示赞同!
记录下活动的点点滴滴,留作珍贵的回忆。
有6位网友表示赞同!
这个总结写的真好啊,内容全面又生动形象!
有20位网友表示赞同!
回顾一下活动的过程,更好地理解活动的目的和意义。
有18位网友表示赞同!
分享一下对活动的感悟和想法吧!
有9位网友表示赞同!
活动小结能让我们更加清楚地认识到活動的重要性!
有13位网友表示赞同!
从总结中还能发现一些自己之前没注意到的地方哦!
有12位网友表示赞同!
希望下次活动可以再继续深入探讨,更丰富多彩!
有17位网友表示赞同!
这个活动总结真是太棒了,让我又想重温一次活动的精彩!
有20位网友表示赞同!
活动的点点滴滴都值得回忆,整理总结起来更好保存啊!
有8位网友表示赞同!
从总结中可以找到活动的亮点和不足,为下次提供改进空间。
有6位网友表示赞同!
活动小结是回顾反思的重要环节,让我们不断进步!
有11位网友表示赞同!
希望以后举办的活动能越来越有意义、越来越精彩!
有17位网友表示赞同!
阅读活动小记,让我对本次活动有了更深入的了解。
有15位网友表示赞同!
下次活动我们可以参考这次活动总结做的改进。
有15位网友表示赞同!