您的位置:首页 > 移动开发 > Android开发

Android界面之Activity

2015-12-12 16:26 375 查看
说来泪奔,接触android也有一段时间了,当被人问到一些细节的问题时,我还是会支支吾吾,直冒冷汗,好吧!趁着闲暇时间充足,好好整理一下,再也不要有这种尴尬的感觉了,太TMD的糟糕了!

1.Activity

1.1. 概述:界面组件【组件:有特定功能和接口规范的实现单元】负责与用户交互,其生命周期由操作系统【组件管理服务 : ActivityManagerService】托管,通过Intent和Uri地址同其他组件连接通信,并在AndroidManifest.xml中配置相关信息以备ActivityManagerService识别和统一调度。

1.2. 生命周期:





一.各回调方法分开描述:

1) onCreate(Bundle savedInstanceState ) :Activity的入口点,初始化数据,设置在资源文件中定义的UI界面,读取保存到存储设备中的数据Bundle,用findViewById(int)获取具体控件的实例,设置全局状态,后台创建线程。

2) onStart( ) :屏幕可见,注册BroadcastReciver监听UI控件的变化

3) onResume( ) :

4) onPause( ) :提交保存修改,初始状态的改变,比如滑动列表,contentprovider保存数据,失去焦点

5) onStop( ) :注销BroadcastReciver对UI 控件的监听,因为屏幕已经不可见了

6) onDestroy( ) : 释放所有的资源,停止线程

7) onRestart( ) :

8) onActivityResult(int requestCode, int resultCode, Intent data ) : 典型的场景是但我编辑一条短信,添加选择好的图片时,会把数据通过data参数返回给启动的界面。也就是通过调用startActivityForResult(Intent intent, int requestCode) 来触发,其返回值通过此回调函数得到

9) onConfigurationChanged(Configuration newConfig ) : Configuration config = getResources().getConfiguration()当配置项发生变化,资源,布局文件/图片/字符串均会因为配置文件中的配置值而发生改变,利用新配置销毁当前activity,并重新创建新的实例,并从 onSaveInstanceState(Bundle)中获得之前那个activity的状态.还有一种情况是你可能想基于一种或者多种配置项目改变而避开重启你的activity,可以通过android:configChanges属性,这样不会重启而是会调用此回调方法

10) onNewIntent( ):一旦launchermode 设置为singleTask或者singleTop,一旦条件满足,重用实例,则调用此回调方法

11) onSaveInstanceState( ) :配置发生变更【impact the resources the application retrieves 包括 scale/local/input mode/screen size/screen orientation】,新建实例时会调用

12) onRestoreInstanceState( ) :

二.四种状态

1)Running/Activity:活动运行状态,可见,可交互,屏幕最前端,位于栈顶。

2)Paused :暂时暂停状态,暂停意味着界面失去了焦点,不可交互,暂时性,有被重新启动的可能性,界面仍然是可见的,与窗口管理器依旧保持连接,系统也继续维护其内部所有状态和成员信息,触发场景:被另外一个新透明的或者Dialog 样式的Activity或者非全屏的Activity覆盖时。

3)Stoped :停止状态,两个不同点,其一:现象,不可见,窗口被完全覆盖了 ;其二:触发场景,被另外一个activity覆盖。相同点就是保持所有的状态,成员信息,和窗口管理器保持连接。

4)Killed :被杀死状态,被系统回收

三.状态之间切换的场景

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。

4)此时如果按下Back键,系统返回到桌面,并依次执行A:onPause -> A:onStop -> A:onDestroy。

5)此时如果按下Home键(非长按),系统返回到桌面,并依次执行A:onPause -> A:onStop。由此可见,Back键和Home键主要区别在于是否会执行onDestroy。

6)当设置启动模式为singletop/singtask 时,非第一次启动,组件实例复用再次启动activity时,则依次调用:onNewIntent()->onResart()->onStart()->onResume()。

四.技巧总结

1)程序员只能决定Activity的生,不能决定其死, Activity.finish() == 用户按下BACK == 告诉Activity Manager 该 Activity对象完成相应工作,并可被回收.

2)Activity 之间通信:通过Intent 对象来表示一条消息。内容可选,但是目的地是必选项【显式】,实现跨进程,小数据存储,Activity. startActivity(intent)启动另外一个 Activity 的时候,我们在 Intent 类的构造器中指定了“收件人地址”。Intent中extra 就是一个bundle对象。Component 属性决定显性还是隐性匹配。还有一种是点击桌面快捷方式来启动根activity.

3)IntentFilter:动态注册需要接收的Intent 类型

匹配规程如下:



Action 匹配:系统动作“ACTION_”开头 / 用户自定义字符串动作;

URI数据匹配: 包括mimeType数据类型/ scheme 协议/ host位置/port端口/path路径;

4)锁定 Activity 运行时的屏幕方向:节点的 android:screenOrientation属性,portrait/landscape 竖屏/横屏.

5)全屏Activity模式:【其他显示模式:WindowsIsFloating浮动窗口/ActivityGroup嵌入其他的activity】

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // 设置全屏模式

