05.Android之Activity

 

根据Android的SDK文档,记下Activity的一些要点:

一、Activity概述:
Activity是用来和用户交互的,通常通过建立一个窗口,并通过setContentView(View)放置UI。Activity可以是满屏的,也可以是悬浮的(通过windowIsFloating设置)或嵌入在别的Activity中(通过ActivityGroup)。

二、Activity的生命周期:
1、Activity的4个基本状态:
(1)如果Activity在屏幕最前面(即Activity栈的顶部),则状态是“active”或“running”。
(2)如果Activity失去了焦点但仍然是可见的(意思是一个新的非全屏Activity或者一个拥有焦点的透明Activity在你的Activity上面),则状态是“paused”。一个“paused”的Activity是完全存活的(它保留了所有的状态和成员信息并且仍然与窗口管理器绑定着),但是在系统内存告急的时候可能被系统kill掉。
(3)如果一个Activity完全被另一个Activity掩盖,那么被掩盖的Activity的状态是“stopped”。它也仍然保留着所有状态和成员信息,但是对于用户来说不再是可见的,它的窗口被隐藏并且很有可能在别的地方需要内存的时候被系统kill掉。
(4)如果Activity是“paused”或者“stopped”状态,系统可能会询问是否要丢弃它,也可能直接就kill掉它的进程了。当再次展现给用户的时候,它必须完全重启动并重新存储先前的状态。

Activity状态图:
 
2、监控Activity的3个重要的环
(1)entire lifetime:整个生命周期,包含从第一次呼叫onCreate(Bundle)一直到最后呼叫onDestroy()的过程。所有的全局的状态都应该在onCreate()中设置(比如后台线程创建),所有剩余资源都应该在onDestroy()释放(比如后台线程停止)。
(2)visible lifetime:可见生命周期,始于呼叫onStart(),止于onStop()。在这个阶段,用户可以在屏幕上看到Activity,尽管可能不是位于前台跟用户交互。在这两个方法之间可以维系需要显示给用户的资源。比如可以在onStart()中注册一个BroadcastReceiver来监控UI的变化,在onStop()中注销这个BroadcastReceiver,因为此时用户已经看不到该Activity的显示了。
(3)foreground lifetime:始于onResume(),终于onPause()。这个阶段的Activity在其他任何Activity的前面与用户交互。Activity可能频繁的在“resumed”和“paused”状态之间切换,例如设备休眠,Activity结果被传送呼叫,新的Intend被传送呼叫。所以这个周期内的方法中的代码应该是完全轻量级的。

3、在完成如下方法的重载时通常都需要呼叫其超类:
public class Activity extends ApplicationContext {
     protected void onCreate(Bundle savedInstanceState); 
     protected void onStart();      
     protected void onRestart(); 
     protected void onResume(); 
     protected void onPause(); 
     protected void onStop(); 
     protected void onDestroy();
 }

4、启动Activity和获取结果:
(1)startActivity(Intent):简单的启动一个新的Activity。
(2)startActivityForResult(Intent, int):启动一个新的Activity并能在回调函数onActivityResult(int, int, Intent)中获取结果。

5、进程生命周期:
Android系统试图尽可能长久的保持进程,但系统内存低时需要移除老进程。进程是否被移除取决于跟用户交互的紧密程度。通常进程依据其内部运行的Activity的重要性分4种状态。系统kill进程的时候依据其重要性从低到高的顺序(最不重要empty process---->background activity---->visible activity---->foreground activity最重要)。
(1)包含foreground activity进程:被认为是最重要的。它排在被kill顺序的最末尾,并且仅当它占用的内存超过设备可用范围才被kill掉。通常这个操作被执行是因为设备达到了内存分页状态,为了保证UI还能响应。
(2)包含visible activity进程:被认为是及其重要的,除非为了保证foreground activity的运行才会被kill掉。
(3)包含background activity进程:不再认为是及其重要的,所以系统可能安全的kill掉它用来回收内存给其他foreground或visible进程。如果这时候进程被kill,当用户回退到上一个activity时(即在屏幕上再次可见),activity的onCreate(Bundle)会被呼叫并且保留着先前用onSaveInstanceState(Bundle)保存的savedInstanceState,所以activity能保证以用户最近离开它时完全相同的状态重启。
(4)empty prccess:是一个没有activity或者其他应用组件的进程(如Service或BroadcastReceiver类)。它们在系统内存变低时很快就被kill掉了。基于这个原因,任何activity之外的后台操作必须被执行在activity BroadcastReceiver或Service的context中,以确保系统知道它需要保持进程活跃。

特例:有时候avtivity需要做不依赖于它生命周期的长时间操作。比如用相机应用上传图片到web,上传可能需要很长时间,但执行时许用户离开应用。为了完成此功能,activity应该启动一个Service来上传。这允许系统依据activity的状态在上传过程中适当的安排进程的优先级。

 

三、Activity在AndroidManifest.xml文件中的语法,具体每项的含义可以参考Android文档:
<activity android:allowTaskReparenting=["true" | "false"]
          android:alwaysRetainTaskState=["true" | "false"]
          android:clearTaskOnLaunch=["true" | "false"]
          android:configChanges=["mcc", "mnc", "locale",
                                 "touchscreen", "keyboard", "keyboardHidden",
                                 "navigation", "screenLayout", "fontScale", "uiMode",
                                 "orientation", "screenSize", "smallestScreenSize"]
          android:enabled=["true" | "false"]
          android:excludeFromRecents=["true" | "false"]
          android:exported=["true" | "false"]
          android:finishOnTaskLaunch=["true" | "false"]
          android:hardwareAccelerated=["true" | "false"]
          android:icon="drawable resource"
          android:label="string resource"
          android:launchMode=["multiple" | "singleTop" |
                              "singleTask" | "singleInstance"]
          android:multiprocess=["true" | "false"]
          android:name="string"
          android:noHistory=["true" | "false"]  
          android:permission="string"
          android:process="string"
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "reverseLandscape" | "reversePortrait" |
                                     "sensorLandscape" | "sensorPortrait" |
                                     "sensor" | "fullSensor" | "nosensor"]
          android:stateNotNeeded=["true" | "false"]
          android:taskAffinity="string"
          android:theme="resource or theme"
          android:uiOptions=["none" | "splitActionBarWhenNarrow"]
          android:windowSoftInputMode=["stateUnspecified",
                                       "stateUnchanged", "stateHidden",
                                       "stateAlwaysHidden", "stateVisible",
                                       "stateAlwaysVisible", "adjustUnspecified",
                                       "adjustResize", "adjustPan"] >   
    . . .
</activity>

 


 

你可能感兴趣的:(05.Android之Activity)