前面介绍了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的生命周期

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

Android的四大组件之三--Activity(1)----->生命周期_第1张图片

这些函数定义了整个生命周期关于一个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的布局; */@Overridepublic 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() {@Overridepublic void onClick(View v) {ActivityLifeCycleDemoActivity.this.startActivity(new Intent());}});Button btnDialog = (Button) findViewById(R.id.btn_dialog);btnDialog.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {AlertDialog.Builder builder = new Builder(ActivityLifeCycleDemoActivity.this);builder.setMessage("确认退出吗?");builder.setTitle("提示");builder.setPositiveButton("确认", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});builder.setNegativeButton("取消", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});builder.create().show();}});}/** * onstop相对应 */@Overrideprotected void onStart() {Log.d(TAG, "onStart");// TODO Auto-generated method stubsuper.onStart();}/** * onstop相对应 */@Overrideprotected void onRestart() {Log.d(TAG, "onRestart");// TODO Auto-generated method stubsuper.onRestart();}/** * onPause相对应, 获取焦点 */@Overrideprotected void onResume() {Log.d(TAG, "onResume");// TODO Auto-generated method stubsuper.onResume();}/** * onResume相对应 当透明的activity或者视图在现有的activity上面时,会被调用; */@Overrideprotected void onPause() {Log.d(TAG, "onPause");// TODO Auto-generated method stubsuper.onPause();}/** * onRestart相对应 */@Overrideprotected void onStop() {Log.d(TAG, "onStop");// TODO Auto-generated method stubsuper.onStop();}/** * 完全销毁activity */@Overrideprotected void onDestroy() {Log.d(TAG, "onDestroy");// TODO Auto-generated method stubsuper.onDestroy();}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);}}

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

(2)启动另外一个activity

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

<activity            android:label="@string/app_name"            android:theme="@android:style/Theme.Dialog"            android:name=".TestAActivity" >            <intent-filter >                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>        </activity>

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

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

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

注:

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

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



更多相关文章

  1. android之Activity的生命周期
  2. Android:android生命周期(详细总结)
  3. Android自动登录 记住用户名密码实现 SharedPreferences
  4. Android横竖屏切换生命周期你真的了解么?
  5. android 4.0横屏重复调用onCreate()函数
  6. Android多用户原理
  7. Android非主用户无线相关设置的显示

随机推荐

  1. 喵喵的华为DevCloud使用指南(3)-项目构建
  2. 网络编程基础2
  3. BlueStore源码分析之事物状态机
  4. 分组密码与模式
  5. 微信小程序生成分享图片踩坑大计划
  6. BlueStore源码分析之对象IO
  7. dom的增删改查
  8. BlueStore源码分析之Cache
  9. js 轮播图功能:上下翻页,自动播放----0409
  10. Ceph Octopus版本Dashboard新增硬盘闪灯