• 热门专题

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

作者:  发布日期:2013-12-06 22:09:28
Tag标签:Android  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;
        }
    
    }

    效果图:

    data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05213051-a948a84edc4c46f0bcd6e4ead42d60bf.jpg   

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

    :data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05213310-e66f684facba438b90d134611bba4e0e.jpg

    由于本人用模拟器无法演示:程序在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主题是 截图

    data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05215854-31fd06a4171d486c86dac990cabe91e0.jpg   在配置文件中添加主题:

     <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'  效果截图:   弹出一个模式对话框,此时只能操作对话框。

    data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05220400-6e78fd02e2a343ffa0b803303bc761fa.jpg

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

    data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05220509-0cd325ec85724e099827c69ee84d86b4.jpg

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

    data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05220847-f9e7798bcbee48e0bbe3366d314a888c.jpg

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

    data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05221151-9aa93e2c50d244c3bb10a3b6e9a74810.jpg

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

    data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05221520-f7067f021d3c4db09a0e71c97bc13979.jpg

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

    data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05221708-bb849788949a4bfca52d9bb3b683a6eb.jpg

    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 的截图一样 只是背景为 设备的壁纸。

    data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05222657-e851e6cf89c141c7870715ec8221b46f.jpg

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

    data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05222450-ed8e2cd9b14740a7bf055b81596c106e.jpg

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

    data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05222836-080a221770b441978164e97427e351c5.jpg

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

    data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05223140-9cc5537b4b594cd48c753fd0f335fd4a.jpg

    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容器。

    data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05223413-aa1c0ddd2ec64d628ffdaa46265ccb33.jpg

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

    data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05223726-dd227bb349de4e7db2358c288ae50811.jpg

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

    data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05223925-976f5b39474f4d238e441fefadf35c71.jpg

     

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

     

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

    data-cke-saved-src=http://www.it165.net/uploadfile/files/2013/1206/05224445-f95cb59609664b1b9876f79e34e5293b.jpg

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

     

     

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规