安卓基本学习
架构体系
安卓的系统体系架构采用的是分层的架构
Kemel层: Android平台的基础。有线程管理和内存管理等功能。
HAL层: HAL的目的是为了把framework与Kernel隔开,让Android不至于过度依赖kernel,对kernel的简单封装,向上提供接口,屏蔽底层的实现细节。
原生C/C++库及Android Runtime: 库文件。ART是虚拟机在5.0以后取代Dalvik虚拟机。
Framework层: Android的应用程序框架,为应用程序曾的开发者提供APIs,包括java和C++。
应用层: Android的应用程序,主要是用户界面(UI)方面的。
安卓四大组件
四大组件分别有:Activity、Service、BroadcastReceiver、ContentProvider。
Activity:界面,是开发者遇到的最频繁,也是Android当中最基本的组件之一。
Service:后台服务,可以和其他组件进行交互。Service是没有界面的。
BroadcastReceiver:接受广播,是跨进程通信的一种简单方式。
ContentProvider:存储和读取数据,相当于数据库。
目录结构
libs: 包含应用可能用到的so、jar、arr等库文件。
java: 包含项目中所有的.java源文件。
res/drawable: 这个目录下包括所有的drawable对象。
res/layout: 这个目录存放用于定义用户界面的文件。
res/values: 这个目录存放各种各样的包含一系列资源的XML文件,比如字符串和颜色的定义。
AndroidManifest.xml: 这个是应用程序的清单文件,描述了应用程序的基础特性,定义他的各种组件。
build.gradle: 编译配置相关的文件。
基础知识
UI
用户界面,是交互的媒介,实现信息的内部形式与人类可以接受形式之间的转换。
Android UI都是由ViewGroup和View 组成的。
布局(layout)
布局可定义应用中的界面结构(如Activity的界面结构)。布局中的所有元素均可以使用view和ViewGroup对象的层次结构进行构建。View通常绘制用户可查看并进行交互的内容。然而,ViewGroup是不可见容器,用于定义View和其他ViewGroup对象的布局结构。
View和ViewGroup
在Android App中,所有的UI都是由View 和ViewGroup的对象构成的。
View是绘制在屏幕上的,用户能与之交互的一个对象。
ViewGroup 则是一个用于存放其他View(和ViewGroup)对象的布局容器。
**Android为我们提供了一个View和ViewGroup子类的集合,集合中提供了一些常用的输入控件(比如Button和TextView)和各种各样的布局模式(比如LinearLayout或RelativeLayout)
一个App的用户界面上的每一个组件都是使用View和ViewGroup对象的层次结构来构成的。每个ViewGroup都是要给看不见的用户组织子View的容器,而它的子View可能是输入控件或者在UI上绘制了某块区域的小部件。有了层次树,你就可以根据自己的需要,设计简单或者复杂的布局了(布局越简单性能越好)
声明布局
常用的7种界面布局
- 线性布局(LinearLayout):根据不同的排列,每行(列)仅包含一个界面元素
- 框架布局(FrameLayout):如果有多个子元素,后放置的子元素将遮挡先放置的子元素。
- 表格布局(TableLayout):网格的边界对用户不可见,网格布局支持嵌套(可以在其中添加其他界面布局)。
- 相对布局(RelativeLayout):能够最大程度保证在各种屏幕尺寸的手机上正确显示界面布局。
- 绝对布局(AbsoluteLayout):必须要指定坐标。不推荐,不能适应变化。
- 网格布局(GridLayout):将界面划分成多个块,这些块是根据界面元素动态划分的。
- 约束布局(ConstraintLayout):约束,就是要定义控件在某方面与其他控件的对其或者距离关系。
首先需要在layout的XML文件中声明界面的元素
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
声明后就可以在界面中看到我们所添加的控件,但是我们的交互操作还没有写,需要在java文件夹下所创建的.java文件中写相关的代码去定义控件并在与之相连,在写相应的操作
如下
public class MainActivity extends AppCompatActivity {
EditText tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.Bt_login);
tv= findViewById(R.id.Edit_n);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intt = new Intent(MainActivity.this,MainActivity2.class);
startActivityForResult(intt,0);
//startActivityForResult(intt,0);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0){
tv.setText(data.getStringExtra("name"));
}
}
}
- AndroidManifest.xml 文件中,根元素是 manifast ,包含 xmlns:android、package、android : versionCode 和 android: versionName 4个属性。
- manifest元素仅能包含一个application元素,application元素中能够声明(生命了每一个应用程序的组件及其属性)Android程序中最重要的4个组成部分,包括Activity、Service、BroadcastReceiver和ContertProvider,所定义的属性将影响所有组成部分。
- activity元素 :是堆Activity子类的声明,不在AndroidManifest.xml文件中声明的Activity将不能在用户界面中显示。
- intent-filter中声明两个子元素action和category。
编写XML
利用Android的XML标签,快速设计UI布局。
每个布局文件都必须只包含一个根元素。
定义根元素后,可以以子元素的形式添加其他布局对象或控件,从而逐步定义布局的试图层次结构。
在XML中声明布局后,以.xml扩展名将文件保持在Android项目的res/layout/目录中。
加载XML资源
当编译应用时,系统会将XML布局文件编译成View资源。在Activity.onCreate()回调内,通过调用setContentView(),并以R.layout.layout_file_name 形式向应用代码传递布局资源的引用,加载应用代码中的布局资源。
常用的控件
TextView和EditText
EditText继承于TextView
Button 和ImageButton
这两个控件无继承关系
ListView
List → \rightarrow → Adapter → \rightarrow → adapterView → \rightarrow → (getView()) Adapter
ListView 是一个垂直显示的列表控件,如果内容过多就会出血垂直滚动条,ListView能够通过适配器将数据和自身绑定,显示内容;还支持点击事件;
UI控件的属性
每个View对象和ViewGroup对象均支持自己的各种XML属性,某些属性是View对象的特有属性(例如,TestView支持textSize属性),但可拓展此类的任一View对象也会继承这些属性。某些属性是所有View对象的共有属性,因为都继承自View根类(例如id属性)
属性中最重要的可能就是id属性,因为只有在有了这个属性后,我们才能在.java文件中获取这个控件才能进行接下来的操作。
ID:任何View对象军可拥有与之相关联的整型ID,用于在结构树中对View对象进行唯一标识。编译应用后,系统会以整型形式引用此ID,但在布局XML文件中,系统通常会以字符串的形式在id属性中指定该ID。这是所有View对象共有的XML属性。
android:id="@+id/tv"
值得注意的是,ID字符串名称,在同一布局中必须是唯一的,不能重名,不同布局中可以同名,ID的作用和上面所说的一样,就是用于在.java文件中定义并且使用,添加控件的功能。
常用的7种界面布局
- 线性布局(LinearLayout):根据不同的排列,每行(列)仅包含一个界面元素
- 重要的属性是:android:orientation,这个属性有两个值,分别为“horizontal” 水平布局,“vertical”垂直布局。
- 布局权重: android:layout_weight,占比权重
- 布局位置:使用getLeft()方法和getTop()方法来获取视图的坐标位置,值得注意的是这两个方法获取的值是相对应父布局的值,而并非绝对值。
- 布局尺寸:可以通过getWidth()和getHeight()来获取视图的尺寸,这些方法返回的值也是相对父视图的值。
- 框架布局(FrameLayout):如果有多个子元素,后放置的子元素将遮挡先放置的子元素。
- 表格布局(TableLayout):网格的边界对用户不可见,网格布局支持嵌套(可以在其中添加其他界面布局)。
- 相对布局(RelativeLayout):能够最大程度保证在各种屏幕尺寸的手机上正确显示界面布局。
- 重要的属性就是一个系列的:
android:layout_below="@id/ "在指定View的下方
android:layout_above="@id/ "在指定的View的上方
android:layout_toLeftOf="@id/ "在指定的View的左边
android:layout_toRigthOf="@id/ " 在指定的View的右边
android:layout_alignTop="@id/ "与指定的View的上边界一致
android:layout_alignBottom="@id/ "与指定的View的下边界一致
android:layout_alignLeft="@id/ "与指定的View的左边界一致
android:layout_alignRight="@id/ " 与指定的View的右边界一致
android:layout_alignParentLeft="ture" 在父元素内左边
android:layout_alignParentRight="ture" 在父元素内右边
android:layout_alignParentTop="ture" 在父元素内顶部
android:layout_alignParentBottom="ture" 在父元素内底部
android:layout_centerInParent="true" 居中布局
android:layout_centerVertical="true" 垂直居中布局
android:layout_centerHorizontal="true" 水平居中布局
android:layout_marginBottom="" 离某元素底边缘的距离
android:layout_marginLeft="" 离某元素左边缘的距离
android:layout_marginRight="" 离某元素右边缘的距离
android:layout_marginTop="" 离某元素上边缘的距离
android:layout_paddingBottom="" 往内部元素底边缘填充距离
android:layout_paddingLeft="" 往内部元素左边缘填充距离
android:layout_paddingRight="" 往内部元素右边缘填充距离
android:layout_paddingTop="" 往内部元素上边缘填充距离
- 绝对布局(AbsoluteLayout):必须要指定坐标。不推荐,不能适应变化。
- 网格布局(GridLayout):将界面划分成多个块,这些块是根据界面元素动态划分的。
- 约束布局(ConstraintLayout):约束,就是要定义控件在某方面与其他控件的对其或者距离关系。
常用组件
TextView
带图片的TextView
EditText
一般知识
建议在布局的大小上,我们在写的时候注意尽量使用dp作为单位而不使用px因为px 是像素,对于不同的设备的显示上布局会发生改变,使用dp则可以解决这个问题。
边距上还会区分出外边距和内边距,和web类似
外边距有:
- layout_margin: 外边距(输入一个值时,就是对全部方位的编辑,输入两个值就是上下一个值,左右一个值)
- layout_marginTop: 上外边距
- layout_marginBottom: 下外边距
- layout_marginLeft: 左外边距
- layout_marginRight: 右外边距
内边距有:
- padding:内边距
- paddingTop:外内边距
- paddingBottom:下内边距
- paddingLeft:左内边距
- paddingRight:右内边距