Android Activity总结

来源:互联网 发布:剑三藏剑成女捏脸数据 编辑:程序博客网 时间:2024/06/07 17:39


    Android Activity基础知识:

1. 生命周期

Dialog、PopupWindow、Toast遮盖不会触发生命周期方法

2. 启动模式

  launchMode一共有4种:

  standard: 每次创建一个新的Activity

  singleTop: 当前Activity是否在栈顶,如果不是栈顶就重新创建一个,否则无需创建

  singleTask:所有Task仅一个,杀死上面所有Activity

  singleInstance:单独一个新Task,且仅有一个Activity

3. 状态保存于恢复

4. 启动方式

5. Activity、Window、View之间的关系

Activity -(attach new Window)- PhoneWidow -(setContentView)- View

为什么要有Window?提供多层窗口?

6. 

ServiceManager.get("Activity");

ActivityManagerNative.getDefault();




    Activity通常是学习Android写demo时遇到的第一个类,知名程度可以与经典的打印“Hello World”相媲美,毕竟在Android中即使想在界面上显示一个“Hello World”,也必须先创建Activiy子类在其onCreate方法中创建视图,在视图上添加文字“Hello World”。哈哈,接下来就来看看Android 的四大组件使用频率最高的Activity吧。

一、Activity是什么?

    首先会提出一个问题,Activity到底是什么?
    如果回答Activity四大组件之一也是使用频率最高的组件,这个答案显然令人不满意,那Activiyt到底是什么呢?来看看官方的解释:

    Activity是与Android app提供交互的重要组件。Activity负责创建一个窗口,在这个窗口基础上开发者可以通过setContentView添加UI,Activity默认全屏显示也可以作为浮动窗口显示。
    Activity存在的目的是为了降低耦合,把用户自定义与系统调用分离开。

    例如Activity提供如下处理:
    控制窗口层级与显示关系(例如当前页面有多个弹出窗口,多个Toast每个Dialog与Toat都是新的窗口)
    在窗口中按照创建setContentView传递View对象创建界面。
    在窗口与视图上处理触摸事件、硬键盘事件、滚轮事件。
    在当前视图进行绘制、响应窗口所有事件。
    控制输入法在当前窗口的显示与隐藏。
 
    Activity是UI吗?
    按我的理解不是,这个问题引出另外一个概念UI (User Interface),如果把UI粗浅的理解话搞美术的人画出来的美术作品的话,Activity相当于画架主要是对画出作品时起到支撑作用,但是并不能说画架就是画作本身。

二、Activity的生命周期

通过以下的文章与图片可以了解Activity生命周期具体有哪些,并且每一个的含义是什么,但是还是会发现有两个疑问:

疑问一:
    为什么要有生命周期呢?而且为什么生命周期还要提供这么多方法呢?Android Framework层本身本身就是基于Java的难道不能只提供一个入口,例如mian函数吗?
    答案是Android可以提供周期回调,可以仅提供一个入口其实进把onCreate当做入口就行了,那为什么要提供生命周期这么多回调呢?按我的理解是因为提高性能对现有的对象进行复用。
    Android完全可以仅提供一个接口创建,如果当前Activity处于被遮盖的情况直接把当前Activty给杀死清理掉,但是这样会导致用户再点击回退按钮想看到之前的Acitivyt展示的页面上时,因为被遮盖时给清理掉所以要重新创建,这样消耗资源倒是小事,主要是这个过程肯定要消耗时间,而且这段时间用户也只能等待带来用户体验不好。

疑问二:
    Dialog的显示与隐藏会执行Activity的哪些回调方法?
    按照对Activity生命周期的理解,当Activty界面被部分遮盖的时候会执行onPause,遮盖消失时会执行onResume,但是如果写个Demo并在相应周期方法中打印log会发现Dialog的显示与隐藏不会触发任何的生命周期方法。
    从现象说明了对遮盖触发Activiyt周明周期理解有误,Dialog虽然会遮盖不会触发生命周期方法。但是有些文章中给出的效果图中能看到仅仅一个Dialog浮现在手机屏幕中间,但是onPause与onResume也执行了。这是因为遮盖的Dialog形状的界面其实是Activity 其style格式设置为theme.Dialog,即Activity以Dialog形式仅占据屏幕的中间位置显示并不占满全屏。新的Activity的遮盖当前Activity当然会触发onPause与onResume。


