现在的位置: 首页 > 综合 > 正文

Activity生命周期之我见

2012年08月23日 ⁄ 综合 ⁄ 共 3595字 ⁄ 字号 评论关闭

 

关于Activity生命周期的文章很多,而且大部分也说得很详细,所以作为关于这方面的内容我本来不想多说,但是大家可能跟我之前一样,在看这方面的内容的时候都能很容易地看懂,但是过几天又忘了,或者在用的程序中跳转较多的情况下容易混淆。

这是因为没有真正的理解,或者是没有很好的方法来记忆,所以在这里我就说一下我对Activity生命周期的一些记忆的方式,希望对大家能够有所帮助。

Activity生命周期的基本内容我就不多说了,网上一搜一大把,官方文档也说得很详细。总之,我们知道Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:

onCreate 、onStart 、onResume 、onPause 、onStop 、onDestroy 、onRestart

下面这张图就是我的记忆的方式:

Activity生命周期记忆

不难看出,其实这些方法都是两两对应的,onCreate创建与onDestroy销毁;onStart可见与onStop不可见;onResume可编辑(即焦点)与onPause;这6个方法是相对应的,那么就只剩下一个onRestart方法了,这个方法在什么时候调用呢?答案就是:在Activity被onStop后,但是没有被onDestroy,在再次启动此Activity时就调用onRestart(而不再调用onCreate)方法;如果被onDestroy了,则是调用onCreate方法。

这样大家就应该能够很容易的记住这些方法了。下面再通过一个比喻来看两个Activity的切换过程。

我们把Activity比作一本书,我们要看书,首先从书架上取出书(onCreate),然后放到桌上(onStart),接着打开书(onResume),这样我们就可以看书并可以在书本上写字了。

如果这时候我们要启动另一个Activity,也就是要看另一本书,首先我们放下手中的笔或者说合上书(onPause),然后从书架上拿下另一本书(书2:onCreate),然后把书本2放到桌上并打开(书2:onStart、onResume)。

如果书本1被书本2完全盖住了,即不可见了,就调用书本1的onStop;而如果书本2较小,没有完全盖住书本1,则不会调用。

我们还可以把书本1放回书架上,即onDestroy。

另外,还有一点要注意,Activity在处于onPause、onStop、onDestroy状态下,系统都可以销毁该Activity所在进程,所以我们在处理一些要保存的数据时,必须在onPause方法中进行,因为onStop和onDestroy方法不一定会被调用。

 
 

1什么是Activity?

Activity是指前台程序,Service指后台程序。

activitiesActivity的复数。

2.请描述一下Activity生命周期。
共有七个周期函数:
void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()
1.
完整生命周期:    即一个activity从出现到消失,对应的周期方法是从onCreateonDestroy

2.
可见生命周期:    onStart()onStop()方法,在这个周期中,用户可以看见Activity,但不一定能够与之交互,这两个方法可以随着状态的变化被执行多次。
3.
前景生命周期:    onResume()onPause()方法,在这个周期中,Activity处在其它Activity之前,即在Activity栈的最顶端,负责与用户进行交互,伴随着状态的变化,这两个方法可以被执行多次

S3.两个Activity之间跳转时必然会执行的是哪几个方法。
1.启动一个Activity

   启动一个新的Activity需调用StartActivityIntent )函数。

   参数 Intent  一个Intent对象,

   若要在两个Activity之间进行跳转我们还得借助Intent类中另的外一个函数。

                public Intent setClassContext packageContext Class<?>cls

   其返回值为一个Intent对象(即你要跳转到得ActivityIntent对象)

 

2.从一个Activity获取另外一个Activity中的数据结果

   例如:你在某个app 中点击了按键跳转到了另外一个Activity(此处我暂称为子Activity)中,在此Activity中你让用户选择联系人列表中的联系人,而在此Activity结束后需要在上层Activity(此处我暂称为父Activity)中需显示子Activity中返回的联系人名字。

   要想做到上述功能,我们需做一下三件事

   (a)在父Activity中调用StartActivityForResultIntent int ;

   (b)在父Activity中实现OnActivityResultint requestCode, int resultCode, Intent Date

       参数分析:

       requestCode :此参数传个StartActivityForResult 为了确定是谁请求的。

       resultCode    :此参数是SetReusltIntent Date)的返回值为Intent对象。

       Date  Intent对象返回给调用者。

   (c)在子Activity快要退出时调用SetReusltIntent Date)函数用于回调父Activity中的

          OnActivityResultint requestCode, int resultCode, Intent Date)函数。

S4.横竖屏切换时候Activity的生命周期。

1、不设置Activityandroid:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activityandroid:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activityandroid:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

5如何将一个Activity设置成窗口的样式。

1。在你的styles.xml文件中可以新建一如下的style:

    <style name="Theme.FloatActivity" parent="android:style/Theme.Dialog">
        <!-- float_box
为我们定义的窗口背景,这个不是必须的-->
        <item name="android:windowBackground">@drawable/float_box</item>
    </style>

如果窗口要添加窗口背景,可以在drawable中新建一个叫float_box.xml的文件,内容可以如下(自定义):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#ffffff" />
    <stroke android:width="3dp" color="#000000" />
    <corners android:radius="3dp" />
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
</shape>

2.AndroidManifest.xml中在你需要显示为窗口的activity中添加如果属性:android:theme="@style/Theme.FloatActivity"即可

如果说您觉得新建style.xmlfloat_box.xml文件的方式麻烦或者只想Test一下,那么可以直接添加您对应需要展示为Dialog
style
Activityandroid:theme属性值为android:theme="@android:style/Theme.Dialog"

抱歉!评论已关闭.