• Android学习笔记Activity状态保存及Activity主题皮肤学习


    Activity状态保存应用及Activity的主题皮肤学习

    1.Activity状态的保存.

          Activity生命周期函数事项介绍。

     生命周期中的函数                                    函数的详细描述                                                               是否能杀死进程程序           下个执行的函数方法

     1.onCreate()                    当activity被创建时调用。这是做一般的静态初始化的地方,比如创建界面,                   否                             onStart()

                                          把数据绑定到列表,等等之类。这个方法会被传入一个 Bundle对像,它包含了

                                          activity的上一次(关闭时)的状态(如果这个状态可以得到)。

                                          此方法后面永远跟着onStart()。

     

    2.onReStart()                   在停止后被调用,但不是停止后马上调用,而是在再次开始前调用,                            否                              onStart()

                                          也就是在再次调用onStart()之前立即调用。

     

    3.onStart()                     当activity变成可见后立即调用它。如果activity成为最上层,                                      否                        onResume()或onStop()

                                         则调用onResume(),如果完全被摭盖,就调用onStop()。

     

    4.onResume()                 当activity处于最上层时,立即调用此方法。                                                            否                          onPause()

                                          此时activity获得输入焦点。后面跟着onPause()。

     

    5.onPause()                 当另一个activity要进入Pause状态时调用此方法。这个方法一般是                                    是                  onResume()或onStop()

                                      用来提交那些发生改变的永久化的数据们,停止动画和其它消耗CPU的玩意们。

                                      这些工作必须以最快的速度完成,因为在这个方法返回之前,

                                      另一个activity就不能进入resume状态。当它又回到最上层时,后面跟着onResume(),      

                                      当它被完全摭盖时,后面跟着onStop()。

     

    6.onStop()                当activity被完全摭盖时被调用。当activity要销毁时或被其它activity完全                             是                  onRestart()或onDestory()

                                   摭盖时都会发生。如果这个activity又回到最上层,则后面跟着onRestart(),

                                   如果它逝去了,则跟着onDestroy()。

     

     

    7.onDestory()         在activity销毁之前被调用。这是activity能收到的最后一个调用。                                        是                            进程关闭程序完全销毁

                                调用的原因可能是别人在这个activity上调用了finish(),也可能是系统为了更多的

                                内存空间而把它所在的进程处死了。在这个方法中,

                                 可以调用isFinishing()来判断自己属于哪一种死法。

     

         如果我们在进行操作这时 有其他的动作要执行,这时程序就会处于 onStop()状态,由于设备的内存资源消耗的太大,Android操作系统就会杀死一些进程,

    来释放资源,这时我们就要在杀死之前保存上次操作时的数据和状态。

    注意:要保存数据要覆盖 :  protected void onSaveInstanceState(Bundle outState) 在此方法中进行运行程序状态和数据的保存。

    直接上显示源码

    前台布局源码:

    <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_account"
            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">
        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="密       码:"/>
       <EditText android:id="@+id/txt_password"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
          android:inputType="textPassword"/>
    </LinearLayout>
    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
         <Button android:id="@+id/btn_login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="登陆"/>
         <Button android:id="@+id/btn_exit"
             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 final static String CONFIG="Account";
        private EditText txt_account=null;
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Log.i(TAG, "MainActivity==onCreate");
            txt_account=(EditText)findViewById(R.id.txt_account);
            //判断获取保存的数据
            if(null!=savedInstanceState && savedInstanceState.containsKey(CONFIG))
            {
                String account=savedInstanceState.getString(CONFIG);
                txt_account.setText(account);
            }
            Button btn_login=(Button)findViewById(R.id.btn_login);
            btn_login.setOnClickListener(listener);
            Button btn_exit=(Button)findViewById(R.id.btn_exit);
            btn_exit.setOnClickListener(listener);
            
        }
        //保存状态覆盖此方法
        @Override
        protected void onSaveInstanceState(Bundle outState)
        {
            super.onSaveInstanceState(outState);
            Log.i(TAG, "MainActivity==onSaveInstanceState");
            //保存数据
            outState.putString(CONFIG,txt_account.getText().toString());
        }
    
        private OnClickListener listener=new OnClickListener()
        {
    
            @Override
            public void onClick(View view)
            {
                Button btn=(Button)view;
                switch (btn.getId())
                {
                case R.id.btn_login:
                      {
                          Intent intent=new Intent(MainActivity.this,SecondActivity.class);
                          
                          MainActivity.this.startActivity(intent);
                       }
                    break;
                case R.id.btn_exit:
                    finish();
                    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;
        }
    
    }

    效果图:

       

    运行LogCat日志信息。此时我们点击登录到第二个Activity时 。就会调用  onSaveInstanceState()方法进行保存。

    :

    由于本人用模拟器无法演示:程序在OnStop()时被Android系统杀死。如果在后台被系统杀死前,就会调用onSaveInstanceState()方法进行保存。

    如果此时在启动应用程序  在onCreare()方法中 判断  Bundle 的值 ,取出临时保存的程序的运行状态就数据。

    2.Activity的主题设置。

                                          android:theme

                      1. android:theme="@android:style/Theme.Dialog"

                      2. android:theme="@android:style/Theme.NoTitleBar"

                      3. android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

                      4. android:theme="Theme.Light" android:theme="Theme.Light.NoTitleBar"

                      5. android:theme="Theme.Light.NoTitleBar.Fullscreen"

                      6. android:theme="Theme.Black" android:theme="Theme.Black.NoTitleBar"

                      7. android:theme="Theme.Black.NoTitleBar.Fullscreen"

                      8.android:theme="Theme.Wallpaper"

                       9.android:theme="Theme.Wallpaper.NoTitleBar"

                      10. android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen"

                      11.android:theme="Translucent"

                      12. android:theme="Theme.Translucent.NoTitleBar"

                      13.android:theme="Theme.Translucent.NoTitleBar.Fullscreen"

                      14.android:theme="Theme.Panel" android:theme="Theme.Light.Panel"

    简单对主题进行截图介绍:我们对SecondActivity 运行主题Theme  

    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:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />
        <Button android:id="@+id/btn_close"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="关闭"/>
    </LinearLayout>

    后台源码

    public class SecondActivity extends Activity
    {
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
            Button btn_close=(Button)findViewById(R.id.btn_close);
            btn_close.setOnClickListener(new OnClickListener(){
    
                @Override
                public void onClick(View v)
                {
                    finish();
                    
                }});
        }
    
        @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;
        }
    
    }

    没有应用Theme主题是 截图

       在配置文件中添加主题:

     <activity
                android:name="com.example.activitysavestatedemo.SecondActivity"
                android:label="@string/title_activity_second"
                android:theme="@android:style/Theme.Dialog" >
            </activity>

    1.android:theme="@android:style/Theme.Dialog"  效果截图:   弹出一个模式对话框,此时只能操作对话框。

    2.android:theme="@android:style/Theme.NoTitleBar" 效果截图 :背景变黑色  去掉了标题栏。      

    3.android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  效果图:背景黑色  连时间 和 电池电量的也消失了。程序占满整个屏幕。

    4.android:theme="@android:style/Theme.Light" 效果图:和默认没有什么区别。

    5.android:theme="@android:style/Theme.Light.NoTitleBar" 效果图:标题栏消失了。

    6.android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" 效果图:全屏  占据整个设备屏幕。

    7.android:theme="@android:style/Theme.Black"  和 4 的截图一样 只是背景为 黑色(Black)

    8.android:theme="@android:style/Theme.Black.NoTitleBar"  和5 的截图一样 只是背景为 黑色(Black)

    9.android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" 和6 的截图一样 只是背景为 黑色(Black)

    10.android:theme="@android:style/Theme.Wallpaper" 效果图:和4 的截图一样 只是背景为 设备的壁纸。

    11.android:theme="@android:style/Theme.Wallpaper.NoTitleBar" 效果图:和5 的截图一样 只是背景为 设备的壁纸。

    12.android:theme="@android:style/Theme.Wallpaper.NoTitleBar.Fullscreen" 效果图:和6 的截图一样 只是背景为 设备的壁纸。

    13.android:theme="@android:style/Translucent" 截图为:  和 4 的截图一样 只是背景为 半透明

    14.android:theme="@android:style/Theme.Translucent.NoTitleBar"效果图:和5 的截图一样 只是背景为 半透明。

    15.android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"  效果图:和6 的截图一样 只是背景为 半透明。

    16.android:theme="@android:style/Theme.Panel"   效果图:很像Theme.Dialog  但是不同是 背景颜色 还有 没有标题栏。一个Panel容器。

    17.android:theme="@android:style/Theme.Light.Panel"  效果图:和Them.Panel没有发现有什么特别之处。

    18.android:theme="@android:style/Theme.InputMethod"  效果图: 和 16 和 17没有发现什么区别。

     

    19..android:theme="@android:style/Theme.NoDisplay"  效果图: 点击时Activity并没有显示出来。

     

    20..android:theme="@android:style/Theme.WallpaperSettings"  效果图 :有如 模式对话框。并半透明。

     本文写到这里。写的很啰嗦。欢迎同行们指出不足之处。

    源码下载:Activity状态保持及主题.rar

     

  • 相关阅读:
    分治与线段树
    PAT甲级 1006
    PAT甲级 1001
    单源最短路 Dijkstra
    图的邻接矩阵与邻接表
    Huffman树 建树方法代码实现
    小根堆模板类
    二叉搜索树的搜索和插入与删除算法优化
    完全二叉树模板
    二叉树模板及二叉树的无递归遍历
  • 原文地址:https://www.cnblogs.com/xieyong_198510/p/3458540.html
Copyright © 2020-2023  润新知