凌宇_Android之路_知识备忘录

来源:互联网 发布:淘宝客服工作室赚钱吗 编辑:程序博客网 时间:2024/06/05 00:11

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


1 0
原创粉丝点击