Android基礎知識點總結

Android基礎知識點總結

在學習了很長一段時間的Android基礎內容,如果不做及時的複習,那麼後面的項目學習起來可能就沒那麼順利了,並且複習也是一件很愉快的事。古人有云:“學而時習之不亦說乎”,應該就是這個道理。


~本文大綱~


Day01

第一天主要學習的內容相對零散一點,但還是很重要的。

01、Android系統中我們常用的4種數據存儲方式★★★★★

 1. SharedPreferences存儲數據
 2. getFilesDir數據存儲在手機上
 3. Environment數據存儲在SD卡上
 4. SQLite數據庫存儲

1、SharedPreferences存儲數據
保存數據

SharedPreferences config = getSharedPreferences("config", MODE_PRIVATE);
                    boolean commit = config.edit().putString("Hsia", mContent).commit();
                    if (commit) {
                        Toast.makeText(getApplicationContext(), "數據保存成功!", Toast.LENGTH_SHORT).show();
                        mEtContent.setText("");
                    }

取回數據

String getConfig = getSharedPreferences("config", MODE_PRIVATE).getString("Hsia", "");
                if (!("".equals(getConfig))) {
                    Toast.makeText(getApplicationContext(), "數據取回成功!", Toast.LENGTH_SHORT).show();
                    mEtContent.setText(getConfig);
                }

