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时删除原先的数据库,导入新的数据库了。 完了,我要去改代码了~~~
android——利用SharedPreference做引导界面的更多相关文章
- Android——用对话框做登陆界面(自定义对话框AlertDialog,多线程,进度条ProgressDialog,ListView,GridView,SharedPreferences存,读数据,存取文本,assets文件)
效果: 1.点击图标进入页面二 2.页面2图片暂停显示5秒进入页面三 3.点击页面三登陆按钮,打开登陆对话框,输入密码进入页面四 点击下载按钮,显示水平进度条 点击保存和获取用户名和密码 进入页面六 ...
- 利用jQuery做登录界面的验证码
主要是为了有效防止机器恶意注册,对某一个特定已注册用户用特定程序暴力破解方式进行不断的登陆尝试.验证码是现在很多网站注册/登录时必填的, 虽然对用户可能有点麻烦,但是对网站/社区来说这个功能还是很有必 ...
- Android利用reative_layout生成梅花界面
XML代码: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and ...
- android仿新浪引导界面
最近在研究如何做出仿微信,仿新浪等应用,第一次安装使用的使用展示应用程序的新特性和用法. 实现功能:左右手势滑屏 底部小圆点随当前显示页跳动 浮动按钮显示.当触屏事件发生显示,否则就渐渐消失 先转个文 ...
- 【Android UI设计与开发】第01期:引导界面(一)ViewPager介绍和使用详解
做Android开发加起来差不多也有一年多的时间了,总是想写点自己在开发中的心得体会与大家一起交流分享.共同进步,刚开始写也不知该如何下手,仔细想了一下,既然是刚开始写,那就从一个软件给人最直观的感受 ...
- android开机引导界面的几种实现
不少应用在设计的时候都会有几个引导界面,这里总结一下几个典型实现: 之前自己做过仅具有一个引导界面的应用,在welcomeActivity中设置一张图片,更复杂的为该图片设置一个渐入渐出的动画,然后利 ...
- 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面
[Android UI设计与开发]第05期:引导界面(五)实现应用程序只启动一次引导界面 jingqing 发表于 2013-7-11 14:42:02 浏览(229501) 这篇文章算是对整个引导界 ...
- Android UI开发第四十一篇——墨迹天气3.0引导界面及动画实现
周末升级了墨迹天气,看着引导界面做的不错,模仿一下,可能与原作者的代码实现不一样,但是实现的效果还是差不多的.先分享一篇以前的文章,android动画的基础知识,<Android UI开发第十二 ...
- 【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面
大部分的引导界面基本上都是千篇一律的,只要熟练掌握了一个,基本上也就没什么好说的了,要想实现应用程序只启动一次引导界面这样的效果,只要使用SharedPreferences类,就会让程序变的非常简单, ...
随机推荐
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
1.前言 使用框架都是较新的版本: Spring 4.0.2 RELEASE Spring MVC 4.0.2 RELEASE MyBatis 3.2.6 2.Maven引入需要的JAR包 2.1设置 ...
- MySQL 拷贝数据库表方式备份,还原后提示 table xxx '' doesn`t exist
MySQL很强大,支持直接拷贝数据库文件快速备份,那数据库文件在哪里呢? 打开MySQL的配置文件 my.ini,找到 datadir 节点,如 datadir="D:/Program Fi ...
- 进阶系列五【绝对干货】----Git教程
一.介绍 1.1Git是什么? Git是目前世界上最先进的分布式版本控制系统.什么是版本控制系统?请自行百度. 1.2Git与SVN对比有什么特点? SVN是集中式版本控制系统.版本库是集中放在中央服 ...
- linux mingling
grep 文本搜索工具 -i 忽略大小写 -v 不显示匹配行 -c 显示符合条件的行数值 文本搜索支持正则表达式 1 2 3 cat /etc/passwd | grep root // 显示包含ro ...
- word20161207
DHCPRELEASE, DHCP release message / DHCP 释放消息 DHCPREQUEST, DHCP request message / DHCP 请求消息 dial 拨号位 ...
- c语言for循环
#include<stdio.h>#include<windows.h>#include <limits.h>#include <math.h>void ...
- php 总结第一篇(望大家补充!谢谢)
/* 数组的常用函数 * * 数组的排序函数 * sort() * rsort() * usort() * asort() * arsort() * uasort() * ...
- (转).NET开发人员必备的可视化调试工具(你值的拥有)
1:如何使用 1:点击下载:.NET可视化调试工具 (更新于2016-11-05 20:55:00) 2:解压RAR后执行:CYQ.VisualierSetup.exe 成功后关掉提示窗口即可. PS ...
- Nginx负载均衡
负载均衡(做分发服器)1.基于浏览器的分发基于浏览器的分发,按照在不同平台的浏览器请求进行分发,比如手机浏览器讲究资源小速度快节省流量,所以将自手机浏览器的请求分发到专供处理移动平台的web服务器上, ...
- JAVA基础中的注意点(二)
1.数组 a.特点:同种数据类型:数组类型一旦确定就不能改变. 连续空间存放:数据空间是连续的. 空间长度:数组有自己的长度,初始化的时候需要定义. 数组的下标:从0开始,第一个数组元素下标为0,最后 ...