Android的四大组件之三--Activity(1)----->生命周期

前面介绍了Service和Braoadcast Receiver,下面介绍android的开发中用的最多的组件Activity;

对于Activity,关键是其生命周期的把握(如下图),其次就是状态的保存和恢复(onSaveInstanceState onRestoreInstanceState),以及Activity之间的跳转和数据传输(intent)。

Activity是一个应用程序组件,提供一个与用户交互完成某项任务(例如拨号、拍照、发送email、看地图)的视图。每一个activity被给予一个窗口,在上面可以绘制用户接口。窗

通常充满屏幕,但也可以小于屏幕而浮于其它窗口之上

  一个应用程序通常由多个activity组成,他们通常是松耦合关系。通常,应用程序中的其中一个activity被指定为"main"activity,就是第一次启动应用程序的时候呈现给用户的那个activity。每个activity可以启动另一个activity,为了完成不同的动作。每一次一个activity启动,前一个activity就停止了,但是前一个activity被系统保留activity的栈上(“back stack”)。当一个新activity启动,它被推送到栈顶,取得用户焦点。Back Stack符合简单“后进先出”原则,所以,当用户完成当前activity然后点击back按钮,它被弹出栈(并且被摧毁),然后恢复之前的activity。

  当一个activity因新的activity启动而停止,它被通知这种状态转变通过activity的生命周期回调函数。一个activity可能会收到许多回调函数,源于它自己的状态变化-无论系统

创建、停止、恢复、摧毁-并且每个回调提供你完成适合这个状态的指定工作的机会。例如,当停止的时候,你的activity应该释放任何大的对象,例如网络数据库连接。当

activity恢复,你可以重新获得必要的资源和恢复被中断的动作。这些状态转换都是activity的生命周期的部分。


如何创建一个activity

创建一个activity,你必须创建一个Activity的子类(或者一个Activity的子类的子类)。在子类中,你需要实现系统回调的回调方法,当activity在它的生命周期的多种状态中转换的

时候,例如当activity被创建、停止、恢复或摧毁。

两个最重要的回调方法是:
a) onCreate()

你必须实现这个方法。系统调用它当创建你的activity的时候。在你的实现中,你应该初始化你的activity的基本的组件。更重要的是,这里就是你必须调用setContentView()来定义activity用户接口而已的地方。
b) onPause()
系统调用这个方法当用户离开你的activity(虽然不总是意味着activity被摧毁)。这通常是你应该提交任何变化,那将会超越user session而存在的(因为用户可能不再回来)。

注:

activity需要在AndroidManifest.xml中进行注册;


Activty的生命周期

先给官网所给的生命周期的图

这些函数定义了整个生命周期关于一个activity。通过实现这些方法,你可以监视三种嵌套的循环在activity生命周期中。


  1)一个activity的整个生命时间发生在onCreate()和onDestroy()函数之间。你的activity应该设置全局状态(例如定义布局)在onCreate(),并且释放所有的资源在onDestroy()。例如,如果你的activity有一个线程在后台跑,从网络下载数据,它可能创建那个线程在onCreate()然后停止线程在onDestroy()。

(onCreate->onStart->onResume->onPause->onStop->onDestroy)正常的流程

(onStop->onRestart->onStart->onResume->onPause->onStop->onDestroy)unvisible

(onStop->onCreate-->onStart->onResume->onPause->onStop->onDestroy)进程被kill的
  2)一个可视的生命期发生在onStart()和onStop()之间。在这期间,用户可以看见activity在屏幕上并且和它交互。例如,onStop()被调时当一个新的activity开始并且这个不再被可见。在这两个函数间,你可以维持资源那些需要用来展现activity给用户的。例如,你可以注册一个BroadcastReceiver在onStart(),然后注销在onStop()当用户不再看见你显示的东西。系统可能会调onStart()和onStop()多次在这整个生命线期间,当activity在是否可见间转换的时候。

(onStart->onResume->onPause->onStop)正常的流程

(onStop->onRestart->onStart->onResume->onPause->onStop)unvisible

(onStop->onCreate-->onStart->onResume->onPause->onStop->onDestroy)进程被kill的
  3)一个activity的前景生命期发生在onResume()和onPause()之间。在这期间,此activity在所有其它activity之上在屏幕上,并且拥有用户焦点。一个activity可以经常转换进和转换出前景--例如,onPause被调用当设备准备休眠,当一个对话框产生。因为这种状态可以经常转换,代码在这两个状态应该轻量,为了避免减慢转换速度使得用户等待。

(onResume->onPause)


下面实现生命周期中得回到函数,通过Log来解析下生命周期的三种情形;

package com.potato; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; public class ActivityLifeCycleDemoActivity extends Activity { final static private String TAG = "ActivityLifeCycleDemoActivity"; /** Called when the activity is first created. */ /** * 创建activity时,一定会调用这个函数; 还有一种是再activity被系统强制销毁,重新创建activity的时候也会被调用; * 这个函数中一般设置activity的布局; */ @Override public void onCreate(Bundle savedInstanceState) { Log.d(TAG, "onCreate"); super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btnActivity = (Button) findViewById(R.id.btn_activity); btnActivity.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ActivityLifeCycleDemoActivity.this.startActivity(new Intent()); } }); Button btnDialog = (Button) findViewById(R.id.btn_dialog); btnDialog.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder builder = new Builder( ActivityLifeCycleDemoActivity.this); builder.setMessage("确认退出吗?"); builder.setTitle("提示"); builder.setPositiveButton("确认", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.setNegativeButton("取消", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } }); } /** * onstop相对应 */ @Override protected void onStart() { Log.d(TAG, "onStart"); // TODO Auto-generated method stub super.onStart(); } /** * onstop相对应 */ @Override protected void onRestart() { Log.d(TAG, "onRestart"); // TODO Auto-generated method stub super.onRestart(); } /** * onPause相对应, 获取焦点 */ @Override protected void onResume() { Log.d(TAG, "onResume"); // TODO Auto-generated method stub super.onResume(); } /** * onResume相对应 当透明的activity或者视图在现有的activity上面时,会被调用; */ @Override protected void onPause() { Log.d(TAG, "onPause"); // TODO Auto-generated method stub super.onPause(); } /** * onRestart相对应 */ @Override protected void onStop() { Log.d(TAG, "onStop"); // TODO Auto-generated method stub super.onStop(); } /** * 完全销毁activity */ @Override protected void onDestroy() { Log.d(TAG, "onDestroy"); // TODO Auto-generated method stub super.onDestroy(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); } }

(1)正常的启动和关闭activity

(2)启动另外一个activity

如果在AndroidManifest.xml中增加android:theme="@android:style/Theme.Dialog"

则在执行,就死第三种情况,

(3)启动一个透明的activity或者对话框

启动对话框,好像没有调用任何一个回调函数。。。。不知为什么。。。。

注:

(1)onPause,onStop,onDestroy三种状态下的activity会在系统资源不足的时候,进程会被kill的;

(2)onPause()他们三个中的第一个被调用的,一旦activity被建立,onPause()是最后一个被保证调用的方法--如果系统必须恢复内存在紧急状态,然后onStop()和onDestroy()可能将不被调用。因此,你应该使用onPause()来写数据(例如edit)的存储。可是,你应该精心挑选哪个信息一定要在onPause()中留住,因为任何何阻塞的操作在这个函数阻塞到下一个activity的转换因而降低用户体验



你可能感兴趣的:(Android的四大组件之三--Activity(1)----->生命周期)