SharedPreferences-xml
共享参数的用法
SharedPreferences是Android的一个轻量级存储工具,采用的存储结构是Key-Value的
键值对方式。
共享参数的存储介质是符合XML规范的配置文件。保存路径是:/data/data/应用包名/shared_prefs/文件名.xml
类似于java中的*.properties的配置文件
共享参数的使用场景
共享参数主要适用于如下场合:
简单且孤立的数据。若是复杂且相互间有关的数据,则要保存在数据库中。
文本形式的数据。若是二进制数据,则要保存在文件中。
需要持久化存储的数据。在App退出后再次启动时,之前保存的数据仍然有效。
实际开发中,共享参数经常存储的数据有App的个性化配置信息、用户使用App的行为信
息、临时需要保存的片段信息等。
程序闪退,保存到内存中的信息是没有的。
java
//data目录下,创建一个config.xml的文件
SharedPreferences config = getSharedPreferences("config", Context.MODE_PRIVATE);
SharedPreferences.Editor edit = config.edit();
edit.putString("hello","world");
edit.commit();
String hello = config.getString("hello","");
XML
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="hello">world</string>
</map>
数据库SQLite-*.sql
sQLiteDatabase是SQLiteH0B法有3类:
管理类,用于数据库层面的操作。
openDatabase:打开指定路径的数据库。
isOpen:判断数据库是否已打开。
close:关闭数据库。
getVersion:获取数据库的版本号。
setVersion:设置数据库的版本号。
java
SQLiteDatabase sqLiteDatabase = openOrCreateDatabase(getFilesDir() + "/test.db", Context.MODE_PRIVATE, null);
String path = sqLiteDatabase.getPath();
Toast.makeText(this,"path的值=="+path, Toast.LENGTH_SHORT).show();
// deleteDatabase(getFilesDir() + "/test.db");
数据库管理器SQLiteDatabase
事务类,用于事务层面的操作。
beginTransaction:开始事务。
setTransactionSuccessful:设置事务的成功标志。
endTransaction:结束事务。
数据处理类,用于数据表层面的操作。
execSQL:执行拼接好的SQL控制语句。
delete:删除符合条件的记录。
update:更新符合条件的记录。
insert:插入一条记录。
query:执行查询操作,返回结果集的游标。
rawQuery:执行拼接好的SQL查询语句,返回结果集的游标。
存储卡文件操作
公共区域:
1、所有应用都可以访问的公用区域
2、仅有A应用访问的私有空间区域
3、仅有B应用访问的私有空间区域
java
package com.pshdhx.utils;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileUtil {
//把字符串保存到指定路径的文本文件
public static void saveText(String path,String txt){
BufferedWriter os = null;
try{
os = new BufferedWriter(new FileWriter(path));
os.write(txt);
}catch (Exception e){
e.printStackTrace();
}finally {
if(os != null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//从指定路径的文本文件读取字符串
public static String openTxt(String path){
StringBuffer sb = new StringBuffer();
BufferedReader br = null;
try{
br = new BufferedReader(new FileReader(path));
String line = null;
while ((line = br.readLine()) != null){
sb.append(line);
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
}
java
//外部存储的私有空间
String path1 = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString();
path1 = path1 + File.separatorChar + "myFileName.txt";
FileUtil.saveText(path1,"hhhhhh哈哈哈");
//外部存储的公共空间
//注册清单文件开启读写权限
String s = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
android:requestLegacyExternalStorage="true"
storage和SD卡的目录,其实就是一个映射。
在存储卡上读取图片
将图片缓存到缓存里,不用每次读取图片都要从网络中获取。
Android 的位图工具是Bitmap,App读写Bitmap可以使用性能更好的
BufferedOutputStream和BufferedInputStream。
Android还提供了BitmapFactory工具用于读取各种来源的图片,相关方法如下:
decodeResource:该方法可从资源文件中读取图片信息。
decodeFile:该方法可将指定路径的图片读取到Bitmap对象。
decodeStream:该方法从输入流中读取位图数据。
实现效果:
将图片读取到外部存储里边保存,然后从保存的位置再读取到ImageView显示
代码:
java
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.save_pic:
String fileName = System.currentTimeMillis()+".jpeg";
path = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString()+ File.pathSeparatorChar+fileName;
System.out.println("path = " + path);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dog);
FileUtil.saveImage(path,bitmap);
//ToastUtil.showMsg(this,"图片保存成功!");
System.out.println("图片保存成功!");
break;
case R.id.read_pic:
Bitmap bitmap1 = FileUtil.openImage(path);
picShow.setImageBitmap(bitmap1);
Bitmap bitmap2 = BitmapFactory.decodeFile(path);
picShow.setImageBitmap(bitmap2);
picShow.setImageURI(Uri.parse(path));
break;
}
}
java
public static void saveImage(String path, Bitmap bitmap) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(path);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static Bitmap openImage(String path) {
Bitmap bitmap = null;
FileInputStream fis = null;
try {
fis = new FileInputStream(path);
bitmap = BitmapFactory.decodeStream(fis);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return bitmap;
}
Application
Application是android的一大组件,在App运行过程中有且仅有一个Application对象贯彻整个生命周期。
java
package com.pshdhx.middleComponent;
import android.app.Application;
import android.content.res.Configuration;
public class MyApplication extends Application {
private static MyApplication mApp;
public static MyApplication getInstance(){
return mApp;
}
//App启动时,调用
@Override
public void onCreate() {
mApp = this;
super.onCreate();
}
//App终止时,调用--不给开发者使用
@Override
public void onTerminate() {
super.onTerminate();
}
//在配置改变时,调用。比如说横屏变为竖屏【屏幕旋转时,会重新创建activity】
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
}
接着下activity中,就可以使用application类中的map对象了,供所有的activity使用。
主要存取3类数据:
1、用户名、手机号
2、不方便由意图传递的数据。例如位图对象、非字符串类型的集合对象。
3、容易因频繁分配内存到导致内存泄露的对象,如Handler对象等。
利用Room简化数据库操作
实体类:
java
@Dao
public interface BookDao {
@Insert
void insert(Book... book);
@Update
void upd(Book... book);
@Delete
void del(Book... book);
@Query("select * from book")
List<Book> qry(Book... book);
@Query("select * from book where name = :name order by id desc")
List<Book> qryByName(String name);
}
Application
java
//App启动时,调用
@Override
public void onCreate() {
mApp = this;
super.onCreate();
bookDataBase = Room.databaseBuilder(this,BookDataBase.class,"book")
//允许迁移数据库【如果没有添加,发生数据库变更时,Room默认会删除原数据库再创建新数据库,如此原来的数据会丢失】
.addMigrations()
//允许在主线程中操作数据库
.allowMainThreadQueries()
.build();
}
public BookDataBase getBookDataBase(){
return bookDataBase;
}
activity使用:
java
bookDao = MyApplication.getInstance().getBookDataBase().bookDao();
@Override
public void onClick(View v) {
String inputBookName = bookName.getText().toString();
String inputBookAuthor = author.getText().toString();
switch (v.getId()) {
case R.id.book_add:
Book b1 = new Book();
b1.setName(inputBookName);
b1.setAuthor(inputBookAuthor);
bookDao.insert(b1);
break;
}
}
java
@Database(entities = {Book.class},version = 1,exportSchema = true)
public abstract class BookDataBase extends RoomDatabase {
public abstract BookDao bookDao();
}
android常用框架组件
1、Jetpack
MVC MVP MVVM
androidx
Jetpack组成
2、LifeCycle
LifeCycle解耦页面和组件
LifeCycleService解耦service和组件
ProcessLifecycleOwner监听程序与生命周期
3、ViewModel
作用与应用
生命周期特性
AndroidViewModel
4、LiveData
应用与优势
ViewModel+liveData实现Fragment间通信
5、DataBinding
DataBinding意义与应用、ActivityMainBinding的由来
二级页面的绑定
自定义BindingAdapter加载网络图片与参数可选
双向绑定BaseOvservable与ObservableField
RecyclerView的绑定
DataBinding+ViewModel+LivaData整合
6、MVVM架构设计
MVVM架构与Jetpack
数据模型驱动界面更新
使用Jetpack组件构建MVVM应用程序
7、Room
Android官方的ORM库
Room+ViewModel+LiveData
使用Migration升级数据库
异常处理
Schema文件记录排查问题
销毁和重建策略
欲填充数据库
8、Navigation
9、WorkManager
10、Paging
11、Compose