Android学习笔记:Android基础知识点(不断更新中)

这篇博客详细介绍了Android的基础知识点,包括OkHttp、UI线程与非UI线程的交互、Volley、Handler、多种网络库的使用、服务(Service)、BroadcastReceiver、Content Provider、Activity生命周期、布局、ListView、RecyclerView等。此外,还讲解了Android系统架构、四大组件、Intent、数据持久化、动画、权限管理、安全实践等核心概念,以及Android开发中常用的工具和最佳实践。
摘要由CSDN通过智能技术生成

1、Android学习笔记:OkHttp
2、Android学习笔记:更新UI的方法(UI线程和非UI线程)
3、Android学习笔记:Volley
4、Android学习笔记:Handler
5、Android学习笔记:Android-Async-Http
6、Android学习笔记:HttpClient和HttpURLConnection
7、Android学习笔记:SharedPreferences
8、Android学习笔记:AsyncTask
9、Android学习笔记:EventBus和otto
10、Android学习笔记:活动(Activity)
11、Android学习笔记:布局
12、Android学习笔记:ListView
13、Android学习笔记:Universal-Image-Loader
14、Android学习笔记:WebView
15、Android学习笔记:RecyclerView
16、Android学习笔记:ButterKnife插件
17、Java学习手册:XML
18、Android学习手册:JSON解析工具比较
19、Android学习笔记:服务(Service)
20、Android学习笔记:广播(Broadcast)
21、Android学习笔记:内容提供器(Content Provider)
22、Android学习笔记:碎片(Fragment)
23、Android学习笔记:框架模式
24、Android学习笔记:Android优化
25、Android学习笔记:线程池(ThreadPool)
26、Android学习笔记:IntentService
27、Android学习笔记:通知(Notification)
28、Android学习笔记:ANR的定位和修正
29、Android学习笔记:Material Design


0、Android的系统架构
Android系统采用分层架构,由高到低分为4层,依次是应用程序层、应用程序框架层、核心类库层、Linux内核。

  • 1、应用程序层:
    应用程序层是一个核心应用程序的集合,所有安装在手机上的APP属于这一层。
  • 2、应用程序框架层
    应用程序框架层主要提供了构建应用程序时用到的各种API。
  • 3、核心类库
    核心类库中包含了系统库及Android运行环境。
  • 4、Linux内核
    Linux内核层为Android设备的各种硬件提供了底层的驱动。

1、四大组件
(1)Android系统的四大组件分别是:活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)、内容提供器(Content Provider)。
(2)Android的四大组件中除了BroadcastReceiver以外,其他三种组件(Activity、Service、ContentProvider)都必须在AndroidManifest中注册,对于BroadcastReceiver来说,它既可以在AndroidManifest.xml中注册,也可以通过代码来注册。
(3)在调用方式上,Activity、Service、BroadcastReceiver需要借助Intent,而ContentProvider则无须借助Intent。

  • Activity
    用户可操作的可视化界面,为用户提供一个完成操作指令的窗口。一个Activity通常是一个单独的屏幕,Activity通过Intent来进行通信。Android中会维持一个Activity Stack,当一个新Activity创建时,它就会放到栈顶,这个Activity就处于运行状态。
  • Service
    服务,运行在手机后台,适合执行不需和用户交互且还需长期运行的任务。
  • Broadcast Receiver
    广播接收器,运用在应用程序间传输信息,可以使用广播接收器来让应用对一个外部事件做出响应。
  • Content Provider
    内容提供器,使一个应用程序的指定数据集提供给其他应用程序,其他应用可通过ContentResolver类从该内容提供者中获取或存入数据。它提供了一种跨进程数据共享的方式,当数据被修改后,ContentResolver接口的notifyChange函数通知那些注册监控特定URI的ContentObserver对象。
    ①如果ContentProvider和调用者在同一进程中,ContentProvider的方法(query/insert/update/delete等)和调用者在同一线程中;
    ②如果ContentProvider和调用者不在同一进程,ContentProvider方法会运行在它自身进程的一个Binder线程中。