两分钟彻底让你明白Android Activity生命周期(图文)!
http://blog.csdn.net/android_tutor/article/details/5772285


Managing the Activity Lifecycle
http://developer.android.com/training/basics/activity-lifecycle/index.html

Starting an Activity
http://developer.android.com/training/basics/activity-lifecycle/starting.html

Pausing and Resuming an Activity
http://developer.android.com/training/basics/activity-lifecycle/pausing.html

Stopping and Restarting an Activity
http://developer.android.com/training/basics/activity-lifecycle/stopping.html

Recreating an Activity
http://developer.android.com/training/basics/activity-lifecycle/recreating.html


    
    Android应用不可能仅有一个Activity,如果是多个Activity肯定会涉及到如何打开其他Activity的问题,这里整理一下所有Activity的启动方式。

三、状态保存和恢复

1.  
状态保存
onSaveInstanceState -  
在onPause之前调用(切换Activyt回来)

2. 状态恢复
onSaveInstanceState ( BundleoutState) 方法,用于保存当前状态,便于恢复时使用
oncreate(Bundle)  - 官方推荐
onRestoreInstanceState - onstart之后,onresume之前,不能保证绝对执行


四、启动方式

    一个Activity打开另外一个Activity整体有两种启动方式:显示启动、隐式启动

1. 显示启动
// 第一种显示启动方式Intent intent = new Intent(ThisActivity.this, OtherActivity.class);startActivity(intent);// 第二种显示启动方式Intent intent = new Intent();intent.setClass(ThisActivity.this, OtherActivity.class);startActivity(intent);// 第三种显示启动方式Intent intent = new Intent();ComponentName component =                new ComponentName(ThisActivity.this, OtherActivity.class);intent.setComponent( component );startActivityForResult(intent, 10);

主要用于应用内启动其他Activity


2. 隐式启动
Uri uri = Uri.parse("http://www.google.com");   Intent intent   = new Intent(Intent.ACTION_VIEW,uri);startActivity(intent);

例子是打开Android设备的浏览器并打开gogole主页。
隐式启动可以应用内启动其他Activity,主要用于启动其他应用程序

支持返回的启动方式

以上都是使用startActivity方法,目的用于一个Activity启动两外一个,但是如果启动新Activity还想要其返回一个值该如何处理呢?Android针对需要返回值的情况提供了startActivityForResult方法:
     // 第一个Activity打开另外一个     Intent intent = new Intent(ThisActivity.this, OtherActivity.class);     startActivityForResult(intent, 10);

// 第二个activity通过setResult返回一个值并关闭当前ActivitysetResult(88);finish();

// 第一个Activity覆写如下方法接收数据@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == 88) {   Toast.makeText(this, "从Third返回", resultCode ).show(); }}


四、Activity之间传值

主要通过Intent类进行传值,主要使用intent的Extras,内容原理是使用Map键值对保存数据
intent 传递数组、自定义对象等



other
1. Manifest的activty属性
alwayRetainTaskState - 每次重新进入都只看见根(rootActivity)
2. Activity子类
map, list , expandable,tab - Activity
3. fragment
4. loaders 界面异步加载机制
**权限
Intent传递的参数为什么通常要使用Parcelable?
Binder通信,因为startActivity既可以启动当前应用,也可以启动其他应用,也就是其他进程,所以需要通过Binder通信

五、参考资料:

官方文档 - Interacting with Other Apps
http://developer.android.com/training/basics/intents/index.html


列出所有Android支持的启动方式(例如打电话) - Intent类
http://developer.android.com/reference/android/content/Intent.html


如果在官方提供的没有自己想要的,可以看下开源Intent库 - openintents
https://code.google.com/p/openintents/wiki/OpenIntents


Android的七巧板Activity之二 Activity的加载模式
http://winuxxan.blog.51cto.com/2779763/504047


详解 Android 的 Activity 组件
http://www.ibm.com/developerworks/cn/opensource/os-cn-android-actvt/index.html


Note: 问题记录

1. 如果传递的是TreeMap,接收到的是HahsMap

putExtra treeMap returns HashMap cannot be cast to TreeMap android

http://stackoverflow.com/questions/13960153/putextra-treemap-returns-hashmap-cannot-be-cast-to-treemap-android


2013-12-29  更新Parcelable

2014-11-04  更新问题记录







0 0
原创粉丝点击