需要源码请点赞关注收藏后评论区留言~~
一、Application的生命周期
Application是Android的一大组件,在APP运行过程中有且仅有一个Application对象贯穿应用的整个生命周期 打开AndroidMainfest.xml 发现activity节点的上级正是application节点,不过该节点并未指定name属性,此时App采用默认的Application实例
二、利用Application操作全局变量
适合在Application中保存的全局变量主要有下面三类数据
1:会频繁读取的信息
2:不方便由意图传递的数据 例如位图对象 非字符串类型的集合对象等
3:容易因频繁分配内存而导致内存泄漏的对象 例如Handler处理器
效果如下 写入数据后可以查看
AppReadActivity类
package com.example.chapter06; import android.os.Bundle; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import java.util.Map; public class AppReadActivity extends AppCompatActivity { private TextView tv_app; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_app_read); tv_app = findViewById(R.id.tv_app); readAppMemory(); // 读取全局内存中保存的变量信息 } // 读取全局内存中保存的变量信息 private void readAppMemory() { String desc = "全局内存中保存的信息如下:"; // 获取当前应用的Application实例 MainApplication app = MainApplication.getInstance(); // 获取Application实例中保存的映射全局变量 Map<String, String> mapParam = app.infoMap; // 遍历映射全局变量内部的键值对信息 for (Map.Entry<String, String> item_map : mapParam.entrySet()) { desc = String.format("%s\n %s的取值为%s", desc, item_map.getKey(), item_map.getValue()); } if (mapParam.size() <= 0) { desc = "全局内存中保存的信息为空"; } tv_app.setText(desc); } }
AppWriteActivity类
package com.example.chapter06; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import androidx.appcompat.app.AppCompatActivity; import com.example.chapter06.util.DateUtil; import com.example.chapter06.util.ToastUtil; public class AppWriteActivity extends AppCompatActivity implements View.OnClickListener, CompoundButton.OnCheckedChangeListener { private EditText et_name; private EditText et_age; private EditText et_height; private EditText et_weight; private boolean bMarried = false; private String[] typeArray = {"未婚", "已婚"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_app_write); et_name = findViewById(R.id.et_name); et_age = findViewById(R.id.et_age); et_height = findViewById(R.id.et_height); et_weight = findViewById(R.id.et_weight); CheckBox ck_married = findViewById(R.id.ck_married); ck_married.setOnCheckedChangeListener(this); findViewById(R.id.btn_save).setOnClickListener(this); } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { bMarried = isChecked; } @Override public void onClick(View v) { if (v.getId() == R.id.btn_save) { String name = et_name.getText().toString(); String age = et_age.getText().toString(); String height = et_height.getText().toString(); String weight = et_weight.getText().toString(); if (TextUtils.isEmpty(name)) { ToastUtil.show(this, "请先填写姓名"); return; } else if (TextUtils.isEmpty(age)) { ToastUtil.show(this, "请先填写年龄"); return; } else if (TextUtils.isEmpty(height)) { ToastUtil.show(this, "请先填写身高"); return; } else if (TextUtils.isEmpty(weight)) { ToastUtil.show(this, "请先填写体重"); return; } // 获取当前应用的Application实例 MainApplication app = MainApplication.getInstance(); // 以下直接修改Application实例中保存的映射全局变量 app.infoMap.put("name", name); app.infoMap.put("age", age); app.infoMap.put("height", height); app.infoMap.put("weight", weight); app.infoMap.put("married", typeArray[!bMarried ? 0 : 1]); app.infoMap.put("update_time", DateUtil.getNowDateTime("yyyy-MM-dd HH:mm:ss")); ToastUtil.show(this, "数据已写入全局内存"); } } }
activity_app_readXML
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp" > <TextView android:id="@+id/tv_app" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/black" android:textSize="17sp" /> </LinearLayout>
activity_app_writeXML
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp" > <RelativeLayout android:layout_width="match_parent" android:layout_height="40dp" > <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:text="姓名:" android:textColor="@color/black" android:textSize="17sp" /> <EditText android:id="@+id/et_name" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="3dp" android:layout_marginTop="3dp" android:layout_toRightOf="@+id/tv_name" android:background="@drawable/editext_selector" android:gravity="left|center" android:hint="请输入姓名" android:inputType="text" android:maxLength="12" android:textColor="@color/black" android:textSize="17sp" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="40dp" > <TextView android:id="@+id/tv_age" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:text="年龄:" android:textColor="@color/black" android:textSize="17sp" /> <EditText android:id="@+id/et_age" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="3dp" android:layout_marginTop="3dp" android:layout_toRightOf="@+id/tv_age" android:background="@drawable/editext_selector" android:gravity="left|center" android:hint="请输入年龄" android:inputType="number" android:maxLength="2" android:textColor="@color/black" android:textSize="17sp" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="40dp" > <TextView android:id="@+id/tv_height" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:text="身高:" android:textColor="@color/black" android:textSize="17sp" /> <EditText android:id="@+id/et_height" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="3dp" android:layout_marginTop="3dp" android:layout_toRightOf="@+id/tv_height" android:background="@drawable/editext_selector" android:gravity="left|center" android:hint="请输入身高" android:inputType="number" android:maxLength="3" android:textColor="@color/black" android:textSize="17sp" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="40dp" > <TextView android:id="@+id/tv_weight" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:text="体重:" android:textColor="@color/black" android:textSize="17sp" /> <EditText android:id="@+id/et_weight" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="3dp" android:layout_marginTop="3dp" android:layout_toRightOf="@+id/tv_weight" android:background="@drawable/editext_selector" android:gravity="left|center" android:hint="请输入体重" android:inputType="numberDecimal" android:maxLength="5" android:textColor="@color/black" android:textSize="17sp" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="40dp" > <CheckBox android:id="@+id/ck_married" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center" android:checked="false" android:text="已婚" android:textColor="@color/black" android:textSize="17sp" /> </RelativeLayout> <Button android:id="@+id/btn_save" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="保存到全局内存" android:textColor="@color/black" android:textSize="17sp" /> </LinearLayout>
三、利用Room简化数据库操作
Google自己开发了一个数据库框架-Room 该框架同样基于SQLit,但它通过注解技术极大的简化了数据库操作,减少了原来相当一部分编码工作量
下面通过一个图书管理系统讲解
BookInfo类
package com.example.chapter06.entity; import androidx.annotation.NonNull; import androidx.room.Entity; import androidx.room.PrimaryKey; //书籍信息 @Entity public class BookInfo { @PrimaryKey // 该字段是主键,不能重复 @NonNull // 主键必须是非空字段 private String name; // 书籍名称 private String author; // 作者 private String press; // 出版社 private double price; // 价格 public void setName(String name) { this.name = name; } public String getName() { return this.name; } public void setAuthor(String author) { this.author = author; } public String getAuthor() { return this.author; } public void setPress(String press) { this.press = press; } public String getPress() { return this.press; } public void setPrice(double price) { this.price = price; } public double getPrice() { return this.price; } }
BookDao持久类
package com.example.chapter06.dao; import androidx.room.Dao; import androidx.room.Delete; import androidx.room.Insert; import androidx.room.OnConflictStrategy; import androidx.room.Query; import androidx.room.Update; import com.example.chapter06.entity.BookInfo; import java.util.List; @Dao public interface BookDao { @Query("SELECT * FROM BookInfo") // 设置查询语句 List<BookInfo> queryAllBook(); // 加载所有书籍信息 @Query("SELECT * FROM BookInfo WHERE name = :name") // 设置带条件的查询语句 BookInfo queryBookByName(String name); // 根据名字加载书籍 @Insert(onConflict = OnConflictStrategy.REPLACE) // 记录重复时替换原记录 void insertOneBook(BookInfo book); // 插入一条书籍信息 @Insert void insertBookList(List<BookInfo> bookList); // 插入多条书籍信息 @Update(onConflict = OnConflictStrategy.REPLACE)// 出现重复记录时替换原记录 int updateBook(BookInfo book); // 更新书籍信息 @Delete void deleteBook(BookInfo book); // 删除书籍信息 @Query("DELETE FROM BookInfo WHERE 1=1") // 设置删除语句 void deleteAllBook(); // 删除所有书籍信息 }
BookDatabase类
package com.example.chapter06.database; import androidx.room.Database; import androidx.room.RoomDatabase; import com.example.chapter06.dao.BookDao; import com.example.chapter06.entity.BookInfo; //entities表示该数据库有哪些表,version表示数据库的版本号 //exportSchema表示是否导出数据库信息的json串,建议设为false,若设为true还需指定json文件的保存路径 @Database(entities = {BookInfo.class},version = 1, exportSchema = false) public abstract class BookDatabase extends RoomDatabase { // 获取该数据库中某张表的持久化对象 public abstract BookDao bookDao(); }
创作不易 觉得有帮助请点赞关注收藏~~~