虚度人生

导航

国王地位的Activity

Android的SDK中引入了几个概念,其中最重要的一个应该就是Activity。

1. 初识Activity

那什么是Activity呢,简单来说,就是一个负责处理一个屏幕包括这个屏幕内所有的控件及交互的类。当我们切换屏幕的时候,也就切换到了另一个 Activity。绝大多数时间,用户以及开发人员,都是在与Activity打交道。

OK,先看一个例子:

TestActivity.java:

package com.hvt;
import android.app.Activity;
import android.os.Bundle;
public class TestActivity extends Activity {
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
} }

AndroidManifest.xml:







main.xml:




从以上代码可见,Activity其实包含了3个部分,AndroidManifest中的配置,作为View层的main.xml以及java类 TestActivity,缺一不可。如果我们的程序非常简单,可能不需要切换屏幕,那么修改自动生成的Activity即可。但通常情况下,都需要增加 一个或多个Activity,这时候就需要我们自己手动的修改这3个部分,ADT并没有提供给我们一键生成式的快捷功能,这不得不说是件很遗憾的事 情。

2. Activity的生老病死

作为一个生物,总逃脱不了生老病死,生存在虚拟机中的Activity同样也有着自己的生命周期。

  1. 生--Active

    Active,活动状态,Android平台同一时间只允许一个Active状态的Activity,也就是正处于使用中的那个。
  2. 老--Paused

    paused,暂停状态,是指诸如接电话或者弹出对话框时,原先的屏幕被覆盖并且不能交互,但是还处于可见的状态。
  3. 病--Stopped

    Stopped,停止状态,即退出屏幕但是未被终止或回收的状态。
  4. 死--Dead

    这个很好理解,就是还未启动,或者已经被终止或回收的状态。
Android的应用开发都是建立在Android框架的基础上,对于Activity来说,我们不需要关心如何转换状态,而只要实现相应的回调函数,来等待Android框架的调用。主要有以下几个:
  • onCreate:最常见的,也是第一个入口函数。
  • onStart:紧接着onCreate之后的回调函数,这时候,我们在屏幕上已经可以看见这个Activity了。
  • onResume: 这一步以后,则真正进入了Active状态,用户已经可以自由交互了。
  • onPause: 从名称就可以看出,进入paused状态了要,与onResume相对。 
  • onStop:进入stop状态,和屏幕说byebye了。
  • onRestart:在stop状态后如果想要转入Active,则需要restart,然后再走start->resume的流程。 
  • onDestory:顾名思义,被销毁了,也就彻底死了,进入Dead状态。
  • onSaveInstanceState: 这个回调函数是当一个Activity要被干掉的时候,系统给了它一次存储当前状态的机会,以供onCreate或 onRestoreInstanceState调用,注意,并不是每次都会被调用,而是在这个Activity有可能回复的情况下,如Activity B在Activity A上面,如果这时候内存不够,回收A,那么A就会调用onSaveInstanceState,但是B自始至终不会调用 onSaveInstanceState,详见官方文档
  • onRestoreInstanceState:在onStart后调用,与onSaveInstanceState相对。
各个转换的过程可以看图:

 

3. Activity与Activity

要从一个Activity转到另一个Activity,有两种方式。

  1. 从Activity A启动Activity B,之后就不管了,如同放出去的包子。
  2. 从Activity A启动Activity B,监听B结束后的返回结果,如同放出去的鸽子。

但无论哪个,都必须通过Intent这个东东。让我们分别来看一下代码:

直接启动

public class ActivityA extends Activity {
             @Override
             public void onCreate(Bundle savedInstanceState) {
                 super.onCreate(savedInstanceState);
                 setContentView(R.layout.main);
                 ((Button)findViewById(R.id.btn)).setOnClickListener(new OnClickListener() {
                     @Override
                     public void onClick(View v) {
                         Intent intent = new Intent();
                         intent.setClass(ActivityA.this, ActivityB.class);
                         startActivity(intent);
                     }
                 });
             }
         }

可以看出Intent就是Activity之间传递数据的载体,构造一个Intent,然后指定Class为需要启动的ActivityB.class,调用startActivity,android框架则会自动启动ActivityB

返回启动

public class ActivityA extends Activity {
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                ((Button)findViewById(R.id.btn)).setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent();
                        intent.setClass(ActivityA.this, ActivityB.class);
                        startActivityForResult(intent, 123);
                    }
                });
            }
            @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                if (requestCode == 123 && resultCode == 456) {
                    ((TextView)findViewById(R.id.text)).setText(data.getExtras().getString("back"));
                }
            }
}
public class ActivityB extends Activity {
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.another);
                ((Button)findViewById(R.id.btn)).setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent();
                        intent.putExtra("back", "I'll be back");
                        setResult(456, intent);
                        finish();
                    }
                });
            }

调用方法还是差不多,只是startActivity改为startActivityForResult,但是多了一个onActivityResult回调,将在ActivityB结束后自动调用。

ActivityB则可以通过构造一个Intent,调用setResult,传递intent,将数据传回ActivityA以实现两个Activity之间的互相通信。 

posted on 2010-03-05 12:07  nozer0  阅读(508)  评论(1编辑  收藏  举报