没有什么想写的,学了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文件中存储数据了,
③, 调用 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,退出整个应用: