Android基础知识点总结

Android基础知识点总结

在学习了很长一段时间的Android基础内容,如果不做及时的复习,那么后面的项目学习起来可能就没那么顺利了,并且复习也是一件很愉快的事。古人有云:“学而时习之不亦说乎”,应该就是这个道理。



~本文大纲~

  • Android基础知识点总结

    • Day01

      • 01Android系统中我们常用的4种数据存储方式
      • 02获取手机内存空间大小
      • 03XML文件的生成和解析
      • GET新技能
    • Day02
      • SQLiteOpenHelper的基本用法
      • 数据库事务
      • Listview的简单优化
    • day03
      • 消息机制的写法
      • 网络图片查看器
    • day04
    • day05
    • day06
    • day07
    • day08
    • day09

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

时间: 2024-10-06 20:51:40

Android基础知识点总结的相关文章

Android中Binder的基础知识点

Android Binder基础知识点 一 传统IPC和Binder机制的比较 传统IPC: 1)收方无法获得对方进程可靠的UID/PID,从而无法鉴别对方身份. 2)接入点开放,无法建立私有通道. 3)socket, 管道和消息队列需要两次数据拷贝,传输效率差. 4)共享内存的方式控制复杂,难以使用. Binder机制: 1)为发送方添加UID/PID身份. 2)既支持实名Binder也支持匿名Binder. 3)传输过程只需要一次拷贝. 二 Binder中的面向对象思想 Binder对象是一

《2015最新Android基础入门教程》完结散花~

<2015最新Android基础入门教程>完结散花~ 标签(空格分隔): 反思小结 引言: 从六月底就开始编写这套教程,历时将近五个多月,今天终于写完了,全套教程正文部分148篇, 十大章,从基本UI控件到四大组件,Intent,Fragment,事件处理,数据存储,网络编程,绘图与动画, 多媒体,系统服务等都进行了详细的讲解!代码都是都是在Android Studio上进行编写的,全文 采用Markdown,行文结构清晰,还结合了实际开发中一些常见的问题进行了剖析-由于个人能力的局限, 虽然

Android面试知识点(转)

该文所有问题转自:http://www.cnblogs.com/hpboy/p/3307371.html 一.算法,数据结构 1.排序算法 2.查找算法 3.二叉树 4.广度,深度算法: 二.java基础 1.集合Collection,List,Map等常用方法,特点,关系: 2.线程的同步,中断方式有几种,线程池,线程状态,常用的方法比较,比如wait,sleep等: 3.反射机制 4.IO包的使用,运用了什么设计模式 5.设计模式,常用的设计模式,运用场景: 6.内存管理,引用的种类: 7.

Android基础整合项目之节日群发助手(二)

Android基础整合项目(一) 之节日群发助手part 2 --转载请注明出处:coder-pig 本节引言: 在上一节中我们已经做出了我们群发助手的第一个界面以及完成了联系人的读取以及数据库的 录入了,在这一节中将要完成的工作是: 1)自定义我们的ListView的列表项,两个TextView + CheckBox; 2)使用SimpleCursorAdapter将数据显示到ListView上; 3)实现listview的全选与全不选 4)点击重置按钮后,将数据库中的state都重置为-1

fastclick 源码注解及一些基础知识点

在移动端,网页上的点击穿透问题导致了非常糟糕的用户体验.那么该如何解决这个问题呢? 问题产生的原因 移动端浏览器的点击事件存在300ms的延迟执行,这个延迟是由于移动端需要通过在这个时间段用户是否两次触摸屏幕而触发放大屏幕的功能.那么由于click事件将延迟300ms的存在,开发者在页面上做一些交互的时候往往会导致点击穿透问题(可以能是层之间的,也可以是页面之间的). 解决问题 之前遇到这个问题的时候,有在网上看了一些关于解决移动端点击穿透的问题,也跟着网上提出的方式进行了各项测试,最终还是觉得

Android基础入门教程——7.5.4 WebView文件下载

Android基础入门教程--7.5.4 WebView文件下载 标签(空格分隔): Android基础入门教程 本节引言 本节给大家介绍的是WebView下载文件的知识点,当我们在使用普通浏览器的时候,比如UC, 当我们点击到一个可供下载链接的时候,就会进行下载,WebView作为一个浏览器般的组件, 当然也是支持下载,我们可以自己来写下载的流程,设置下载后的文件放哪,以什么文件名 保存,当然也可以调用其它内置的浏览器来进行下载,比如Chrome,UC等等! 下面给大家演示下用法! 1.调用其

Android基础新手教程——1.10 反编译APK获代替码&amp;amp;资源

Android基础新手教程--1.10 反编译APK获代替码&资源 标签(空格分隔): Android基础新手教程 本节引言: "反编译Apk".看上去好像好像非常高端的样子,事实上不然,就是通过某些反编译软件.对我们的APK进行反编译,从而获取程序的源代码,图片,XML资源等文件.不知道你有没有这样做过,看到一个别人的一个APP界面做得非常精美,或者你看上别人的图片素材,简单点的,我们能够下载别人的APK.然后改下后缀名,改成xxx.zip.然后解压: 笔者随便解压了一个AP

Android基础工具类重构系列一Toast

前言: 一直在考虑写一下Android实际项目中的一些总结,翻看CSDN博客,上一篇已经是一年多曾经. 本系列定位Android基础工具类重构.旨在记录实际项目中经经常使用到的一些工具类,比方Toast.Dialog.动画类,ImageLoader类等等.正在梳理,但发现梳理完再写预计黄花菜都凉了.所以改变策略,边写边梳理. 首先要写的就是这个Toast. 一.说明 作为Android系统提供的基类,Toast是最简单的提示消息类.特点悬浮.跨界面(Activity)特定时间内自己主动销毁. 二

Android 面试题总结之Android 基础(六)

Android 面试题总结之Android 基础(六) 在上一章节Android 面试题总结之Android 基础ListView(五) 主要是ListView的优化,原理以及一些基本问题. 在阅读过程中有任何问题,请及时联系.如需转载请注明 fuchenxuan de Blog 本章系<Android 之美 从0到1 – 高手之路>Android基础将会总结了Android 布局常见面试问题.其实对于基础方面Android 开发来说,经常面试无非就是UI,网络,数据库,这三大方面,本章节总结