这里通过使用一个简单的例子来解释activity的生命周期方法的使用。这个简单的例子只包括两个activity:MainActivity和SecondActivity,以此来实现activity之间的转换。
下面给出这两个activity的Java源文件:
MainActivity:
package com.weigenshang.activitydemo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private Button button;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("MainActivity中调用onCreate()");
setContentView(R.layout.activity_main);
// 获取代表button的对象
button = (Button)findViewById(R.id.myButton);
textView = (TextView)findViewById(R.id.mytextview);
textView.setText(R.string.textview1);
button.setText(R.string.button);
// 生成监听器对象
ButtonListener buttonListener = new ButtonListener();
// 为button绑定监听器对象
button.setOnClickListener(buttonListener);
}
// 定义一个内部类,且实现接听器接口
class ButtonListener implements View.OnClickListener{
// 实现该监听器接口,需要重写onClick()方法
@Override
public void onClick(View v) {
// 生成一个intent对象
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
MainActivity.this.startActivity(intent);
}
}
@Override
protected void onStart() {
super.onStart();
System.out.println("MainActivity中调用onStart()");
}
@Override
protected void onResume() {
super.onResume();
System.out.println("MainActivity中调用onResume()");
}
@Override
protected void onStop() {
super.onStop();
System.out.println("MainActivity中调用onStop()");
}
@Override
protected void onPause() {
super.onPause();
System.out.println("MainActivity中调用onPause()");
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("MainActivity中调用onDestroy()");
}
@Override
protected void onRestart() {
super.onRestart();
System.out.println("MainActivity中调用onResume()");
}
}
再给出SecondActivity的Java源文件:
package com.weigenshang.activitydemo;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class SecondActivity extends Activity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.println("SecondActivity中调用onCreate()");
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity);
textView = (TextView)findViewById(R.id.mytextview);
textView.setText(R.string.textView2);
}
protected void onStart(){
super.onStart();
System.out.println("SecondActivity中调用onStart()");
}
protected void onResume(){
super.onResume();
System.out.println("SecondActivity中调用onResume()");
}
protected void onPause(){
super.onPause();
System.out.println("SecondActivity中调用onPause()");
}
protected void onDestroy(){
super.onDestroy();
System.out.println("SecondActivity中调用onDestroy()");
}
protected void onRestart(){
super.onRestart();
System.out.println("SecondActivity中调用onRestart()");
}
protected void onStop(){
super.onStop();
System.out.println("SecondActivity中调用onStop()");
}
}
且在logcat(已经设置过滤器)可以看到这样的输出:
即在创建这个新的activity时,android操作系统先后调用了onCreate(),onStart(),onResume()方法。
onCreate()方法:在系统第一次创建一个activity时被调用。在这个方法内,可以设置该activity使用的布局文件,也可以给控件绑定监听器等等。在调用完该方法后,系统随即迅速地调用onStart()方法。
onStart()方法:在activity即将被用户可见时被调用,调用完该方法后,则activity对用户可见。调用完该方法后,系统随即迅速地调用onResume()方法。
onResume()方法:在activity即将可以和用户进行交互时被调用,调用完后则activity获得用户焦点,可以和用户进行交互。
注意:这三个方法是以中间时间间隔很短的方式依次被调用的即:被创建出来后马上就可以被用户可见,可见后马上就可以和用户进行交互。
并且logcat中可以看到这样的输出:
onPause()方法:当即将启动另一个activity时被调用,也就意味着这个activity将要被暂停。在这个方法内应该将当前activity中的操作的数据保存起来,方便返回的时候读取数据恢复原来的activity。有趣的是当手机自动锁屏时,也会调用当前activity的onPause(),且随后会调用onStop().因为其当前activity不可见了。
然后是依次调用SecondActivity的onCreate(),onStart(),onResume()方法来启动SecondActivity并使其获得用户焦点。
onStop()方法:当activity对用户不可见时被调用。因为SecondActivity已经完全覆盖了MainActivity即MainActivity对用户不再可见,所以调用MainActivity的onStop()方法,调用完该方法后activity就处于停止的状态。
注意:启动一个新的Activity时应该先onPause()原来的activity并保存其中的数据;要注意的是当新启动的activity没有完全覆盖掉原来的activity时,比如弹出的是对话框时,这时上一个activity就不会调用onStop()方法
返回到上一个activity,要先把当前的activity暂停即调用当前activity的onPause(),
再调用onRestart()重启已经存在的处于stop状态的MainActivity,再依次调用onStart(),onResume()使MainActivity获得用户焦点,
此时SecondActivity已经被完全覆盖,则调用其onStop(),然后就调用onDestroy()销毁SecondActivity,以节约内存空间。当再次启动SecondActivity时,还需要再次调用onCreate()。
注意:经常是在一个activity获得用户焦点之后就会调用上一个activity的onStop(),因为上一个activity已经是不可见的了;从当前activity返回到上一个activity时,当前activity就会被销毁,下次启动时会重新建立
简要的描述方法的使用:
启动第一个activity:
启动另一个activity:
返回到第一个activity: