12 KiB
12 KiB
Android基础
目录
Android系统架构
四层架构
┌─────────────────────────────────┐
│ Applications(应用层) │
│ (系统应用、第三方应用) │
└─────────────────────────────────┘
│
┌─────────────────────────────────┐
│ Application Framework(应用框架层)│
│ (Activity Manager, Content Provider等)│
└─────────────────────────────────┘
│
┌─────────────────────────────────┐
│ Libraries & Android Runtime │
│ (系统库、Android运行时) │
└─────────────────────────────────┘
│
┌─────────────────────────────────┐
│ Linux Kernel(Linux内核) │
│ (驱动、内存管理、进程管理等) │
└─────────────────────────────────┘
各层说明
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:ART(Android 5.0+)或 Dalvik
4. Linux 内核
- 驱动:显示驱动、音频驱动、相机驱动等
- 内存管理、进程管理、网络协议栈
应用组件
四大组件
1. Activity(活动)
// Activity:用户界面
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
2. Service(服务)
// Service:后台服务
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
3. BroadcastReceiver(广播接收器)
// BroadcastReceiver:接收广播
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 处理广播
}
}
4. ContentProvider(内容提供者)
// ContentProvider:数据共享
public class MyProvider extends ContentProvider {
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// 查询数据
return null;
}
}
应用生命周期
Application 生命周期
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 生命周期
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 重新启动
}
}
资源管理
资源类型
<!-- 字符串资源 -->
<string name="app_name">MyApp</string>
<!-- 颜色资源 -->
<color name="primary">#3F51B5</color>
<!-- 尺寸资源 -->
<dimen name="padding">16dp</dimen>
<!-- 布局资源 -->
<layout>...</layout>
<!-- 图片资源 -->
<drawable>...</drawable>
资源访问
// 代码中访问资源
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"
多语言支持
<!-- 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)
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2. 危险权限(Dangerous Permissions)
// 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 {
// 权限被拒绝
}
}
}
权限组
// 权限组
// - CALENDAR:日历权限
// - CAMERA:相机权限
// - CONTACTS:联系人权限
// - LOCATION:位置权限
// - MICROPHONE:麦克风权限
// - PHONE:电话权限
// - SENSORS:传感器权限
// - SMS:短信权限
// - STORAGE:存储权限
应用签名
签名作用
- 身份标识:标识应用开发者
- 完整性验证:确保应用未被篡改
- 权限控制:相同签名的应用可以共享数据
签名流程
# 生成密钥库
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 配置
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
构建工具
// 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 版本
android {
defaultConfig {
targetSdkVersion 30 // 目标 SDK 版本
}
}
版本适配要点
Android 6.0 (API 23) - 运行时权限
// 需要运行时申请危险权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(...);
}
Android 7.0 (API 24) - FileProvider
<!-- 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) - 通知渠道
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) - 网络安全
<!-- 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) - 分区存储
// 使用 MediaStore 访问文件
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// 使用作用域存储
}
Android 11 (API 30) - 包可见性
<!-- AndroidManifest.xml -->
<queries>
<package android:name="com.example.package" />
</queries>
面试常见问题
Q1: Android 系统架构?
答案: 四层架构:
- 应用层:系统应用和第三方应用
- 应用框架层:Activity Manager、Window Manager 等
- 系统库和运行时:系统库、ART
- Linux 内核:驱动、内存管理、进程管理
Q2: 四大组件?
答案:
- Activity:用户界面
- Service:后台服务
- BroadcastReceiver:广播接收器
- ContentProvider:内容提供者
Q3: Activity 生命周期?
答案: onCreate → onStart → onResume → onPause → onStop → onDestroy onRestart(从 onStop 恢复时调用)
Q4: 权限系统?
答案:
- 普通权限:安装时自动授予
- 危险权限:Android 6.0+ 需要运行时申请
- 特殊权限:需要特殊处理
Q5: 版本适配要点?
答案:
- Android 6.0:运行时权限
- Android 7.0:FileProvider
- Android 8.0:通知渠道
- Android 9.0:网络安全
- Android 10:分区存储
- Android 11:包可见性
最后更新:2024年