2、定义一个应用程序名的字符串,有以下两种方式来引用它:

<resources>
	<string name="app_name">HelloWorld</string>
</resources>
  • 在代码中通过R.string.app_name可以获得该字符串的引用
  • 在XML中通过@string/app_name可以获得该字符串的引用

3、targetSdkVersion(build.gradle中)
如果设置了此属性,那么程序在执行时,如果目标设备的API版本正好等于此数值,它会告诉Android平台:此程序在此版本已经经过充分测试,没有问题。不必为此程序开启兼容性检查判断的工作了。也就是说,如果targetSdkVersion与目标设备的API版本相同时,运行效率可能会高一些。


4、日志工具Log

方法 对应级别 级别由低到高
Log.v() verbose
Log.d() debug
Log.i() info
Log.w() warn
Log.e() error

5、两个Activity之间跳转时必然会执行的是哪几个方法?
前一个Activity的onPause()方法,后一个Activity的onResume()方法


6、配置主活动

<activity>标签内部加入<intent-filer>标签,并在标签里添加如下两句声明即可。
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>

7、Toast
(1)Toast是Android系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间。
(2)跨程序访问时不能直接使用Toast


8、Intent
Intent是Android程序中各种组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。
使用隐式Intent需要注意:
(1)只有< action >和< category >中的内容同时能够匹配上Intent指定的action和category时,这个活动才能响应该Intent。
(2)每个Intent中只能指定一个action,但却能指定多个category。
(3)只有< data >标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能够响应该Intent。
特殊情况说明:(如下)

Intent intent = new Intent(A.this, B.class);
startActivity(intent);
//跳转后加上一句finish(),当从A跳转到B的时候,再点击返回键,B会跳转到A之前的那个activity,而不会返回A
//如果A是主界面,即A之前没有activity,那么会直接返回到手机主界面
finish();

9、SingleInstance
(1)以singleInstance模式启动的Activity具有全局唯一性,即整个系统中只存在一个这样的实例。
(2)以singleInstance模式启动的Activity在整个系统中是单例,如果再启动这样的Activity时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。
(3)以singleInstance模式启动的Activity具有独占性,即它会独自占用一个任务栈,被它开启的任何Activity都会运行在其他任务栈中。
(4)被singleInstance模式的Activity开启的其他Activity,能够在新的任务栈中启动,但不一定开启新的任务栈,也可能在已有的一个任务栈中开启。


10、android:layout_gravity和android:gravity的区别
(1)android:gravity是对view控件本身来说的,是用来设置view本身的内容应该显示在view的什么位置,默认值是左侧,也可以用来设置布局中的控件位置。
(2)android:layout_gravity是相对于包含该元素的父元素来说的,设置该元素在父元素的什么位置
例如TextView中,android:gravity表示TextView文本在TextView的什么位置,默认值是左侧;android:layout_gravity表示TextView在界面上的位置。


11、dp与sp的区别
(1)dp:一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp=1px。
(2)sp:主要用于字体显示,与刻度无关的一种像素,与dp类似。
长度宽度的数值要使用dp作为单位放入dimens.xml文件中
字体大小的数值要使用sp作为单位放入dimens.xml文件中
注意:使用sp作为字体大小的单位,会随着系统的字体大小而改变,而dp作为单位则不会。


12、Android工程中图片资源命名禁忌
(1)大写字母
(2)”default.png“
(3)以下划线("_")开头
(4)以数字加下划线("[0-9] _")开头


13、layout_weight属性
只有线性布局(LinearLayout)支持使用layout_weight属性,来实现按比例指定控件大小的功能。
系统会先把LinearLayout下所有控件指定的layout_weight值相加,得到一个总值。然后每个控件所占大小的比例就是用该控件的layout_weight值除以刚才算出的总值。


