原创内容,转载请注明出处
1、Activity生命周期
Activity翻译成中文表示活动、活跃。在Android中Activity表示的是与用户进行交互的界面,故而Activity是Android的一个重要组件,Android给它定义了它的生命周期,以便资源回收。以下是Activity的生命周期。
如上图可以看出Activity的生命周期可分onCreate()、onStart()、onResume()、onPause()、onStop()、onRestart()、onDestroy()七个阶段。
onCreate方法:Activity第一次被创建时调用,通常在该方法中创建视图,绑定监听器。
onStart方法:Activity将要在前台可见的时候调用,如果之后前台可见,调用onResume,如果不可见调用onStop。
onResume方法:Activity在前台可见,正与用户交互。
onPause方法:当一个新的Activity被创建启动时,使得原本的Activity不可用,则调用该暂停方法。之后如果被唤醒,则调用onResume,如果不可见,则调用onStop停止方法。
onStop方法:当一个新的Activity被创建启动时,使得原本的Activity不可见,则调用该停止方法。之后如果被唤醒,则调用onRestart方法重启Activity。
onRestart方法:当一个Acrivity从停止状态被唤醒时,则调用重启方法。比如调用返回键。
onDestroy方法:Activity手动调用finish方法或者被系统要求资源回收时,调用该方法。
当系统资源不足,系统会进行资源回收,会把处于onStop、onRestart、onDestroy状态的Activity进行回收。
2、Task任务栈
当多个Activity运行时,一般只会有一个Activity和用户进行交互,Android将这些Activity保存在一个任务栈中(栈采用先进后出),Android应用程序每次显示的Activity都处于栈顶的位置。当用户按下返回键时,会将栈顶上的Activity弹出(即当前Activity进入onDestroy状态),显示下一个Activity(即弹出后栈顶上的Activity)。
关于栈的学习可以搜索相关资料,主要的特性是先进后出,后进先出。
3、案例测试
拿上个例子(Acrivity之间跳转)进行修改,让MainActivity和FirstActivity都实现这7个方法,并且打印相关信息。
修改后MainActivity类代码如下
package com.cygoat.myapp; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.EditText; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); System.out.println("-----mainActivity onCreate------"); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); System.out.println("-----mainActivity onStart------"); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); System.out.println("-----mainActivity onRestart------"); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); System.out.println("-----mainActivity onResume------"); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); System.out.println("-----mainActivity onPause------"); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); System.out.println("-----mainActivity onStop------"); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); System.out.println("-----mainActivity onDestroy------"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } public void sendMessage(View view){ Intent intent = new Intent(this,FirstActivity.class); EditText text = (EditText) findViewById(R.id.message); intent.putExtra("message", text.getText().toString()); startActivity(intent); } }
FirstActivity代码如下
package com.cygoat.myapp; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; public class FirstActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first); Intent intent = getIntent(); String message = intent.getStringExtra("message"); TextView textView = (TextView) findViewById(R.id.result); textView.setText("内容为:"+message); System.out.println("-----FirstActivity onCreate------"); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); System.out.println("-----FirstActivity onStart------"); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); System.out.println("-----FirstActivity onRestart------"); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); System.out.println("-----FirstActivity onResume------"); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); System.out.println("-----FirstActivity onPause------"); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); System.out.println("-----FirstActivity onStop------"); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); System.out.println("-----FirstActivity onDestroy------"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.first, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
1.进入应用程序时,首先进入MainActivity界面。
如上图打印日志可以看出,创建MainActivity时,会依次调用MainActivity的onCreate、onStart、onResume方法。
2.点击send按钮时,跳转到FirstActivity界面。如下打印日志
如上打印日志可以看出从MainActivity跳转到FirstActivity时,首先会调用MainActivity的onPause;之后启动FirstActivity,依次调用FirstActivity的onCreate、onStart、onResume方法;最后由于调用MainActivity不可见,故而调用MainActivity的onStop方法来停止MainActivity(如果FirstActivity是对话框模式,即此时MainActivity依然可见,只是不可用,那么MainActivity不会调用onStop)。
3.点击返回按钮,从FirstActivity返回到MainActivity界面
当从FirstActivity返回到MainActivity时,会先调用FirstActivity的onPause方法;之后重启MainActivity,异常调用onRestart、onStart、onResume方法;最后调用FirstActivity的onStop、onDestroy方法
4.修改AndroidManifest.xml,将FirstActivity变成对话框模式,增加配置如下
则在MainActivity跳转到FirstActivity界面上时,结果如下。
如上可以看出由于FirstActivity是对话框模式,故而MainActivity在跳转到FirstActivity时,处于不可用状态,但依然可见,故而跳转过程中不会调用MainActivity的onStop停止方法。
源代码如附件