requestWindowFeature(Window.FEATURE_NO_TITLE); // 去除标题栏

6) 在 Activity 的 Title 中加入进度条

requestWindowFeature(Window.FEATURE_PROGRESS);

setProgress(5000);

7)当点击了Back键,系统返回到桌面,然后点击应用程序图标,直接回到之前的Activity界面,这种效果是怎么实现的呢? -》通过重写按下Back键的回调函数,转成Home键的效果即可,。

public void onBackPressed() {

Intent home = new Intent(Intent.ACTION_MAIN);

home.addCategory(Intent.CATEGORY_HOME);

startActivity(home);

} 或者activity.moveTaskToBack(true);

五.3个循环

**1)entire lifetime:**onCreate(Bundle)-》onDestroy() 全局生命周期

**2)visible lifetime:****onStart()-》onStop() 可见生命周期,多次调用意味着屏幕反复显示和消失。

**3)foreground lifetime:**onResume()-》onPause() 前台周期,最前端,与用户交互,两种状态间切换频繁,代码要简洁,

1.3. 类图关系;

图一:



图二:



Context类:

1.4. Task和界面组件栈



一. Activity 栈

1)只有activity才可以加入到Activity栈里,返回栈, 用户可以一直按BACK键,直到返回到了主屏。Back键首先是在当前Activity栈中将栈顶元素出栈,然后显示当前Activity栈中下一个Activity。

2)Activity栈可以由多个Task组成

二.Task

1)Task是用户可以完成一个特定目标的一组Activity的集合,具有栈结构的对象,其中的Activity可以从属于不同的进程。典型场景是:不同应用合作完成一项用户任务,当启动一个应用进程时,也就创建了一个与之对应的task。默认默认情况下,一个Activity启动另一个Activity时,两个Activity是放置在同一个task中的,应用task与应用task之前是相互独立的,hone键切换不同的应用,也切换不同的task.

2)用户的操作方式,当我按下back键和home键时,期望跳转到哪个界面,在此activity跳转的过程中,launchmode扮演着重要的角色。

3)launchMode:启动模式,3个作用:其一决定是否生成新的activity实例;其二是否重用已存在的Activity实例;其三是否和其他Activity实例公用一个task。4种类型:android:launchMode属性决定。

3.0.1,Standard:默认的启动模式 【this.toString():当前Activity实例的序列号,相同的序列号代表同一个实例】每次跳转都会在task中生成一个新的firstActivity实例,【Intent intent = new Intent(FirstActivity.this, FirstActivity.class);,需要连续按几次后退键才回到最初的activity】



3.0.2. singleTop:三个序列号是相同的,也就是说使用的都是同一个Activity实例,如果按一下后退键,程序立即退出,说明当前栈结构中只有一个Activity实例,切位于栈顶,重用该实例,并调用其onNewIntent(),而一旦不在栈顶中,则重新创建一个新的实例。



3.0.3.singleTask:说明从SecondActivity跳转到FirstActivity时,没有生成新的实例,但是从FirstActivity跳转到SecondActivity时生成了新的实例,如果发现所在Activity栈中有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例成为栈顶对象,显示到幕前。这个特殊并影响到了生命周期,再次re-launched会调用Activity. onNewIntent(Intent intent)



3.0.4.singleInstance:它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入。(this.getTaskId()显示是否为同一个栈)表示该Activity在系统范围内“实例唯一”。

4) affinity属性:亲和力,拥有相同affinity的多个Activity理论同属于一个task,

5)Intent几种常见的flags:

**5.0.1.**FLAG_ACTIVITY_NEW_TASK系统会寻找或创建一个新的task来放置目标Activity,寻找时依据目标Activity的taskAffinity属性进行匹配,如果找到一个task的taskAffinity与之相同,就将目标Activity压入此task中,如果查找无果,则创建一个新的task,并将该task的taskAffinity设置为目标Activity的taskActivity,将目标Activity放置于此task。注意,如果同一个应用中Activity的taskAffinity都使用默认值或都设置相同值时,应用内的Activity之间的跳转使用这个标记是没有意义的,因为当前应用task就是目标Activity最好的宿主

**5.0.2.**FLAG_ACTIVITY_CLEAR_TOP当Intent对象包含这个标记时,如果在栈中发现存在Activity实例,则清空这个实例之上的Activity,使其处于栈顶

**5.0.3.**FLAG_ACTIVITY_SINGLE_TOP与Activity启动模式中的singleTop效果相同,当task中存在目标Activity实例并且位于栈的顶端时,不再创建一个新的,直接利用这个实例。

**5.0.4.**FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

**5.0.5.**FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

6)的task相关属性

/article/4582633.html

1.5. 参考文档:



/article/7574308.html

/article/1421733.html

http://www.ibm.com/developerworks/cn/opensource/os-cn-android-actvt/

/article/4582631.html

/article/4582632.html

2. Fragment

3. Presentation

4. View

未完待续。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: