# Android
**Repository Path**: yangs_f/android
## Basic Information
- **Project Name**: Android
- **Description**: 学习Android开发的一些代码
- **Primary Language**: Unknown
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2022-09-08
- **Last Updated**: 2022-09-14
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Android开发基础(JAVA)
## 写在前面
因为本学期要完成学校的移动开发的课程,所以学习Android,本文档记录一些重要知识点、本人踩过的坑等等。
阅读前提:Java基础、一些计算机基础知识
工具:IntelliJ IDEA(Android studio也可以,因为有idea了,懒得再装一个Android studio)
## 一、hello world
### 1.1 创建项目
创建一个Android项目


选择java语言
安卓开发包的版本不要选太高
创建成功后的目录结构(原本选中处是app,继续往下看)

删掉app模块,并将settings.gradle中的include ':app'删掉,然后重新创建一个模块

选择Empty Activity就可以

### 1.2 目录结构

gradle类似maven,都是构建工具。
可以看到和java项目目录结构相似,AndroidManifest.xml描述整个模块,java目录中存放java代码,res存放资源文件其他的就是一些配置文件
具体参考:https://www.jianshu.com/p/6f05a563690a
### 1.3 创建模拟器
既然是Android开发,肯定是要跑在Android系统上的,哪来的安卓系统呢?
- 真机
1. 开启开发者模式
一般是在设置->关于手机(设备信息)->连续点击系统版本号,直到手机提示你已开启开发者模式
2. 开启USB调试以及允许USB安装应用
直接在设置中搜索USB就能找到了
3. 连上数据线选择文件传输模式(千万不要选择仅充电)
成功后,idea会自动识别

- 模拟器
更多的情况还是选择实用模拟器,单击刚刚箭头所指的地方,在下拉列表中的Device Manager中创建模拟器
默认的就可以

千万不要选择这个(血和泪的教训,有bug),选择S就可以

然后后面默认的就可以,直到完成
### 1.4 运行程序
选择对应的机器,运行就可以

这里要点击允许

静静等待运行成功

这样,第一个程序就运行完成了。
### 1.5 hello world的思考
观察MainActivity代码
```java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
```
此代码作用为绘制页面,绘制的是 **R.layout.activity_main** 这个页面。
R是资源的意思,有一个资源类,可以用于调用res目录下的资源。
layout就是res目录下的layout目录,该目录下是描述页面的xml文件。
activity_main是layout下的xml文件,hello world的显示就是此文件描述的。
## 二、hello world进阶
### 2.1 创建新的Activity
1. res/layout目录下创建activity_main2.xml
2. res/values/strings.xml中添加新值:
```xml
Hello World-lesson01
你好 世界!
```
3. activity_main2.xml中调用
通过@string/hello调用刚刚添加的值
activity_main2.xml:
```xml
```
4. java代码中绘制该页面
创建MainActivity2类
```java
package com.example.hello;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity2 extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
}
```
5. AndroidManifest.xml中注册页面,也就是在application标签下添加一个activity
```xml
```
### 2.2 创建按钮
res/layout/activity_main.xml中添加Button标签(可以拖拽,自动生成代码)
activity_main.xml:
```xml
```
### 2.3 添加点击事件跳转至新页面
MainActivity:
```java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, MainActivity2.class));
}
});
}
}
```
findViewById方法可以选中控件
setOnClickListener 添加点击事件
startActivity 跳转至新页面
可以运行看看效果!接下来继续让我们的hello world变强壮。
### 2.4 设置文本属性
- 文本内容
1. xml中设置:使用android:text属性设置,值可以直接输入或是调用res/values/strings.xml中的值
2. 可以在Java代码中设置
首先选择视图(findViewById方法,需要给视图设置一个id),再利用setText方法设置文本内容,同样可以调用res/values/strings.xml中的值
MainActivity2:
```java
public class MainActivity2 extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
TextView textView = findViewById(R.id.main2);
textView.setText(R.string.hello);
}
}
```
- 文本大小
Android中需要适配不同像素密度的屏幕,所以避免使用px作单位,我们要将px转换为sp或dp,sp会跟随系统发生变化,dp不会。
例:标题使用dp,其他使用sp(一切以需求为准)
详细换算以及介绍:https://www.jianshu.com/p/6abf30bf2479
同样能在xml中设置(android:textSize),也能在Java代码中设置,利用setTextSize方法设置文本大小:
MainActivity2:
```java
public class MainActivity2 extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
TextView textView = findViewById(R.id.main2);
textView.setText(R.string.hello);
textView.setTextSize(30);
}
}
```
默认单位为sp,当然也可以使用其他单位,可以点进setTextSize方法查看
详细:https://www.jianshu.com/p/7f2941dbfb17
- 文本颜色
和上面一样的道理
xml:android:textColor
Java:setTextColor方法
MainActivity2:
```java
public class MainActivity2 extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
TextView textView = findViewById(R.id.main2);
textView.setText(R.string.hello);
textView.setTextSize(30);
textView.setTextColor(Color.GREEN);
}
}
```
setTextColor(Color.GREEN);将文本设置为绿色,也可以使用八位颜色setTextColor(0xff00ff00);
### 2.5 设置视图属性
- 视图宽高
修改activity_main2.xml:
```xml
```
可以在这里查看视图