14、ViewGroup
所有的布局都是直接或间接继承自ViewGroup的。
View是Android中最基本的一种UI组件,它可以在屏幕上绘制一块矩形区域,并能响应这块区域的各种事件。
ViewGroup则是一种特殊的View,它可以包含很多子View和子ViewGroup,是一个用于放置控件和布局的容器。
ViewGroup的作用就是对添加进它的View组件进行布局。


15、LayoutInflater与findViewById的区别
在实际开发中,LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是:

  • LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;
  • findViewById()是找xml布局文件下的具体widget控件(如 Button、TextView等);

16、JSON
一个最基本的JSON对象是有两个花括号:"{“和”}"。


17、JSONObject
在JSONObject这个类中获取value存在两类方法 optXXX和getXXX ,二者的区别如下:
(1)getString在值为null时会抛出异常,我们需要对该异常进行捕获处理
(2)optString在值为null时不会抛出异常,而是返回fallback的值,因此我们无需进行异常处理;
因此,如果不想对异常进行捕获处理则使用optXXX,否则就需要对相应的异常进行捕获操作。


18、序列化(使用Intent传递对象)
序列化的作用:

  • ①永久性保存对象,保存对象的字节序列到本地文件中
  • ②通过序列化对象在网络中传递对象
  • ③通过序列化在进程间传递对象

两种序列化(使用Intent传递对象)的方法:

  • 实现Serializable接口
    (1)是Java SE本身就支持的。
    (2)序列化的方法:只需让一个类实现Serializable这个接口即可。(implement Serializable)
    (3)获取传递的序列化对象:调用getSerializableExtra() 方法来获取通过参数传递过来的序列化对象。
    (4)Serializable是序列化的意思,表示将一个对象转换成可存储或可传输状态,序列化后的对象可以在网络上进行传输,也可以存储到本地。
  • 实现Parcelable接口
    (1)是Android特有的功能,效率比实现Serializable接口更高效,可用于Intent数据传递,也可用于进程间通信(IPC)。
    (2)序列化的方法:首先需要实现Parcelable接口,然后重写describeContents()和writeToParcel()两个方法。其中describeContents()方法直接返回0即可,而writeToParcel()方法中我们需要调用Parcel的writeXXX()方法,将类中的字段一一写出。注意,字符串数据就调用writeString()方法,整型数据就调用writeInt()方法,以此类推。
    (3)获取传递的序列化对象:调用getParcelableExtra() 方法来获取传递过来的对象。
    (4)除了Serializable之外,使用Parcelable也可以实现相同的效果,不过不同于将对象进行序列化,Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样就可以实现传递对象的功能了。

二者的不同:

  • Parcelable效率更高且消耗内存小,推荐使用Parcelable提高性能。
  • 尽管Serializable效率低,但Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable在外界有变化的情况下不能很好地保证数据的持续性。尽管Serializable效率低点,但此时还是建议使用Serializable。
  • Serializable使用了反射,在序列化的时候会产生大量的临时变量,从而引起频繁的GC

总结:Android上应该尽量采用Parcelable,效率至上,效率远高于Serializable。(建议在网络传输时采用Serializable,在Android程序内使用Parcelable)


19、线程间通讯
我们知道线程是CPU调度的最小单位。在Android中主线程是不能够做耗时操作的,子线程是不能够更新UI的。而线程间通信的方式有很多,比如广播,Eventbus,接口回调,在Android中主要是使用HandlerHandler通过调用sendmessage()方法,将发送的消息Message保存到Messagequeue中,而looper对象不断的调用loop()方法,从messageueue中取出message,交给Handler处理,从而完成线程间通信。


