国王地位的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同样也有着自己的生命周期。
-
生--Active
Active,活动状态,Android平台同一时间只允许一个Active状态的Activity,也就是正处于使用中的那个。 -
老--Paused
paused,暂停状态,是指诸如接电话或者弹出对话框时,原先的屏幕被覆盖并且不能交互,但是还处于可见的状态。 -
病--Stopped
Stopped,停止状态,即退出屏幕但是未被终止或回收的状态。 -
死--Dead
这个很好理解,就是还未启动,或者已经被终止或回收的状态。
- 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,有两种方式。
- 从Activity A启动Activity B,之后就不管了,如同放出去的包子。
- 从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之间的互相通信。