zoukankan      html  css  js  c++  java
  • 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将出现在发布版本中。

    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.

     

    6.如果此时点击 将回到主机界面。

    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

  • 相关阅读:
    九宫格小游戏源码分享
    DeviceOne 竟然做出来如此复杂的App
    DeviceOne 让你一见钟情的App快速开发平台
    MySQL初始化
    MySQL的操作
    MySQL
    Library
    Python模块
    Anaconda的使用
    面向对象之成员修饰 特殊成员 methclass
  • 原文地址:https://www.cnblogs.com/xieyong_198510/p/3454789.html
Copyright © 2011-2022 走看看