凌宇_Android之路_知识备忘录

没有什么想写的,学了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,退出整个应用:


你可能感兴趣的:(凌宇_Android之路_知识备忘录)