Android学习笔记---Log与Activity生命周期

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将出现在发布版本中。

Android学习笔记---Log与Activity生命周期

2.Activity生命周期。

       本人刚开始学习Android,对Android中Activity的生命周期很是模糊。现在把自己的学习和理解记录下来。

先来看一下Activity生命周期的图

Android学习笔记---Log与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;
    }

}

运行程序截图:

Android学习笔记---Log与Activity生命周期

  1. 我们打开程序运行MainActivity时 执行的选后顺序为:onCreate===>onStart===>onResume 见下图。

Android学习笔记---Log与Activity生命周期

2.此时我们点击  Android学习笔记---Log与Activity生命周期  回到主界面 此时MainActivity停止运行在后台  执行顺序。  onPause===》onStop

Android学习笔记---Log与Activity生命周期

3.如果此时 点击MainActivity的快捷图标 运行程序,程序将回到你点击回主界面时的状态 。此时执行的顺序为:onRestart==>onStart==>onResume.

Android学习笔记---Log与Activity生命周期

4.如果我们点击Android学习笔记---Log与Activity生命周期 关闭销毁MainActivity 执行顺序如下图: onPause===>onStop===>onDestroy

Android学习笔记---Log与Activity生命周期

 

 第二个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时 Android学习笔记---Log与Activity生命周期  执行顺序 MainActivity--onPause==>SencondActivity-onCreate==>SencondActivity-onStart

==>SencondActivity-onResume==>MainActivity-onStop.

 

Android学习笔记---Log与Activity生命周期

6.如果此时点击Android学习笔记---Log与Activity生命周期 将回到主机界面。

Android学习笔记---Log与Activity生命周期

7.此时点击程序快捷图标,**程序。这个和 MianActivity 的操作时一样。此时**的为SecondActivity 而MainActivity并没有执行任何操作。

Android学习笔记---Log与Activity生命周期

8.如果我们点击Android学习笔记---Log与Activity生命周期  SecondActivity将会关闭销毁。执行顺序SecondActivity-onPause===>MainActivity-onRestart===>MainActivity-onStart===>

MainActivity-onResume===>SecondActivity-onStop===>SecondActivity===onDestory.

Android学习笔记---Log与Activity生命周期

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>

效果图:Android学习笔记---Log与Activity生命周期

启动 弹出一个对话框。执行顺序 MainActivity-onPause===>ThirdActivity-onCreate===>ThirdActivity-onStart===>ThirdActivity-onResume

Android学习笔记---Log与Activity生命周期

10.点击 Android学习笔记---Log与Activity生命周期  回到主界面程序  执行顺序 ThirdActivity-onPause===>MainActivity-onStop===>ThirdActivity-onStop

Android学习笔记---Log与Activity生命周期

11.此时点击 程序图标 启动程序  执行顺序 MainActivity-onRestart==>MainActivity-onStart==>ThirdActivity-onRestart==>

ThirdActivity-onStart===>ThirdActivity-onResume

Android学习笔记---Log与Activity生命周期

12.此时点击 Android学习笔记---Log与Activity生命周期  或者点击关闭按钮。执行顺序 ThirdActivity-onPause==>MainActivity-onResume==>

ThirdActivity-onStop==>ThirdActivity-onDestory

Android学习笔记---Log与Activity生命周期

 

本写到这里,有不足的地方欢迎值出来 互相学习。

源码文件下载:6.ActivityDemo.rar