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

12 KiB
Raw Blame History

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 SystemUI 组件
  • Package Manager:应用管理
  • Telephony Manager:电话管理
  • Resource Manager:资源管理
  • Location Manager:位置管理
  • Notification Manager:通知管理

3. 系统库和运行时

  • 系统库SQLite、WebKit、OpenGL ES 等
  • Android RuntimeARTAndroid 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存储权限

应用签名

签名作用

  1. 身份标识:标识应用开发者
  2. 完整性验证:确保应用未被篡改
  3. 权限控制:相同签名的应用可以共享数据

签名流程

# 生成密钥库
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 系统架构?

答案: 四层架构:

  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年