没有什么想写的,学了Android也有小一年了,一些知识点记了又忘,就写写吧,免得以后忘记了。
1,Android系统架构: Linnx内核层,系统运行库层,应用框架层,应用层(我们一般玩的就是这一层)
2,Activity启动模式:
2.1 Standard:每次都会重新new一个activity,不管是不是存在
2.2 SingTop :当这个activity已经存在并且存在于栈顶上的时候,就不用重新new,当不是位于栈顶的时候,则会重新new
2.3 SingTask:启动是,会检查栈内是不是存在着这个Activity,如果存在,就会直接使用这个实例,并且将上面的所有Activity全部出栈;如果不存在,就重新new一个
2.4 SingleInstance:指定为这个启动模式的activity启用一个新的返回栈来管理这个Activity,其实一般是用于在本程序与其他程序共享一个Activity的时候。
3,Android的数据存储方式:
3.1 文件存储:文件储存是用于context提供的方法,主要是openFileOutput 和openFileInput两个方法,存储于/data/data/<package
name>/files/这个路径上。
openFileOutput 的参数有2个,一个是文件名字,一个是存储的模式:4.2之后只有2个参数MODE_PRIVATE和MODE_APPEND,MODE_PRIVATE每次都会覆盖掉之前的数据,即每次只有保存一个存储的数据,而MODE_APPEND就更简单了,类似于Append,会一次添加上去。
3.2 SharedPreference:
/**
* 創建Sp的方法
* 數據都會存儲于/data/data/<packagename>/shared_prefs/
*/
private void OpenSp() {
// 第一個創建sp的方法,是基於context的
// 第一個參數是這個sp文件的名字,第二個參數是這個sp的保存模式,只要是
// MODE_PRIVATE,這個是指只有這個應用程序才能對這個sp進行操作
// MODE_MULTI_PROCESS,這個是用於在多個應用程序可以操作同一個sp的情況下
// 同樣的,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE在4.2的時候就已經放棄了
SharedPreferences sp1 = context.getSharedPreferences("LyTest", MODE_PRIVATE);
// 第二個創建sp的方法,是基於Activity類
// 這個方法只需要一個參數,代表的是這個sp的模式,模式和上面的模式一樣
// 會以當前活動的名字來對這個sp進行命名
SharedPreferences sp2 = activity.getPreferences(MODE_PRIVATE);
// 第三個創建sp的方法,
// 會使用當前應用程序的包名來命名這個sp,但是模式是什麼呢?好像沒有可以指定模式的方法?
SharedPreferences sp3 = PreferenceManager.getDefaultSharedPreferences(context);
}
得到了 SharedPreferences对象之后, 就可以开始向 SharedPreferences文件中存储数据了,
主要可以分为三步实现。
①, 调用 SharedPreferences对象的 edit()方法来获取一个 SharedPreferences.Editor 对象。
②, 向 SharedPreferences.Editor 对象中添加数据,比如添加一个布尔型数据就使用
putBoolean 方法,添加一个字符串则使用 putString()方法,以此类推。
③, 调用 commit()方法将添加的数据提交,从而完成数据存储操作
工具类可以去worldshow或者p2p的utils包提取...已经封了很多了
3.3 数据库存储
/**
* SQLiteOpenHelper是個抽象類,所以我們必須自己去繼承并實現方法
* 有2個抽象方法,onCreate()和onUpgrade()兩個方法
* 有2個重要方法,getWritableDatabase()和getReadableDatabase();返回SQLiteDatabase對象
* 這2個方法都可以創建或打開一個現有的數據庫(如果數據庫已經存在),并返回一個可以對數據進行讀寫操作
* 的對象
* 而不同的是:當數據庫不可以寫入的時候(比如磁盤空間已經滿了的情況下),getReadableDatabase()將會以只讀的
* 方式去打開數據庫,而getWritableDatabase()會乾脆直接報錯
* 數據庫一般是存在/data/data/<package name>/databases/ 文件夾
*/
public class LySqlHelper extends SQLiteOpenHelper {
//寫自己的創表文件
private static final String CreateTableText = "create table Book(\n" +
"\tid integer primary key autoincrement,\n" +
"\tauthor text,\n" +
"\tprice real,\n" +
"\tpages integer,\n" +
"\tname text)";
private Context context;
/*
*這裡有2個構造方法,我們一般選用參數少的那個就可以滿足我們的需求了
*/
public LySqlHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {
super(context, name, factory, version, errorHandler);
}
/**
* 我們一般是用這個構造方法來進行操作的
*
* @param context 上下文,這個不說了
* @param name 數據庫的名字
* @param factory 允許我們在查詢數據的時候返回一個自定義的 Cursor,一般都是傳入null
* @param version 這個表示數據庫的版本號
*/
public LySqlHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
this.context = context;
Toast.makeText(MainActivity.this,"數據庫構造方法",Toast.LENGTH_SHORT).show();
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
Toast.makeText(context, "數據庫建表成功", Toast.LENGTH_SHORT).show();
sqLiteDatabase.execSQL(CreateTableText);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
3,内容提供者
// 以下是内容提供者的代码块
/**
* 内容提供者主要在不同的应用程序之中实现数据共享的功能,既能拿到数据,又能保证数据的安全性
* 目前是都使用这个方法从其他应用程序中拿数据
* 目前内容提供者主要有2中用法:
* ·1,使用现有的内容提供者来读取和操作相应程序中的数据
* ·2,创建自己的内容提供者给我们的程序的数据提供对外的访问接口
* <p/>
* 一般使用ContentResolve类来进行CRUD操作,
* insert(); 插入操作
* update(); 更新擦做
* delete(); 删除操作
* query(); 查询操作
*/
private void UseContentProvider() {
ContentResolver mContentResolver = context.getContentResolver();
// 进行CRUD操作
/**
* @parmas Uri url 内容uri 主要由2部分组成:
* 权限和路径:
* 权限是用于对不同的应用程序做区分的,一般为了避免冲突,都会采用包名的方式进行命名
* 路径是用于对同一应用程序中不同的表做区分的,通常会添加到程序的后面
* @parmas ContentValues values
*/
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
try {
while (cursor.moveToNext()) {
// 获取系统联系人的名字
Log.e("LHT", cursor.getString(cursor.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
}
} catch (Exception e) {
Log.e("LHT", "不好意思我报错了" + e.getMessage());
e.printStackTrace();
}finally {
if (cursor!=null){
cursor.close();
}
}
}
4,项目备忘录:
防止输入法把底部的菜单栏顶上去的做法:
android:windowSoftInputMode="adjustPan|stateHidden"
5,退出整个应用: