Files
mkdocs/docs/android面试/基础知识/Android基础.md
2026-01-15 11:53:37 +08:00

523 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Android基础
## 目录
- [Android系统架构](#android系统架构)
- [应用组件](#应用组件)
- [应用生命周期](#应用生命周期)
- [资源管理](#资源管理)
- [权限系统](#权限系统)
- [应用签名](#应用签名)
- [打包流程](#打包流程)
- [版本适配](#版本适配)
- [面试常见问题](#面试常见问题)
---
## Android系统架构
### 四层架构
```
┌─────────────────────────────────┐
│ Applications应用层
│ (系统应用、第三方应用) │
└─────────────────────────────────┘
┌─────────────────────────────────┐
│ Application Framework应用框架层
│ (Activity Manager, Content Provider等)│
└─────────────────────────────────┘
┌─────────────────────────────────┐
│ Libraries & Android Runtime │
│ (系统库、Android运行时) │
└─────────────────────────────────┘
┌─────────────────────────────────┐
│ Linux KernelLinux内核
│ (驱动、内存管理、进程管理等) │
└─────────────────────────────────┘
```
### 各层说明
#### 1. 应用层Applications
- 系统应用:电话、短信、浏览器等
- 第三方应用:用户安装的应用
#### 2. 应用框架层Application Framework
- **Activity Manager**:管理 Activity 生命周期
- **Window Manager**:管理窗口
- **Content Provider**:数据共享
- **View System**UI 组件
- **Package Manager**:应用管理
- **Telephony Manager**:电话管理
- **Resource Manager**:资源管理
- **Location Manager**:位置管理
- **Notification Manager**:通知管理
#### 3. 系统库和运行时
- **系统库**SQLite、WebKit、OpenGL ES 等
- **Android Runtime**ARTAndroid 5.0+)或 Dalvik
#### 4. Linux 内核
- 驱动:显示驱动、音频驱动、相机驱动等
- 内存管理、进程管理、网络协议栈
---
## 应用组件
### 四大组件
#### 1. Activity活动
```java
// Activity用户界面
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
```
#### 2. Service服务
```java
// Service后台服务
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
```
#### 3. BroadcastReceiver广播接收器
```java
// BroadcastReceiver接收广播
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 处理广播
}
}
```
#### 4. ContentProvider内容提供者
```java
// ContentProvider数据共享
public class MyProvider extends ContentProvider {
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// 查询数据
return null;
}
}
```
---
## 应用生命周期
### Application 生命周期
```java
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 应用创建时调用
}
@Override
public void onTerminate() {
super.onTerminate();
// 应用终止时调用(通常不会调用)
}
@Override
public void onLowMemory() {
super.onLowMemory();
// 内存不足时调用
}
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
// 内存紧张时调用
}
}
```
### Activity 生命周期
```java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 创建 Activity
}
@Override
protected void onStart() {
super.onStart();
// Activity 可见但不可交互
}
@Override
protected void onResume() {
super.onResume();
// Activity 可见且可交互
}
@Override
protected void onPause() {
super.onPause();
// Activity 失去焦点
}
@Override
protected void onStop() {
super.onStop();
// Activity 不可见
}
@Override
protected void onDestroy() {
super.onDestroy();
// Activity 被销毁
}
@Override
protected void onRestart() {
super.onRestart();
// Activity 重新启动
}
}
```
---
## 资源管理
### 资源类型
```xml
<!-- 字符串资源 -->
<string name="app_name">MyApp</string>
<!-- 颜色资源 -->
<color name="primary">#3F51B5</color>
<!-- 尺寸资源 -->
<dimen name="padding">16dp</dimen>
<!-- 布局资源 -->
<layout>...</layout>
<!-- 图片资源 -->
<drawable>...</drawable>
```
### 资源访问
```java
// 代码中访问资源
String appName = getString(R.string.app_name);
int color = getColor(R.color.primary);
float padding = getResources().getDimension(R.dimen.padding);
// XML 中访问资源
android:text="@string/app_name"
android:background="@color/primary"
android:padding="@dimen/padding"
```
### 多语言支持
```xml
<!-- values/strings.xml默认 -->
<string name="hello">Hello</string>
<!-- values-zh/strings.xml中文 -->
<string name="hello">你好</string>
<!-- values-en/strings.xml英文 -->
<string name="hello">Hello</string>
```
---
## 权限系统
### 权限类型
#### 1. 普通权限Normal Permissions
```xml
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
```
#### 2. 危险权限Dangerous Permissions
```java
// Android 6.0+ 需要运行时申请
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
REQUEST_CODE);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限已授予
} else {
// 权限被拒绝
}
}
}
```
### 权限组
```java
// 权限组
// - CALENDAR日历权限
// - CAMERA相机权限
// - CONTACTS联系人权限
// - LOCATION位置权限
// - MICROPHONE麦克风权限
// - PHONE电话权限
// - SENSORS传感器权限
// - SMS短信权限
// - STORAGE存储权限
```
---
## 应用签名
### 签名作用
1. **身份标识**:标识应用开发者
2. **完整性验证**:确保应用未被篡改
3. **权限控制**:相同签名的应用可以共享数据
### 签名流程
```bash
# 生成密钥库
keytool -genkey -v -keystore my-release-key.jks
-keyalg RSA -keysize 2048 -validity 10000
-alias my-key-alias
# 签名 APK
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1
-keystore my-release-key.jks app-release-unsigned.apk my-key-alias
# 验证签名
jarsigner -verify -verbose -certs app-release-unsigned.apk
```
### Gradle 配置
```gradle
android {
signingConfigs {
release {
storeFile file('my-release-key.jks')
storePassword 'password'
keyAlias 'my-key-alias'
keyPassword 'password'
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
```
---
## 打包流程
### APK 构建流程
```
1. 编译 Java/Kotlin 代码 → .class 文件
2. 转换为 DEX 文件
3. 打包资源文件
4. 生成未签名 APK
5. 签名 APK
6. 对齐优化zipalign
7. 生成最终 APK
```
### 构建工具
```gradle
// build.gradle
android {
compileSdkVersion 30
defaultConfig {
applicationId "com.example.app"
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
```
---
## 版本适配
### Target SDK 版本
```gradle
android {
defaultConfig {
targetSdkVersion 30 // 目标 SDK 版本
}
}
```
### 版本适配要点
#### Android 6.0 (API 23) - 运行时权限
```java
// 需要运行时申请危险权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(...);
}
```
#### Android 7.0 (API 24) - FileProvider
```xml
<!-- AndroidManifest.xml -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
```
#### Android 8.0 (API 26) - 通知渠道
```java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
CHANNEL_ID, "Channel Name", NotificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(channel);
}
```
#### Android 9.0 (API 28) - 网络安全
```xml
<!-- network_security_config.xml -->
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
```
#### Android 10 (API 29) - 分区存储
```java
// 使用 MediaStore 访问文件
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// 使用作用域存储
}
```
#### Android 11 (API 30) - 包可见性
```xml
<!-- AndroidManifest.xml -->
<queries>
<package android:name="com.example.package" />
</queries>
```
---
## 面试常见问题
### Q1: Android 系统架构?
**答案:**
四层架构:
1. **应用层**:系统应用和第三方应用
2. **应用框架层**Activity Manager、Window Manager 等
3. **系统库和运行时**系统库、ART
4. **Linux 内核**:驱动、内存管理、进程管理
### Q2: 四大组件?
**答案:**
1. **Activity**:用户界面
2. **Service**:后台服务
3. **BroadcastReceiver**:广播接收器
4. **ContentProvider**:内容提供者
### Q3: Activity 生命周期?
**答案:**
onCreate → onStart → onResume → onPause → onStop → onDestroy
onRestart从 onStop 恢复时调用)
### Q4: 权限系统?
**答案:**
- **普通权限**:安装时自动授予
- **危险权限**Android 6.0+ 需要运行时申请
- **特殊权限**:需要特殊处理
### Q5: 版本适配要点?
**答案:**
- Android 6.0:运行时权限
- Android 7.0FileProvider
- Android 8.0:通知渠道
- Android 9.0:网络安全
- Android 10分区存储
- Android 11包可见性
---
*最后更新2024年*