20、Nine-Patch图片
创建过程:在Android Studio中对着任意一张png图片右击→Create 9-Patch file,即可创建Nine-Patch图片。
(1)左边线条:当图片进行纵向拉伸时,由此线条从图片左边水平位移到图片右边,所形成的区域都是可以纵向拉伸的,此区域外侧不进行拉伸,保留原来效果。
(2)上边线条:当图片进行水平拉伸时,由此线条从图片上边垂直位移到图片下边,所形成的区域都是可以横向拉伸的,此区域外侧不进行拉伸,保留原来效果。
(3)右边线条:控制图片填充内容的垂直pandding留白。
(4)下边线条:控制图片填充内容的水平pandding留白。
(5)总:上边框和左边框的区域就是图片要拉伸的区域;右边框和下边框的区域就是文字内容写在图片上的区域


21、字体
Android系统对字体的载入有一个优先级顺序,首先是西方字符,然后是一些符号字体(包括emoji字体),最后是中日韩字符。Android系统自带的只有"sana(默认)"、“serif(西方国家字母体系)”、"monospace(等宽字体)"三种字体,用户可以根据需要自行添加字体。


22、数据加密

  • 1、Base64:通常将数据转换为二进制数据。
  • 2、DES加密:由于DES数据加密算法中密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求。
  • 3、AES加密:AES是一个迭代的、对称密钥分组的密码,AES加密数据块分组长度必须为128bit,密钥长度可以是128bit、195bit、256bit中的任意一个。
  • 4、RSA加密:RSA算法可以实现非对称加密,公钥发布供任何人使用,私钥则为自己所有,供解密之用。
  • 5、MD5(信息-摘要算法5)算法:用于确保信息传输完整一致,是计算机广泛使用的杂凑算法之一。MD5算法将数据(如汉字)运算为另一固定长度值。

注:采用DES与RSA相结合的应用,使它们的优缺点正好互补,即DES加密速度快,适合加密较长的报文,可用其加密明文;RSA加密速度慢,安全性好,应用于DES 密钥的加密,可解决DES 密钥分配的问题。目前这种RSA和DES结合的方法已成为EMAIL保密通信标准


23、限定符(Qualifiers)

屏幕特征 限定符 描述
大小 small 提供给小屏幕设备的资源
大小 normal 提供给中等屏幕设备的资源
大小 large 提供给大屏幕设备的资源
大小 xlarge 提供给超大屏幕设备的资源
分辨率 ldpi 提供给低分辨率设备的资源(120dpi以下)
分辨率 mdpi 提供给中分辨率设备的资源(120dpi~160dpi)
分辨率 hdpi 提供给高分辨率设备的资源(160dpi~240dpi)
分辨率 xhdpi 提供给超高分辨率设备的资源(240dpi~320dpi)
分辨率 xxhdpi 提供给超超高分辨率设备的资源(320dpi~480dpi)
方向 land 提供给横屏设备资源
方向 port 提供给竖屏设备资源

24、Application类
Application类和Activity、Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系统的一些信息
Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(Singleton)模式的一个类。
通常我们是不需要指定一个Application的,系统会自动帮我们创建,如果需要创建自己的Application,则可以创建一个类使其继承Application,并实现onCreate()方法,此外在AndroidManifest.xml文件中的application标签中进行注册。

注意:不要在Android的Application对象中缓存数据。基础组件之间的数据共享可以使用Intent等机制,也可以使用SharedPreferences等数据持久化机制。


25、数据持久化
(1)瞬时数据:指那些存储在内存中,有可能因为程序关闭或其他原因导致内存被回收而丢失的数据。
(2)数据持久化:指将那些内存中的瞬时数据保存到设备中,保证即使在手机关机的情况下,这些数据仍然不会丢失。Android系统的数据持久化主要有三种方式:即文件存储SharedPreference存储数据库存储,此外还可以将数据存入SD卡中。

  • ①文件存储
    文件存储不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中,因此适合用于存储一些简单的文本数据或二进制数据

    //1、将数据存储到文件
    String data = "XXX";
    //Context类提供了一个openFileOutput()方法,用于将数据存储到指定的文件中
    //该方法有两个参数,第一个参数是文件名(不可以包含路径,因为存储路径默认)
    //第二个参数是文件的操作模式,有两种模式:MODE_PRIVATE和MODE_APPEND
    <
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值