xml中设置宽高主要有三种方式:
1. match_parent:和父视图一致
2. wrap_content:和内容自适应
3. 以dp为单位的具体尺寸
同样,Java代码中也可以设置:
MainActivity2:
```java
public class MainActivity2 extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
TextView textView = findViewById(R.id.main2);
textView.setText(R.string.hello);
textView.setTextSize(30);
textView.setTextColor(0xff00ff00);
ViewGroup.LayoutParams layoutParams = textView.getLayoutParams();
layoutParams.width = Conversion.dp2px(this, 150f);;
textView.setLayoutParams(layoutParams);
textView.setBackgroundColor(Color.BLUE);
}
}
```
利用getLayoutParams获取布局参数,并进行修改,但layoutParams.width是以px为单位的,所以我们需要写一个工具类转换一下单位:
utils/Conversion:
```java
public class Conversion {
public static int dp2px(Context context, Float dpValue) {
int px;
float scale = context.getResources().getDisplayMetrics().density;
px = Math.round(dpValue * scale);
return px;
}
}
```
- 视图间距
有一点前端基础这件事将很简单,不多说
margin:外边距
padding:内边距
activity_main2.xml:
```xml
```
- 视图对齐
两种方式
1. android:gravity=""
指定其子视图的对其方式
2. android:layout_gravity=""
指定视图的对其方式
参数包括:top、right、left、bottom,还有 top|right 这种写法
activity_main2.xml:
```xml
```
## 三、布局
### 3.1 线性布局LinearLayout
新建一个模块,观察activity_main.xml:
```xml
```
android:orientation="vertical",指定了线性布局方向,两个参数
1. vertical:垂直方向
2. horizontal:水平方向(默认)
android:layout_weight="",指定权重
android:layout_width="0dp"时,android:layout_weight表示水平方向宽度的比例
android:layout_height="0dp"时,android:layout_weight表示垂直方向高度的比例
这个理解清楚了就都明白了:

```xml
```
### 3.2 相对布局RelativeLayout
相对布局会根据上一级视图或是同级视图确定位置,如果没有参照物,则默认显示在左上角。
图片来自动脑学院

应用:

activity_main2.xml:
```xml
```
过一遍就可以,忘记就查表
### 3.3 网格布局GridLayout
很简单,就像一个表格一样
两个属性,分别指定行列数:
1. rowCount:行数
2. columnCount:列数
应用:
2*2网格布局:

activity_main3.xml:
```xml
```
### 3.4 滚动视图ScrollView
滚动视图有两种:
ScrollView:垂直方向的滚动视图,当其子视图的高度超过其高度时,就可以滚动
HorizontalScrollView:水平方向滚动视图,同理
应用:
activity_main4.xml:
```xml
```
修改启动页面,运行lesson2即可看到效果(代码中已经改好,直接运行即可)。
## 四、Activity
Activity直译为活动,可以理解为一个屏幕组件,也就是一个页面。
### 4.1 生命周期

