Activity总结

Activity状态转换

活动状态:

位于栈顶,可见、具有焦点的前台Activity,可以接受用户输入。

暂停状态:

可见,但没有获得焦点。

停止状态:

不可见,但仍会停留在内存中并保存所有的状态信息。

非活动状态:

Activity被终止(退出或关闭)。

Activity栈

当前所有正在运行的Activity都放入一个后进先出的集合中,即Activity栈。

 

Android是通过一种Activity栈的方式来管理 Activity的,一个Activity的实例的状态决定它在栈中的位置。处于前台的 Activity总是在栈的顶端,当前台的 Activity因为异常或其它原因被销毁时,处于栈第二层的 Activity将被激活,上浮到栈顶。当新的 Activity启动入栈时,原 Activity会被压入到栈的第二层。一个 Activity在栈中的位置变化反映了它在不同状态间的转换。

 

 Activity生命周期

 

        生命周期方法:                                     

                            protected voidonCreate(Bundle savedInstanceState)  创建时调用,或者程序从非活动状态重新打开时也会调用。

                            protected voidonStart()  onCreate之后或者从停止状态恢复时调用,或者在 Activity 从 Stop 状态转换为Active 状态时被调用。

                            protected voidonResume()  onStart之后或者从暂停状态恢复时调用,从停止状态恢复时由于调用onStart方法,所以也会调用onResume

                            protected voidonPause()  进入暂停,停止状态,或者销毁时调用

                            protected voidonStop() 进入停止状态或者销毁时调用,一般用于保存 Activity 的状态信息。

                            protected voidonDestroy()  销毁时调用,一般做些释放资源,清理内存等工作。

                            protected voidonRestart() 从停止状态恢复时调用

 

 

        

 

 

 

       

 

           OnRestoreInstanceState&OnSaveInstanceState

 

            protected voidonSaveInstanceState(Bundle outState)  onSaveInstanceState()的调用遵循一个重要原则,即当系统存在“未经你许可”时销毁了我们的activity的可能时,则onSaveInstanceState()会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据。如果调用,调用将发生在onPause()或onStop()方法之前。

           1、当用户按下HOME键时。

           2、长按HOME键,选择运行其他的程序时。

           3、按下电源按键(关闭屏幕显示)时。

           4、从activity A中启动一个新的activity时。

           5、屏幕方向切换时,例如从竖屏切换到横屏时(在屏幕切换之前,系统会销毁activity,在屏幕切换之后系统又会自动地创建activity,所以onSaveInstanceState一定会被执行)。

           protected voidonRestoreInstanceState(Bundle savedInstanceState)  onRestoreInstanceState()则不一定与onSaveInstanceState()方法成对实现,onRestoreInstanceState()被调用的前提是,activity“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用。onRestoreInstanceState()在onStart() 和onPostCreate(Bundle)之间调用。

 

Activity创建及启动

每个Activity都表示一个屏幕界面,应用程序会把它呈现给用户。典型情况下,至少包括一个用来处理应用程序的主UI功能的主界面屏幕。该主界面一般由多个Fragment组成,通常是由一组次要的Activity支持的。

 

创建Activity

 

  1. 定义类继承Activity

 

要创建一个新的Activity,需要对Activity类进行扩展,在新类定义用户界面并实现新的功能。

 

publicclass MyActivityextends Activity

 

  1. 在AndroidManifest中对其进行注册

为了在应用程序中使用一个Activity,需要在Manifest中对其进行注册,在AndroidManifest的application节点内添加新的activity标签;标签包含图像、图标、必需的权限以及Activity所使用的主题等元数据的属性。没有添加对应的activity标签的Activity不能被显示,试图显示时会抛出运行时异常。

 

<activity

           android:name="com.study.compass.MyActivity"

            android:label="@string/app_name">

   </activity>

 

启动Activity

 

显示意图   

创建Intent,指定类名  startActivity()

隐式意图

常见Intent,指定动作(setAction)数据(setData)和类型(setDataAndType) startActivity()

Activity.startActivity()方法可以根据传入的参数启动另外一个Activity:

 

Intent intent =new Intent(MainActivity.this,OtherActivity.class);

startActivity(intent);

 

注:OtherActivity同样需要在 AndroidManifest.xml 中定义

 

 

Activity&Intent

Activity之间通过Intent进行通信,在activity标签中,可以添加intent-filter节点来指点能够用来启动该Activity的Intent。在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据。

典型的动作类型有:MAIN(activity的门户)、VIEW、PICK、EDIT等。而动作对应的数据则以URI的形式进行表示。例如:要查看一个人的联系方式,你需要创建一个动作类型为VIEW 的intent,以及一个表示这个人的URI。

与之有关系的一个类叫IntentFilter。相对于intent是一个有效的做某事的请求,一个IntentFilter则用于描述一个activity(或者IntentReceiver)能够操作哪些intent。一个activity如果要显示一个人的联系方式时,需要声明一个IntentFilter,这个IntentFilter 要知道怎么去处理VIEW动作和表示一个人的URI。IntentFilter 需要在AndroidManifest.xml中定义。通过解析各种intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,activity 将会调用startActivity(IntentmyIntent)方法。然后,系统会在所有安装的应用程序中定义的IntentFilter 中查找,找到最匹配myIntent 的Intent对应的activity。新的Activity接收到myIntent的通知后,开始运行。当startActivity方法被调用将触发解析myIntent的动作,这个机制提供了两个关键好处:

