参考:《Professional Android 4 Application Development》
深入了解Android Activity
每一个Android Activity都对应于一个用户界面(UI)。每个Android Application都有一个main Activity,而这个main Activity大多由多个Fragment组成,而这些Fragment后面往往都由一个或多个secondary Activity支持。当用户在不同的界面(窗口)切换时,Android会生成对应的新Activity。
创建Activity
Android提供了Activity类,在编写自己的Activity时,程序员需要继承Activity并重载里面的方法。例如:
package cn.jubincn.activities;import android.app.Activity;import android.os.Bundle;public class MyActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); }}
空白的Activity对应的是一个空白屏幕,因此我们需要添加Fragment,Layout和View等UI元素来定制自己的Activity。大部分Activity会占据整个屏幕,除此之外,还有一些半透明的Activity和浮动的Activity。
Android应用程序中,用户交互界面和数据的显示是由View来提供的。Android中的layout类,也叫ViewGroup,可以将View打包进行管理。Fragment则用来组织界面元素,从而更方便地适配不同的界面。给Activity设置界面的方法有两种,一种是创建View类,将其设置到Activity中;另一种是将layout文件设置到Activity中,然后Inflate对应的Activity。
@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView = new TextView(this); setContentView(textView);}@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);}
Activity生命周期
Activity的生命周期可以决定Process的优先级,并且Activity需要对生命周期事件进行适当地响应才能提供更好的用户体验。
Activity Stacks
Activity的状态决定于它在Activity Stack中的位置。Activity Stack遵循Stack的“先进后出”的规则:当一个Activity刚被创建时,它会移到栈顶;若用户点击”go back”按钮,或关闭当
前Activity时,栈顶的Activity会被弹出,第二个Activity成为新的栈顶Activity。
Activity State
Activity的生命周期中,有这几种状态:
- Active:在栈顶的Activity,具有最高的优先级,Android会竭力满足它对资源的需求。当其他Activity变为Active状态时,此Activity的状态会变为Paused。
- Paused:处于这个状态的Activity的部分或全部对用户可见,但无法接受用户的输入。
- Stopped:当Activity对用户不可见时,它将转为Stopped状态。此时尽管Activity仍会保留在内存中,但当系统资源紧张时,它会被回收掉。
- Inactive:Activity在启动之前,或被kill之后,处于Inactive状态。
监听并响应Activity State的变化
Activity需要在State发生变化时作出相应的反应,为此Android为Activity的生命周期事件提供了很多相关的ActionHandler,下图展示了Activity的几个生命周期:
对应的代码:
package cn.jubincn.activities;import android.app.Activity;import android.os.Bundle;public class MyStateChangeActivity extends Activity { // Called at the start of the full lifetime. @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Initialize Activity and inflate the UI. } // Called after onCreate has finished, use to restore UI state @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // Restore UI state from the savedInstanceState. // This bundle has also been passed to onCreate. Will only be called if the Activity has been killed by the system since it was last visible. } // Called before subsequent visible lifetimes for an Activity process. @Override public void onRestart(){ super.onRestart(); // Load changes knowing that the Activity has already been visible within this process. } // Called at the start of the visible lifetime. @Override public void onStart(){ super.onStart(); // Apply any required UI change now that the Activity is visible. } // Called at the start of the active lifetime. @Override public void onResume(){ super.onResume(); // Resume any paused UI updates, threads, or processes required // by the Activity but suspended when it was inactive. } // Called to save UI state changes at the end of the active lifecycle. @Override public void onSaveInstanceState(Bundle savedInstanceState) { // Save UI state changes to the savedInstanceState. // This bundle will be passed to onCreate and onRestoreInstanceState if the process is killed and restarted by the run time. super.onSaveInstanceState(savedInstanceState); } // Called at the end of the active lifetime. @Override public void onPause(){ // Suspend UI updates, threads, or CPU intensive processes that don’t need to be updated when the Activity isn't the active foreground Activity. super.onPause(); } // Called at the end of the visible lifetime. @Override public void onStop(){ // Suspend remaining UI updates, threads, or processing that aren’t required when the Activity isn’t visible. // Persist all edits or state changes as after this call the process is likely to be killed. super.onStop(); } // Sometimes called at the end of the full lifetime. @Override public void onDestroy(){ // Clean up any resources including ending threads, closing database connections etc. super.onDestroy(); }}