2、getFilesDir數據存儲在手機上

 /**
     * 獲取已保存的用戶信息
     * @param context
     * @return
     */
    private String getConfigFile(Context context) {
        try {
            BufferedReader br = new BufferedReader(new FileReader(new File(context.getFilesDir(), FILENAME)));
            String data = br.readLine();
            br.close();
            return data;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 保存用戶信息到手機上
     * @param context
     * @param mContent
     * @return
     */
    private boolean SaveConfig(Context context, String mContent) {
        if (mContent != null) {
            File file = new File(context.getFilesDir(),FILENAME);
            try {
                BufferedWriter bw = new BufferedWriter(new FileWriter(file));
                bw.write(mContent);
                bw.newLine();
                bw.close();
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        }else{
            return false;
        }
    }

3、Environment數據存儲在SD卡上

/**
     * 從sd卡中取出數據
     * @return
     */
    private String SDGetConfig() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            try {
                FileReader fr = new FileReader(new File(Environment.getExternalStorageDirectory() + SDDownload, FILENAME));
                int len = 0;
                char[] chs = new char[1024];
                String data = "";
                while((len = fr.read(chs))!=-1){
                    data = new String(chs,0,len);
                }
                fr.close();
                return data;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 保存數據到sd卡中
     * @param mContent
     * @return
     */
    private boolean SDSaveConfig(String mContent) {
        //判斷sd卡是否存在
        String state = Environment.getExternalStorageState();
        //如果sd卡不存在直接返回false
        if (!(Environment.MEDIA_MOUNTED.equals(state))) {
            return false;
        }else{
            try {
            FileWriter fw = new FileWriter(new File(Environment.getExternalStorageDirectory() + SDDownload, FILENAME));
                fw.write(mContent);
                fw.close();
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return false;
    }

這裏寫圖片描述
這裏寫圖片描述


  • SharedPreferences存儲數據,會在當前包名下,生成一個“shared_prefs”文件夾,配置文件放在該目錄下。
  • getFilesDir存儲數據,會在當前包名下,生成一個“files”文件夾,配置文件放在該目錄下。
  • Environment存儲數據,獲取到SD卡根目錄,文件默認會存放在SD卡根目錄中。

4、SQLite數據庫存儲(相對知識點較多暫時不做演示)

02、獲取手機內存空間大小★★★

由於獲取手機空間大小實際開發中使用較少,並且相對簡單,就不做代碼測試了,主要就用到Environment(獲取SD卡空間)和getFilesDir(獲取手機空間)。

關鍵代碼

  • 獲取SD卡空間大小
File storageDirectory = Environment.getExternalStorageDirectory();
long totalSpace = storageDirectory.getTotalSpace();
long usableSpace = storageDirectory.getUsableSpace();
  • 獲取手機空間大小
File filesDir = getFilesDir();
long totalSpace = filesDir.getTotalSpace();
long usableSpace = filesDir.getUsableSpace();
String totalSpaceStr = Formatter.formatFileSize(this, totalSpace);
String usableSpaceStr = Formatter.formatFileSize(this, usableSpace);

03、XML文件的生成和解析★★★

  • 生成XML文件

這裏寫圖片描述


/**
     * 生成XML文件的方法
     * @return
     */
    private boolean MakeXML() {
        //Xml.newSerializer開始拼接數據生成xml
        XmlSerializer xmlSerializer = Xml.newSerializer();
        //設置xml文件的存放路徑
        File file = new File(getFilesDir(), "makeXML.xml");
        try {
            FileOutputStream fos = new FileOutputStream(file);
            xmlSerializer.setOutput(fos,"utf-8");
            //開始寫xml
            xmlSerializer.startDocument("utf-8",true);
            //開始寫xml的根節點
            xmlSerializer.startTag(null,"Message");
            for (int i = 0; i < 5; i++) {
                xmlSerializer.startTag(null,"sms");
                xmlSerializer.startTag(null,"address");
                xmlSerializer.text("15855225588");
                xmlSerializer.endTag(null,"address");
                xmlSerializer.startTag(null,"name");
                xmlSerializer.text("Hsia");
                xmlSerializer.endTag(null,"name");
                xmlSerializer.startTag(null,"body");
                xmlSerializer.text("Hello!!!!");
                xmlSerializer.endTag(null,"body");
                xmlSerializer.endTag(null,"sms");
            }
            xmlSerializer.endTag(null,"Message");
            xmlSerializer.endDocument();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
  • 解析XML文件
/**
     * 解析XML的方法
     * @param file
     * @return
     */
    private List<Weather> GetResolveXML(File file) {
        XmlPullParser parser = Xml.newPullParser();
        FileInputStream fis = null;
        List<Weather> list = null;
        Weather weather = null;
        try {
            fis = new FileInputStream(file);
            parser.setInput(fis,"utf-8");
            int type = parser.next();
            while(type!=XmlPullParser.END_DOCUMENT){
                if (type==XmlPullParser.START_TAG) {
                    list = new ArrayList<>();
                    //如果開始標籤是weather標籤則實例化weather
                    if ("weather".equals(parser.getName())) {
                        weather = new Weather();
                    }else if ("city".equals(parser.getName())) {
                        //獲取節點下的屬性值
                        String id = parser.nextText();
                        weather.setId(id);
                    }else if ("name".equals(parser.getName())) {
                        String name = parser.nextText();
                        weather.setName(name);
                    }else if ("pm".equals(parser.getName())) {
                        String pm = parser.nextText();
                        weather.setPm(pm);
                    }else if ("wind".equals(parser.getName())) {
                        String wind = parser.nextText();
                        weather.setWind(wind);
                    }else if ("temp".equals(parser.getName())) {
                        String temp = parser.nextText();
                        weather.setTemp(temp);
                    }
                }
                type = parser.next();
                list.add(weather);
            }
            fis.close();
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

GET新技能

  • 1、將LogCat信息顯示在控制檯中

    在控制檯中輸入adb logcat 然後按回車鍵即可看到LogCat信息,如果需要終止按Ctrl+C鍵即可。

  • 2、將LogCat信息保存在文件中

    執行adb logcat >D:/a.txt 則將日誌輸出到D:/a.txt文件中。按Ctrl+C鍵終止日誌的輸出。

Day02

主要學習Android-SQLite和ListView控件的使用

SQLiteOpenHelper的基本用法

這裏寫圖片描述

1、SQLiteOpenHelper一般就是寫一個類,繼承SQLiteOpenHelper來創建一個數據庫。

public class MyOpenHelp extends SQLiteOpenHelper {
    public MyOpenHelp(Context context) {
        super(context, "person.db", null, 1);
    }
    /**
     * Called when the database is created for the first time
     * 當 數據第一次創建的時候調用
     * 該方法適合做 表結構的初始化
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        System.out.println("oncreate");
        db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
    }
    /**
     * 當數據庫需要升級的時候調用
     * 該方法適合做 表結構修改
     *
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        System.out.println("onUpgrade");
    }
}

2、新建一個針對數據庫的操作類

/**
 * Created by Hsia on 16/5/12.
 * E-mail: [email protected]
 * //TODO:對數據操作的類
 */
public class PersonDao {

    private final MyOpenHelp help;

    public PersonDao(Context context) {
        help = new MyOpenHelp(context);
    }

    /**
     * 插入數據到數據庫的方法
     * @param name
     * @param phone
     * @return
     */
    public boolean add(String name,String phone){
        SQLiteDatabase db = help.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name",name);
        values.put("phone",phone);
        long l = db.insert("info", null, values);
        //關閉下數據庫
        db.close();
        if (l == -1){
            return false;
        }else{
            return true;
        }
    }

    /**
     * 數據庫的刪除方法
     * @param name
     * @return
     */
    public int del(String name){
        SQLiteDatabase db = help.getWritableDatabase();
        int info = db.delete("info", "name = ?", new String[]{name});
        return info;
    }

    /**
     * 更改數據庫,通過名字更改號碼
     * @param name
     * @param phone
     * @return
     */
    public int update(String name,String phone){
        SQLiteDatabase db = help.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("phone",phone);
        int info = db.update("info", values, "name = ?", new String[]{name});
        return info;
    }

    public String find(){
        SQLiteDatabase db = help.getWritableDatabase();
        //查詢到結果集
        /**
         * table 表名
         * columns  查詢的列  具體查詢的是哪一列
         * selection 根據什麼條件去
         * selectionArgs
         */
        Cursor cursor = db.query("info", null, null, null, null, null, null);
        String name = "";
        String phone = "";
        while (cursor.moveToNext()){
            //獲取數據庫中String數據
            name =  cursor.getString(0);
            phone = cursor.getString(1);
        }
        db.close();
        if (TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)) {
            return null;
        }else {
            return name +","+ phone;
        }
    }
}

3、對數據庫進行增刪改查

public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_add:
                boolean zhansan = dao.add("zhansan", "13888888");
                if (zhansan){
                    Toast.makeText(this, "數據添加成功", Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(this, "數據插入失敗", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.btn_del:
                int del = dao.del("zhansan");
                if (del >1) {
                    Toast.makeText(this, "刪除了" + del + "行", Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(this, "數據庫已經沒有數據了", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.btn_update:
                int update = dao.update("zhansan", "1377");
                Toast.makeText(this, "更改了" + update + "行數據", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_find:
                String find = dao.find();
                if (find != null) {
                    String[] split = find.split(",");
                    String name = split[0];
                    String phone = split[1];
                    Toast.makeText(this, "查詢結果:" + name + "," + phone, Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(this, "數據庫中,沒有數據了", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }

數據庫事務

即同一組操作要麼同時成功,要麼同時失敗.

public void click(View view){
        db.beginTransaction();
        try {
            // 做銀行轉賬的邏輯
            db.execSQL("update account set money = money - 100 where name = ?",
                    new Object[] { "張三" });

            // 模擬一個異常
            int i = 1 / 0;

            db.execSQL("update account set money = money + 100 where name = ?",
                    new Object[] { "李四" });
            // 設置一個成功標記 如果該句話執行了 說明我們事務成功 如有有異常 就會回滾
            db.setTransactionSuccessful();
        } catch (Exception e){
            Toast.makeText(getApplicationContext(), "數據庫操作失敗,數據已回滾到上個版本", Toast.LENGTH_SHORT).show();
        } finally {
            db.endTransaction();
        }

Listview的簡單優化

 if (convertView == null) {
    //歷史緩存對象爲空  我創建一個新的View 對象 
            tv = new  TextView(getApplicationContext());
            System.out.println("創建新的view對象--"+position);
        }else {
            //歷史緩存對象不爲空
            tv = (TextView) convertView;
            System.out.println("複用歷史緩存對象--"+position);
            }

這裏寫圖片描述

複用歷史緩存對象

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView listView = (ListView) findViewById(R.id.lv);
        MyAdapter myAdapter = new MyAdapter();
        listView.setAdapter(myAdapter);
    }

    class MyAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }
        //listview優化
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = null;
            //如果爲空就創建view對象
            if (convertView == null) {
                view = View.inflate(getApplicationContext(), R.layout.item, null);
                System.out.println("Hsia:創建listview對象"+position);
                //不爲空就複用 view對象
            }else {
                view = convertView;
                System.out.println("Hsia:複用listview歷史對象"+position);
            }
            return view;
        }
    }

day03

主要學習Android下訪問網絡的操作,涉及到Handle消息機制的處理

消息機制的寫法

    (1)在主線程創建一個Handler 對象 
    (2)重寫Handler的HandleMessage方法
    (3)拿着handler 去子線程發送一條消息
    (4)發送完消息後 handleMessage方法就會執行

網絡圖片查看器

這裏寫圖片描述

public class MainActivity extends AppCompatActivity {

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            int what = msg.what;
            switch (what){
                case 1:
                    Toast.makeText(MainActivity.this, "訪問網絡失敗", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }
            super.handleMessage(msg);
            final Bitmap bitmap = (Bitmap) msg.obj;
            Toast.makeText(MainActivity.this, "3秒後執行", Toast.LENGTH_SHORT).show();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    iv.setImageBitmap(bitmap);
                }
            },3000);
        }
    };
    private ImageView iv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv = (ImageView) findViewById(R.id.iv);
    }
    public void look(View view){
        lookPng();
    }

    private void lookPng() {
        new Thread(){
            @Override
            public void run() {
                String path = "https://img.alicdn.com/tps/i1/TB1h3IXGFXXXXXsXFXXDANtWXXX-175-175.png_.webp";
                HttpURLConnection conn = null;
                try {
                    conn = (HttpURLConnection) new URL(path).openConnection();
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(5000);
                    int code = conn.getResponseCode();
                    if (code == 200) {
                        InputStream inputStream = conn.getInputStream();
                        //將獲取的流數據轉爲bitmap
                        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                        //通過handle更新UI
                        //obtain 實現了new Message ,裏面是一個線程池
                        Message msg = Message.obtain();
                        msg.obj = bitmap;
                        handler.sendMessage(msg);
                    }else{
                        handler.sendEmptyMessage(1);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();

    }
}

備註:關於訪問網絡的內容暫時就寫這麼多了,後面什麼Httpclient,由於谷歌在Android5.0的時候已經廢棄了,所以,不做贅述。

day04

Android學習從零單排之Activity

day05

Android學習從零單排之BroadcastReceiver

day06

Android學習從零單排之Service

day07

Android學習從零單排之ContentProvider

day08

Android學習從零單排之Androidmultimedia(多媒體)

day09

Android學習從零單排之Fragment

由於學習時間有限,以上部分,就不做總結了,請參考鏈接。

關於作者
- 個人網站:北京互聯科技
- Email:[email protected]
- 項目地址:https://github.com/swordman20/AndroidBaseContent.git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章