如果有其他基础,看这张图就懂了,如果不懂可以看一下一些资料,例如:https://www.jianshu.com/p/fb44584daee3
或是直接运行程序就懂了,直接运行activity-lesson3在Logcat中搜索tag观察输出。
代码中用到的一些方法:
startActivity(intent); 可以用来跳转页面,该方法接收一个intent,从当前activity跳转至指定的activity。
finish(); 可以用来结束当前activity,相当于可以返回上一个activity。
### 4.2 启动模式
activity启动方式有多种,activity是通过任务栈TaskStack管理的。
启动模式可以在AndroidManifest.xml中配置,也可以在Java代码中动态设置
应用:直接运行lesson03-activity看效果(有注释)
#### 4.2.1 标准模式
```xml
android:launchMode="standard"
```
默认为标准模式,会根据activity的启动顺序依次压入栈中
Java代码:
#### 4.2.2 栈顶复用模式
```xml
android:launchMode="singleTop"
```
该模式下,如果栈顶的activity是我们要新增的activity,则不会重复创建activity
#### 4.2.3 栈内服用模式
```xml
android:launchMode="singleTask"
```
该模式下,如果栈内存在目标activity,则不会重复创建,并会将目标activity之上的activity全部弹出栈。
#### 4.2.4 单例模式(全局唯一模式)
```xml
android:launchMode="singleInstance"
```
该模式下,会为目标activity创建一个新的任务栈,并让其获取焦点,新的activity只有这一个实例,如果已经创建过目标activity实例,则不会创建新的task,而是将之前创建过的activity唤醒。
### 4.3 Activity通信
#### 4.3.1 Intent
直译为意图,是组件之间传递信息的对象,用于组件之间通信。
图片来自动脑学院

- 显式Intent
三种方式显式设置目标activity:
```java
// 1.构造方法指定目标activity
Intent intent = new Intent(this, MainActivity4.class);
startActivity(intent);
// 2.setClass方法指定目标activity
Intent intent = new Intent();
intent.setClass(this, MainActivity4.class);
startActivity(intent);
// 3.setComponent方法指定目标activity
Intent intent = new Intent();
ComponentName componentName = new ComponentName(this, MainActivity4.class);
intent.setComponent(componentName);
startActivity(intent);
```
- 隐式Intent
隐式的Intent不直接指定目标activity,而是通过设置action来指定目标activity。
lesson3-activity中的activity_main4即是隐式Intent的示例。
1. 系统action:
```
// set方法设置意图,打开拨号页面
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
Uri uri = Uri.parse("tel:123456");
intent.setData(uri);
startActivity(intent);
// 构造方法设置意图,打开发短信页面
Uri uri = Uri.parse("smsto:123456");
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(intent);
```
系统action大全:https://blog.csdn.net/f552126367/article/details/86524869
2. 自定义规则:
需要在AndroidManifest.xml中配置
程序匹配activity时,需要进行三个匹配,action、category、data,只有三者都匹配上了,activity才会接收这个intent
action可以在intent-filter中设置,并且可以设置多条,匹配时只需要配对成功一条。
category也可以设置多个,但必须设置android.intent.category.DEFAULT。
data。
可跨程序调用,需要将exported设置为true(清单文件中)
示例:lesson3-activity中的activity_main4。
在我们的第一个hello world项目中,修改了清单文件(AndroidManifest.xml),用于测试我们的跨程序调用:
```xml
```
#### 4.3.2 数据传递
1. 向下一个activity发送数据
使用Bundle对象存储需要传递的数据
Bundle对象操作各类数据的读写方法:
图片来自动脑学院

示例:查看代码 SendDataActivity.java (有注释,可以运行lesson03-activity,点击other->go->go to data example)
2. 向上一个activity返回数据
使用registerForActivityResult()方法
示例:查看代码 SendDataActivity.java 和 ReceiveDataActivity.java(有注释,可以运行lesson03-activity,点击other->go->go to data example)
#### 4.3.3 元数据
除了在Strings.xml中配置字符串,还可以在清单文件中配置:
```xml
```
并在代码中调用:
MetaDataActivity.java:
```java
public class MetaDataActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_meta_data);
// 获取当前包管理器
PackageManager packageManager = getPackageManager();
// 获取当前activity的信息对象,从信息中获取bundle
Bundle bundle;
try {
ActivityInfo activityInfo = packageManager.getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
bundle = activityInfo.metaData;
} catch (PackageManager.NameNotFoundException e) {
throw new RuntimeException(e);
}
// 通过getxxx()方法来获取数据
TextView textView = findViewById(R.id.tv_meta_data);
textView.setText(bundle.getString("meta_data"));
}
}
```
AndroidManifest.xml中需要添加元数据:
```xml
```
### 4.4 快捷菜单
长按应用图标,会出来一个小的快捷菜单。
1. 需要在res下创建一个名为xml的文件夹
2. 在该文件夹下创建shortcuts.xml文件:
```xml
```
当LongLabel显示不下时,会显示ShortLabel的内容,这个内容不能直接写,必须是引用,所以需要在strings.xml中新增字符串。
intent指定了点击快捷菜单后,会跳转到哪个activity
3. 在清单文件中注册元数据(在主activity下注册):
```xml
```
4. 长按应用图标:

## 五、控件