Android学习笔记---Activity生命周期
1. Log类的应用。
Log.v(String tag, String msg); //VERBOSE
Log.d(String tag, String msg); //DEBUG
Log.i(String tag, String msg); //INFO
Log.w(String tag, String msg); //WARN
Log.e(String tag, String msg); //ERROR
以上log的级别依次升高,VERBOSE DEBUG信息应当只存在于开发中,INFO,WARN,ERROR这三种log将出现在发布版本中。
2.Activity生命周期。
本人刚开始学习Android,对Android中Activity的生命周期很是模糊。现在把自己的学习和理解记录下来。
先来看一下Activity生命周期的图
一个Activity有三种状态:
1. 激活或者运行状态,运行在前台(在当前Activity栈的栈顶)。
2. 暂停状态,失去了焦点但是仍然对用户可见,比如有其他的Activity在它之上,或者透明或者没有遮住整个屏幕。
3.停止状态,被其他Activity覆盖,需要注意的是包括暂停状态在内,这两种状态都仍然保存了所有状态信息,直到被系统终止。
Activity各个状态直接的转换,被一下方法所监听。
protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy();
可以通过复写上面7个方法来做适当的工作。
onCreate()是必须被实现的,来初始化Activity的状态。
一般都会在onPause()里来提交数据的改变以准备中止和用户的交互。
注意:所有这些Activity的生命周期方法的实现都应该先调用其父类的方法 如下所示:
protected void onStart() { // TODO Auto-generated method stub super.onStart(); Log.i(TAG, "MainActivity==onStart"); }
下面我们来写个Demo来演示一下Activity的生命周期过程。
1.单个Activity的生命周期过程。我们创建一个 MainActivity
前端布局文件。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:orientation="vertical" android:layout_height="fill_parent" tools:context=".MainActivity" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="用户名:"/> <EditText android:id="@+id/txt_name" android:layout_width="fill_parent" android:layout_height="wrap_content"/> LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_second" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="弹出第二个Activity"/> <Button android:id="@+id/btn_third" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="弹出一个对话框"/> LinearLayout> LinearLayout>
后台覆盖方法源码:
public class MainActivity extends Activity { private final static String TAG="MainActivity"; private EditText txt_name=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG,"MainActivity==onCreate"); txt_name=(EditText)findViewById(R.id.txt_name); Button btn_second=(Button)findViewById(R.id.btn_second); btn_second.setOnClickListener(listener); Button btn_third=(Button)findViewById(R.id.btn_third); btn_third.setOnClickListener(listener); } private OnClickListener listener=new OnClickListener() { @Override public void onClick(View view) { Button btn=(Button)view; switch (btn.getId()) { case R.id.btn_second: { Intent intent=new Intent(MainActivity.this,SecondActivity.class); String name=txt_name.getText().toString(); intent.putExtra("Name",name); MainActivity.this.startActivity(intent); } break; case R.id.btn_third: Intent intent=new Intent(MainActivity.this,ThirdActivity.class); intent.putExtra("Name", txt_name.getText().toString()); startActivity(intent); break; default: break; } } }; @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Log.i(TAG, "MainActivity==onStart"); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); Log.i(TAG, "MainActivity==onRestart"); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Log.i(TAG, "MainActivity==onResume"); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); Log.i(TAG, "MainActivity==onPause"); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Log.i(TAG, "MainActivity==onStop"); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.i(TAG, "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.activity_main, menu); return true; } }
运行程序截图:
1. 我们打开程序运行MainActivity时 执行的选后顺序为:onCreate===>onStart===>onResume 见下图。
2.此时我们点击 回到主界面 此时MainActivity停止运行在后台 执行顺序。 onPause===》onStop
3.如果此时 点击MainActivity的快捷图标 运行程序,程序将回到你点击回主界面时的状态 。此时执行的顺序为:onRestart==>onStart==>onResume.
4.如果我们点击 关闭销毁MainActivity 执行顺序如下图: onPause===>onStop===>onDestroy
第二个Activity 用打开的 SencondActivity的前台布局源码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".SecondActivity" > <TextView android:id="@+id/txtView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <Button android:id="@+id/btn_back" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="关闭"/> LinearLayout>
后台源码:
public class SecondActivity extends Activity { private final static String TAG="MainActivity"; private TextView txtView=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Intent intent=getIntent(); Bundle bundle=intent.getExtras(); txtView=(TextView)findViewById(R.id.txtView); String name=bundle.getString("Name"); txtView.setText(name); Button btn=(Button)findViewById(R.id.btn_back); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); Log.i(TAG, "SecondActivity=====onCreate"); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Log.i(TAG, "SecondActivity=====onStart"); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); Log.i(TAG, "SecondActivity=====onRestart"); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Log.i(TAG, "SecondActivity=====onResume"); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); Log.i(TAG, "SecondActivity=====onPause"); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Log.i(TAG, "SecondActivity=====onStop"); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.i(TAG, "SecondActivity=====onDestory"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_second, menu); return true; } }
5.我们点击打开一个新的SecondActivity时 执行顺序 MainActivity--onPause==>SencondActivity-onCreate==>SencondActivity-onStart
==>SencondActivity-onResume==>MainActivity-onStop.
7.此时点击程序快捷图标,激活程序。这个和 MianActivity 的操作时一样。此时激活的为SecondActivity 而MainActivity并没有执行任何操作。
8.如果我们点击 SecondActivity将会关闭销毁。执行顺序SecondActivity-onPause===>MainActivity-onRestart===>MainActivity-onStart===>
MainActivity-onResume===>SecondActivity-onStop===>SecondActivity===onDestory.
9.弹出一个对话框 ThirdActivity 如下:ThirdActivity布局程序及后台源码
前台布局源码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" tools:context=".ThirdActivity" > <TextView android:id="@+id/txtthridView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello_world" /> <Button android:id="@+id/btn_thridback" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="关闭"/> LinearLayout>
后台源码:
public class ThirdActivity extends Activity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_third); Log.i(TAG, "ThirdActivity=====onCreate"); Intent intent=getIntent(); Bundle bundle=intent.getExtras(); TextView txtView=(TextView)findViewById(R.id.txtthridView); txtView.setText(bundle.getString("Name")); Button btn=(Button)findViewById(R.id.btn_thridback); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Log.i(TAG, "ThirdActivity=====onStart"); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); Log.i(TAG, "ThirdActivity=====onRestart"); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Log.i(TAG, "ThirdActivity=====onResume"); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); Log.i(TAG, "ThirdActivity=====onPause"); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Log.i(TAG, "ThirdActivity=====onStop"); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.i(TAG, "ThirdActivity=====onDestory"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_third, menu); return true; } }
注意:要弹出 对话框 要在配置文件中修改 Activity的主题:在application中添加如下标签
<activity android:name="com.example.activitydemo.ThirdActivity" android:label="@string/title_activity_third" android:theme="@android:style/Theme.Dialog" > activity>
启动 弹出一个对话框。执行顺序 MainActivity-onPause===>ThirdActivity-onCreate===>ThirdActivity-onStart===>ThirdActivity-onResume
10.点击 回到主界面程序 执行顺序 ThirdActivity-onPause===>MainActivity-onStop===>ThirdActivity-onStop
11.此时点击 程序图标 启动程序 执行顺序 MainActivity-onRestart==>MainActivity-onStart==>ThirdActivity-onRestart==>
ThirdActivity-onStart===>ThirdActivity-onResume
12.此时点击 或者点击关闭按钮。执行顺序 ThirdActivity-onPause==>MainActivity-onResume==>
ThirdActivity-onStop==>ThirdActivity-onDestory
本写到这里,有不足的地方欢迎值出来 互相学习。
源码文件下载:6.ActivityDemo.rar