Android简介
Android智能操作系统,主要是手机,其他还有TV,穿戴设备,汽车等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DNUAMhcb-1659312139502)(D:\AF2205\Android\day01(20220711)]\Android系统架构.png)
从上往下:
第一层:System Apps层
美团,微信,QQ,打电话,图库,通讯录。即包括系统的应用,又包括第三方安装的应用。java语言写的。
第二层:Java API FrameWork层
FrameWork层提供给APP层开发的各种方法和接口,这一层也是由java语言实现的。
包括Activity,Window,等
第三层:Native C/C++ Libraries和Android Runtime层
Libraries和ART:开源库。整个第三层都是用C/C++写的。
Android Runtime
Android Runtime(ART):
Java的程序都是在JVM(Java虚拟机)上运行的
手机端用的不是Java虚拟机,用的是Android虚拟机,Android Runtime(ART)。以前用的是Dalvik虚拟机。
Android的应用打出的包是apk格式的,ART会把Java编译出的class文件全部都放在一起,叫dex文件,dex文件经过优化,封装到apk中去。源程序—>class—>dex优化—>apk
手机上的每个应用都在一个独立的ART虚拟机中运行。
Core Libraries:核心库。
Native C/C++ Libraries
开源库
Hardware Abstraction Layer(HAL)
硬件抽象层。保护硬件厂家的驱动程序不开源。分开软件和硬件层进行测试。
Linux Kernel
Android基于Linux系统的,并进行优化的。C写的。
Android Studio环境搭建
下载地址:https://developer.android.google.cn/studio/
1、安装Android Studio
2、装SDK
3、jre
4、安装模拟器
创建Android应用程序
注意项目名,包名,项目存储路径的写法
AndroidManifest.xml清单文件:四大组件的注册,权限,包名等等
java源程序 (test)是测试包
res:资源:图片,字符串,布局文件等等
drawable:app所用到的图片资源
layout:布局:摆放View
mipmap:应用程序的图标
values:值
colors.xml颜色值
string.xml字符串
themes主题
build.gradle是app的编译配置
proguard-rules.pro混淆文件配置
控制界面的方式
方式一:通过xml配置
在xml中配置各种控件,在代码中通过setContentView(layout)来显示
此种方式比较简单快捷,但是不灵活,不能做动态配置。
方式二:通过java代码
所有的控件都通过new关键字创建处理,然后添加到相应的布局中,从而实现用户界面
此方法相对麻烦,但动态灵活。
方式三:混合方式:java代码+xml
固定不变的控件使用xml
动态变化多,行为控制比较负载的控件使用java代码
基本组件
TextView
TextView是文本框,显示文本用
属性:
layout_width控件的宽度
layout_height控件的高度
text控文本内容
textColor字体颜色
textSize字体大小
gravity内容对其方式
layout_gravity该控件在父控件中的对其方式
padding内边距:控件与内容的间距
layout_margin外边距:该控件与父控件的间距
EditText
可编辑的文本框,输入框
属性
hint提示文字,当text不为空的时候,隐藏
inputType校验输入数据的类型
监听器:
addTextChangedListener文本框内容变化监听器
Button
按钮,可接受点击、长按、触摸事件。
继承自TextView,所以TextView中的属性,Button都可以使用。
课后练习:写一个计算器,实现两个数之间的加减乘除
知识点:TextView,EditText,Button。在layout文件中布局,在activity文件中获取数据并进行处理。
layout文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/first_num"
android:textSize="@dimen/num_text_size" />
<EditText
android:id="@+id/firstEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="@string/first_num_hint"
android:textSize="@dimen/num_text_size" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/sec_num"
android:textSize="@dimen/num_text_size" />
<EditText
android:id="@+id/secEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="@string/sec_num_hint"
android:textSize="@dimen/num_text_size" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/addBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/btn_margin"
android:text="@string/opr_add"
android:textSize="@dimen/btn_text_size" />
<Button
android:id="@+id/minusBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/btn_margin"
android:text="@string/opr_minus"
android:textSize="@dimen/btn_text_size" />
<Button
android:id="@+id/productBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/btn_margin"
android:text="@string/opr_product"
android:textSize="@dimen/btn_text_size" />
<Button
android:id="@+id/divideBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/btn_margin"
android:text="@string/opr_divide"
android:textSize="@dimen/btn_text_size" />
</LinearLayout>
<TextView
android:id="@+id/resultTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/reuslt"
android:textSize="@dimen/num_text_size" />
</LinearLayout>
string文件
<resources>
<string name="app_name">Demo0712_Task_Calculator</string>
<string name="first_num">第一个数</string>
<string name="sec_num">第二个数</string>
<string name="first_num_hint">请输入第一个数</string>
<string name="sec_num_hint">请输入第二个数</string>
<string name="opr_add">+</string>
<string name="opr_minus">-</string>
<string name="opr_product">*</string>
<string name="opr_divide">/</string>
<string name="reuslt">结果是</string>
</resources>
dimens文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="num_text_size">20sp</dimen>
<dimen name="btn_text_size">28sp</dimen>
<dimen name="btn_margin">5dp</dimen>
</resources>
activity文件
package com.example.demo0712_task_calculator;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AbsListView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
/**
* 做一款计算器,实现两个数之间的加减乘除。
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText firstEdit;
private EditText secEdit;
private TextView resultTV;
private Button addBtn;
private Button minusBtn;
private Button productBtn;
private Button divideBtn;
private int num1 = 0;
private int num2 = 0;
private int result = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
firstEdit = findViewById(R.id.firstEdit);
secEdit = findViewById(R.id.secEdit);
resultTV = findViewById(R.id.resultTV);
addBtn = findViewById(R.id.addBtn);
minusBtn = findViewById(R.id.minusBtn);
productBtn = findViewById(R.id.productBtn);
divideBtn = findViewById(R.id.divideBtn);
// CalListener listener = new CalListener();//方法一
// addBtn.setOnClickListener(listener);//和方法二
// minusBtn.setOnClickListener(listener);
// productBtn.setOnClickListener(listener);
// divideBtn.setOnClickListener(listener);
addBtn.setOnClickListener(this);//方法三
minusBtn.setOnClickListener(this);
productBtn.setOnClickListener(this);
divideBtn.setOnClickListener(this);
}
//方法二:方法一的优化,方法一的类在onCreate中只使用一次,可以将它创建成一个匿名内部类。new一个类的同时写出具体的实现方法。
private View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// Button btn = (Button) v;
// Toast.makeText(MainActivity.this, "当前点击的是:" + btn.getText().toString(), Toast.LENGTH_SHORT).show();
num1 = Integer.parseInt(firstEdit.getText().toString());
num2 = Integer.parseInt(secEdit.getText().toString());
switch (v.getId()) {//根据v的id来判断要进行哪个运算
case R.id.addBtn:
result = num1 + num2;
break;
case R.id.minusBtn:
result = num1 - num2;
break;
case R.id.productBtn:
result = num1 * num2;
break;
case R.id.divideBtn:
result = num1 / num2;
break;
}
resultTV.setText(getString(R.string.reuslt) + result + "");
}
};
//方法三:让Activity实现OnClickListener这个接口。
@Override
public void onClick(View v) {
// Button btn = (Button) v;
// Toast.makeText(MainActivity.this, "当前点击的是:" + btn.getText().toString(), Toast.LENGTH_SHORT).show();
num1 = Integer.parseInt(firstEdit.getText().toString());
num2 = Integer.parseInt(secEdit.getText().toString());
switch (v.getId()) {//根据v的id来判断要进行哪个运算
case R.id.addBtn:
result = num1 + num2;
break;
case R.id.minusBtn:
result = num1 - num2;
break;
case R.id.productBtn:
result = num1 * num2;
break;
case R.id.divideBtn:
result = num1 / num2;
break;
}
resultTV.setText(getString(R.string.reuslt) + result + "");
}
//方法一:将重复的OnClickListener写成一个内部类,在onCreat中new出来使用。先写一个类,在new。
class CalListener implements View.OnClickListener {
@Override
public void onClick(View v) {
// Button btn = (Button) v;
// Toast.makeText(MainActivity.this, "当前点击的是:" + btn.getText().toString(), Toast.LENGTH_SHORT).show();
num1 = Integer.parseInt(firstEdit.getText().toString());
num2 = Integer.parseInt(secEdit.getText().toString());
switch (v.getId()) {//根据v的id来判断要进行哪个运算
case R.id.addBtn:
result = num1 + num2;
break;
case R.id.minusBtn:
result = num1 - num2;
break;
case R.id.productBtn:
result = num1 * num2;
break;
case R.id.divideBtn:
result = num1 / num2;
break;
}
resultTV.setText(getString(R.string.reuslt) + result + "");
}
}
}
收获
当有一个方法要在多处写出时,使用以下方法对其进行优化:
方法一:可以将其写成一个内部类,在onCreate中new出来,在调用使用new出来的对象名即可。
方法二:可以将其写成一个匿名内部类,在onCreate中不用再new了,在调用处使用对象名就可以。
方法三:可以让Activity实现该接口,重写该方法,在调用处直接使用this即可。
se R.id.divideBtn:
result = num1 / num2;
break;
}
resultTV.setText(getString(R.string.reuslt) + result + “”);
}
}
}
## 收获
当有一个方法要在多处写出时,使用以下方法对其进行优化:
方法一:可以将其写成一个内部类,在onCreate中new出来,在调用使用new出来的对象名即可。
方法二:可以将其写成一个匿名内部类,在onCreate中不用再new了,在调用处使用对象名就可以。
方法三:可以让Activity实现该接口,重写该方法,在调用处直接使用this即可。