zoukankan      html  css  js  c++  java
  • android——利用SharedPreference做引导界面

    很久以前就接触过sharedPreference这个android中的存储介质。但是一直没有实际使用过,今天在看之前做的“民用机型大全”的app时,突然想到可以使用sharedPreference类来改进这个app中的一个缺陷。   
    此前,我先介绍sharedPreference的使用。
    Android数据总共有四种存储的方式   
     
     一、SharePreference
      
    二、SQLite   
      三、File   
      四、ContentProvider

    SharedPreference类是一个轻量级的存储类,特别适合保存软件的配置参数。SharedPreference实际上是生成一个xml文件来存放数据,这个xml文件生成以后的存放位置在“/data/data/<package name>/shared_prefs”目录下。
    SharedPreference类的使用流程如下:   
      一、获取SharedPreference类的实例化对象   
      二、获取Editor对象用于编辑SharedPreference类实例  
      三、利用Editor添加(修改)数据   
      四、使用commit()提交事务   

    一、获取SharedPreference类的实例化对象   
      获取SharedPreference类实例化的对象的方法有两种
      
    (1)Context.getSharedPreferences(String name,int mode)    
      参数解析:   
        a)name是SharedPreference生成的xml文件的文件名,假设参数name处填写为“firstTest”,那么代码执行后SharedPreference将生成一个firstTest.xml文件。这个xml采用键-值对的形式保存参数。   
        b) mode是创建模式,是设定SharedPreference的存储的模式,总共有四种参数:    
          Context.MODE_PRIVATE: 默认的操作模式,代表文件是私有数据,只能被本地应用访问    
          Context.MODE_APPEND: 检查文件是否存在,存在则往文件中追加内容,否则创建新文件    
          Context.MODE_WORLD_READABLE:   当前文件可被其他应用程序读取    ·
          Context.MODE_WORLD_WRITEABLEs:   当前文件可被其他应用程序写入
      (2)Activity.getPreferences(int mode)   
      这种方式下,name是通过getLocalClassName()得到的,不能让我们自己设置,而且最终会调到ContextWrapper的getSharedPreferences()        
      推荐使用第一种方法获取SharedPreference类的实例化对象

    二、获取Editor对象    
      SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。具体实现如下
    SharedPreferences sp = ctx.getSharedPreferences("Test", MODE_PRIVATE);  
    Editor editor = sp.edit();
    三+四、利用Editor添加(修改)数据+使用commit()提交事务     
      Editor中内置了一些常用变量的写入函数(使用键-值对),方便存储数据,存储完数据之后,一定要使用commit()函数提交事务,才能完成数据的存储,具体实现如下:        
    editor.putString("STRING_KEY", "string");        
    editor.putInt("INT_KEY", 0);        
    editor.putBoolean("BOOLEAN_KEY", true);        
    editor.commit();

    通过SharedPreference类,我们就可以实现【用户引导功能】只在第一次进入app时执行。具体实现如下:
    /**
     * 该类是进入app的第一个界面,显示开启app的动画
     * @author LiXuetao
     */
    public class startAnimationActivity extends Activity {
        public static final int SKIP_GUIDE = 0x001;
        public static final int SKIP_MAIN = 0x002;
        SharedPreferences sharedPreferences; 
        //该线程用于延迟跳转activity
        Thread thread;
        //判断是否第一次打开该应用
        Boolean b;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_startanimation);
            /**
             * context.getgetSharedPreferences(String name, int mode) 获取sharedPreference对象
             * name是sharedPreference生成的xml文件的名字
             */
            sharedPreferences = getSharedPreferences("test", Context.MODE_PRIVATE);
            thread = new Thread(runnable);
            thread.start();
        }
    
        //此handler用于处理界面的变换(跳转activity)
        Handler handler = new Handler(){
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                case SKIP_GUIDE:
                    Intent guideIntent = new Intent(startAnimationActivity.this, guideActivity.class);
                    startActivity(guideIntent);
                    break;
                case SKIP_MAIN:
                    Intent mainIntent = new Intent(startAnimationActivity.this, MainActivity.class);
                    startActivity(mainIntent);
                    break;
                }
            };
        };
        
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    //getBoolean(String key, boolean defValue) 获取键isFirst的值,若无此键则获取默认值(第一次打开程序的时候没有isFirst这个键)
                    b = sharedPreferences.getBoolean("isFirst", true);
                    Message msg = handler.obtainMessage();
                    if(b){
                        //Editor对象用于修改sharedpreference对象,修改完后必须提交事务,才能完成修改(参考数据库的事务处理)
                        Editor editor = sharedPreferences.edit();
                        editor.putBoolean("isFirst", false);
                        editor.commit();
                        msg.what = SKIP_GUIDE;
                    }else{
                        msg.what = SKIP_MAIN;
                    }
                    //休眠3s后,将信息发给handler,由handler来跳转activity
                    Thread.sleep(3000);
                    handler.sendMessage(msg);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
    }
    
    /**
     * 该类是app的主界面
     * @author LiXuetao
     *
     */
    public class MainActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    }
    
    /**
     * 该类是app的引导界面,只在app第一次启动时执行
     * @author LiXuetao
     */
    public class guideActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_guide);
        }    
    }

    以上就是app第一次启动时进入guide界面的具体实现代码。
      我最开始说的机型大全的APP存在的问题是由于该APP的数据库是外部导入的,所以每次修改数据库都要重新导入数据库,否则就会数据就会按照上个版本的数据库显示。当时我实在想不出办法来,只好在每次开启app的时候只要检测到数据库存在就删了它,然后重新导入app。
    现在有了sharedPreference,就可以实现只在第一次启动app时删除原先的数据库,导入新的数据库了。   完了,我要去改代码了~~~
  • 相关阅读:
    查看Sql Server2016 是否激活
    MSSQL 账户访问视图权限的设置
    Vue 前端验证码
    (攻防世界) -- pwn入门 -- 新手区1 -- CGfsb
    .NET Core自动注册服务
    C# Graphics 生成文字圆形头像
    Codeforces Round #729 (Div. 2) C. Strange Function
    Codeforces Round #710 (Div. 3) ABCDE 题解
    Codeforces Round #708 (Div. 2) ABC1C2题解
    Codeforces Round #706 (Div. 2) D. Let's Go Hiking 博弈 思维
  • 原文地址:https://www.cnblogs.com/zer0Black/p/3826231.html
Copyright © 2011-2022 走看看