什么是Activity?
Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器)之一。也是一个view的容器。需要强调的是Activity本身不是界面,但它的主要功能是提供界面,用户可以用来交互为了完成某项任务。Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。(Intent方面请看另一篇博客《Android Intent的使用》)
要想正确的使用Activity,就需要知道Activity的生命周期。
Activity的生命周期:
这里有三个比较关键的生命周期。
下面用一个例子来感受一下Activity的生命周期:
需要两个Activity:MainActivity和test1。
MainActivity:(注释为该方法中常见的操作)
public class MainActivity extends Activity { // 初始化操作 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); System.out.println("onCreate"); Button btn1 = (Button) findViewById(R.id.btn1); btn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, test1.class); startActivity(intent); } }); } // 对资源进行回收 @Override protected void onDestroy() { System.out.println("onDestroy"); super.onDestroy(); } // 注册一些监听(内容观察者) @Override protected void onStart() { System.out.println("onStart"); super.onStart(); } @Override protected void onRestart() { System.out.println("onRestart"); super.onRestart(); } // 再次对数据进行查询 @Override protected void onResume() { System.out.println("onResume"); super.onResume(); } // 数据的临时保存 @Override protected void onPause() { System.out.println("onPause"); super.onPause(); } // 取消监听 @Override protected void onStop() { System.out.println("onStop"); super.onStop(); } }
test1.java:
public class test1 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test1); System.out.println("onCreate1"); Button btn = (Button) findViewById(R.id.test1_btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 数据是使用Intent返回 Intent intent = new Intent(test1.this,MainActivity.class); // 把返回数据存入Intent startActivity(intent); test1.this.finish(); } }); } @Override protected void onDestroy() { System.out.println("onDestroy1"); super.onDestroy(); } @Override protected void onStart() { System.out.println("onStart1"); super.onStart(); } @Override protected void onRestart() { System.out.println("onRestart1"); super.onRestart(); } @Override protected void onResume() { System.out.println("onResume1"); super.onResume(); } @Override protected void onPause() { System.out.println("onPause1"); super.onPause(); } @Override protected void onStop() { System.out.println("onStop1"); super.onStop(); } }
布局文件就不展示了。
运行程序,当前为默认的MainActivity。输出如下:
然后点击MainActivity中的button跳转至test1,输出如下:
最后再点击test1中的button按钮,输出如下:
这下,通过示例应该比较好理解了吧。
Activity横竖屏的切换(Ctrl+F12)
横竖屏切换的时候:
竖屏到横屏:activity首先被销毁,在创建一个新的activity
横屏到竖屏:activity首先被销毁,再创建一个新的activity,再把该activity销毁,再创建一个新的activity.(是由于输入法的影响)
Activity栈:
Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。处于前台的 Activity 总是在栈的顶端,当前台的 Activity 因为异常或其它原因被销毁时,处于栈第二层的 Activity 将被激活,上浮到栈顶。当新的 Activity 启动入栈时,原 Activity 会被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换。(通俗来讲:task的作用就是用来管理Activity的进入,退出。记录了用户的行为。栈顶的Activity是与用户交互的Activity。)Activity 的状态与它在栈中的位置关系如下图所示:
如上所示,除了最顶层即处在 Active 状态的 Activity 外,其它的 Activity 都有可能在系统内存不足时被回收,一个 Activity 的实例越是处在栈的底层,它被系统回收的可能性越大。系统负责管理栈中 Activity 的实例,它根据 Activity 所处的状态来改变其在栈中的位置。
Activity的四种启动模式: (需要在清单文件中配置)
标准模式就不介绍了,简单的介绍一下其他模式:(a代表AActivity,b代表BActivity)
singleTop:我从a跳转到b,再从b跳转到b,最后从b跳转到a。(标准模式的话Activity栈中会有4个Activity,也就是按返回键需要按4次才能退出)此时,按返回键需要按3次,一次从a到b,第二次从b到a,第三次从a退出程序。
singleTask:我从a跳转到b,再从b跳转到a,最后从a跳转到b。(标准模式的话Activity栈中会有4个Activity,也就是按返回键需要按4次才能退出)此时,按返回键需要按2次,一次从b到a,第二次从a退出程序。
singleInstance:这个不太好说啊~上图吧。
注意:
需要在清单文件中进行配置,例如配置标准模式:
<activity android:name="com.topcsa.test_android.test1"
android:launchMode="standard">
以下部分摘自:http://ant-qingyun27sc.iteye.com/blog/1591682
此外,假设有两个Activity,分别是MainActivity,SecondActivity。MainActivity有一个EditText编辑框,设想一种情况:当我们编辑了一些内容时,MainActivity被跳转去了econdActivity,而正好系统又将MainActivity杀死,如果我们不对EditText的内容加以保存,当系统再度恢复MainActivity时,编辑好的内容就不会出现了。
这种情况可以借助onSaveInstanceState方法来保存Acitivity状态。
1 public class MainActivity extends Activity { 2 private final static String KEY="key"; 3 private EditText et; 4 private Button btn; 5 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.main); 10 et = (EditText) findViewById(R.id.et); 11 btn = (Button) findViewById(R.id.btn); 12 if(savedInstanceState!=null&&savedInstanceState.containsKey(KEY)==true){ 13 et.setText(savedInstanceState.getString(KEY)); 14 } 15 btn.setOnClickListener(new OnClickListener() { 16 17 @Override 18 public void onClick(View v) { 19 Intent intent=new Intent(); 20 intent.setClass(getApplicationContext(), main2.class); 21 startActivity(intent); 22 23 } 24 }); 25 } 26 27 28 @Override 29 protected void onSaveInstanceState(Bundle outState) { 30 // TODO Auto-generated method stub 31 super.onSaveInstanceState(outState); 32 String content=et.getText().toString();//将EditText的内容保存到Bundle中,以便下次恢复Activity时读取 33 outState.putString(KEY, content); 34 } 35 36 }