A、Activities 能够重复利用从其它组件中以Intent 的形式产生的一个请求;

B、Activities 可以在任何时候被一个具有相同IntentFilter的新的Activity取代。

AndroidManifest文件中含有如下过滤器的Activity组件为默认启动类当程序启动时系统自动调用它

<activity

           android:name="com.study.compass.MyActivity"

            android:label="@string/app_name">

            <intent-filter>

                <actionandroid:name="android.intent.action.MAIN"/>

                <categoryandroid:name="android.intent.category.LAUNCHER"/>

            </intent-filter>

</activity>

Activity中的IntentFilter

Intent Filter描述了一个组件愿意接收什么样的 Intent 对象,Android 将其抽象为 android.content.IntentFilter 类。在Android 的 AndroidManifest.xml 配置文件中可以通过 <intent-filter >节点为一个 Activity指定其 Intent Filter,以便告诉系统该 Activity 可以响应什么类型的 Intent。

 

Activity中的Intent Filter的匹配过程

当使用startActivity(intent) 来启动另外一个 Activity 时,如果直接指定 intent 了对象的 Component 属性,那么Activity Manager 将试图启动其 Component 属性指定的 Activity。否则 Android 将通过 Intent的其它属性从安装在系统中的所有 Activity 中查找与之最匹配的一个启动,如果没有找到合适的 Activity,应用程序会得到一个系统抛出的异常。

 

 

Action匹配

 

Action 是一个用户定义的字符串,用于描述一个 Android 应用程序组件,一个 Intent Filter 可以包含多个Action。在 AndroidManifest.xml 的 Activity 定义时可以在其 <intent-filter >节点指定一个Action 列表用于标示 Activity 所能接受的“动作”,例如:

 

        <intent-filter>

             <actionandroid:name="android.intent.action.MAIN"/>

<actionandroid:name="com.tony.myaction"/>

        </intent-filter>

 

启动Activity时用到的Intent对象:

 

Intent intent =newIntent();

intent.setAction("com.tony.myaction");

 

URI 数据匹配

 

一个 Intent 可以通过 URI 携带外部数据给目标组件。在 <intent-filter >节点中,通过 <data/>节点匹配外部数据。

 

mimeType 属性指定携带外部数据的数据类型,scheme 指定协议,host、port、path 指定数据的位置、端口、和路径。如下:

 

   <dataandroid:mimeType="mimeType"android:scheme="scheme"

 android:host="host"android:port="port"android:path="path"/>

 

如果在 Intent Filter 中指定了这些属性,那么只有所有的属性都匹配成功时 URI 数据匹配才会成功。

 

Category 类别匹配

<intent-filter >节点中可以为组件定义一个 Category 类别列表,当 Intent 中包含这个列表的所有项目时 Category 类别匹配才会成功。

Activity启动模式

Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在AndroidActivity的启动模式决定了Activity的启动运行方式。

 

Activity启动模式设置:

 

<activityandroid:name=".MainActivity"android:launchMode="standard"/>

 

Activity的四种启动模式:

 

1. standard(系统默认)

模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。

2.singleTop

如果在任务的栈顶正好存在该Activity的实例,就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。

3.singleTask

如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

4.singleInstance

在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。

关于Activity的技巧

锁定Activity 运行时的屏幕方向

 

Android 内置了方向感应器的支持。在 G1 中,Android 会根据 G1 所处的方向自动在竖屏和横屏间切换。但是有时我们的应用程序仅能在横屏 / 竖屏时运行,比如某些游戏,此时我们需要锁定该 Activity 运行时的屏幕方向,<activity >节点的 android:screenOrientation属性可以完成该项任务,示例代码如下:

 

     <activityandroid:name=".MyActivity"

         android:label="@string/app_name"

         android:screenOrientation="portrait"><!-- portrait竖屏 , landscape横屏 -->

…………

     </activity>

 

全屏的Activity

 

要使一个 Activity 全屏运行,可以在其 onCreate()方法中添加如下代码实现:

 

// 设置全屏模式

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

// 去除标题栏

requestWindowFeature(Window.FEATURE_NO_TITLE);

 

在Activity 的 Title 中加入进度条

 

为了更友好的用户体验,在处理一些需要花费较长时间的任务时可以使用一个进度条来提示用户“不要着急,我们正在努力的完成你交给的任务”。如下图:

在 Activity 的标题栏中显示进度条不失为一个好办法,下面是实现代码:

 

// 不明确进度条

 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

 setContentView(R.layout.main);

 setProgressBarIndeterminateVisibility(true);

 

 // 明确进度条

 requestWindowFeature(Window.FEATURE_PROGRESS);

 setContentView(R.layout.main);

 setProgress(5000);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值