这份教程将从 新特性概览、核心开发概念 和 实践代码示例 三个部分展开。

第一部分:Android 5.0 (Lollipop) 新特性概览
Android 5.0 带来了自 Android 4.0 以来最大的一次设计语言和系统架构的革新,其核心主题是 “Material Design”。
1. Material Design (设计语言)
这是 Android 5.0 最重要的变化,它是一套全新的、跨平台的设计规范,旨在创造一个视觉、交互和反馈都更加统一、有层次感的世界。
- 核心概念:
- 物质: UI 元素不再是扁平的,而是像一张张纸片(Z轴),它们有厚度、阴影和边界,可以堆叠、移动。
- 阴影: 通过阴影的深浅和大小来暗示元素之间的层级关系,越“高”的元素,阴影越大、越柔和。
- 动画: 动画不再是简单的淡入淡出,而是有物理意义的,一个按钮被按下时,会有涟漪效果;页面切换时,元素会平滑地移动和变形,而不是瞬间跳转。
- 网格: 布局基于一个 8dp 的网格系统,确保了元素的对齐和间距的统一性。
2. 用户体验 重大更新
-
通知系统: 这是 Android 5.0 另一个革命性的改变。
- 锁屏通知: 重要的通知可以直接显示在锁屏上,用户无需解锁即可查看和快速操作(如回复短信、接听电话)。
- 通知优先级: 通知被分为不同优先级(高、中、低),高优先级的通知会弹出 Heads-up 通知(一个悬浮在屏幕顶部的半透明窗口),用户可以即时处理,稍后它也会进入通知栏。
- 通知渠道: 后续版本(Android 8.0)才正式引入,但 5.0 的通知分组和操作按钮为这一概念奠定了基础。
-
多任务界面: 按下“最近任务”按钮后,不再是简单的应用缩略图列表,而是以卡片堆叠的形式展示,每个卡片都包含了该应用的状态,用户可以左右滑动来切换。
(图片来源网络,侵删) -
性能与电池优化:
- ART 运行时: Android 5.0 默认用 ART (Android Runtime) 取代了旧的 Dalvik,ART 在应用安装时进行预编译(AOT, Ahead-Of-Time),将代码编译成机器码,这极大地提升了应用的运行速度、减少了卡顿,并降低了内存占用。
- Project Volta: 一系列旨在提升电池续航的技术,包括“JobScheduler” API,允许应用在系统认为合适的时机(如充电、连接WiFi)批量执行任务,从而减少不必要的唤醒。
3. 开发者 API 新特性
- Material Design 组件: 提供了一系列符合新设计规范的控件和主题,如
FloatingActionButton,Snackbar,CardView,RecyclerView等。 - 新控件:
- RecyclerView: 用于高效显示滚动列表的控件,是
ListView的超级升级,它通过复用视图项,极大地提升了长列表的性能。 - CardView: 一个可以添加圆角和阴影的
FrameLayout,是实现 Material Design 卡片效果的利器。 - Snackbar: 提供轻量级反馈的控件,它从屏幕底部滑入,几秒后自动消失,比
Toast更灵活,可以包含一个操作按钮。
- RecyclerView: 用于高效显示滚动列表的控件,是
- 色彩系统: 引入了新的颜色资源类型,如
?attr/colorPrimary,?attr/colorPrimaryDark,?attr/colorAccent,让主题定制变得非常简单。 - JobScheduler API: 如上所述,用于优化后台任务执行,提升电池续航。
第二部分:核心开发概念与实践
1. 设置项目环境
- 安装 Android Studio: 这是 Google 官方推荐的 IDE。
- 创建新项目:
- 打开 Android Studio,选择 "Start a new Android Studio project"。
- 选择 "Empty Activity" 模板。
- 在 "Configure your project" 界面,将 Minimum SDK 设置为 API 21: Android 5.0 (Lollipop),这表示你的应用最低将支持 Android 5.0 系统。
- 完成创建。
2. 应用 Material Design 主题
为了让你的应用看起来像 Android 5.0 的原生应用,你需要修改 res/values/styles.xml 和 res/values-v21/styles.xml 文件。
res/values/styles.xml (适用于所有版本, 包括 5.0)
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
res/values-v21/styles.xml (仅适用于 API 21 及以上, 即 Android 5.0+)

这个文件会覆盖 values/styles.xml 中的设置,从而启用 Material Design 的特有功能,如状态栏颜色。
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- 在 Android 5.0+ 上,将状态栏颜色设置为 colorPrimaryDark -->
<item name="android:windowContentTransitions">true</item>
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
<item name="android:windowSharedElementEnterTransition">@android:transition/move</item>
<item name="android:windowSharedElementExitTransition">@android:transition/move</item>
</style>
</resources>
3. 使用 Material Design 控件
示例 1: 使用 CardView 和 RecyclerView
res/layout/activity_main.xml
<androidx.recyclerview.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/my_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
res/layout/list_item.xml (列表项的布局)
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:cardCornerRadius="8dp"
app:cardElevation="4dp">
<TextView
android:id="@+id/text_view_item"
android:layout_width="match_parent"
android:layout_height="80dp"
android:gravity="center"
android:text="Item Text"
android:textSize="20sp" />
</androidx.cardview.widget.CardView>
MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private MyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = findViewById(R.id.my_recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
// 准备数据
List<String> myData = new ArrayList<>();
for (int i = 0; i < 30; i++) {
myData.add("Item " + (i + 1));
}
// 创建并设置适配器
mAdapter = new MyAdapter(myData);
mRecyclerView.setAdapter(mAdapter);
}
}
MyAdapter.java (自定义 RecyclerView 适配器)
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private List<String> mData;
public MyAdapter(List<String> data) {
this.mData = data;
}
// 创建新的ViewHolder
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new MyViewHolder(view);
}
// 绑定数据到ViewHolder
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.textView.setText(mData.get(position));
}
// 返回数据总数
@Override
public int getItemCount() {
return mData.size();
}
// 自定义ViewHolder
public static class MyViewHolder extends RecyclerView.ViewHolder {
public TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.text_view_item);
}
}
}
示例 2: 使用 Snackbar
在 MainActivity.java 的 onCreate 方法中添加:
// 在 onCreate 方法末尾添加
findViewById(R.id.my_recycler_view).post(() -> {
androidx.appcompat.widget.Snackbar.make(
findViewById(R.id.my_recycler_view),
"这是一个 Snackbar!",
androidx.appcompat.widget.Snackbar.LENGTH_SHORT
).setAction("点击", v -> {
// 点击 "点击" 按钮后执行的逻辑
androidx.appcompat.widget.Snackbar.make(
findViewById(R.id.my_recycler_view),
"你点击了按钮!",
androidx.appcompat.widget.Snackbar.LENGTH_SHORT
).show();
}).show();
});
(注意:在旧版 Android Studio 中,Snackbar 可能是 android.support.design.widget.Snackbar,但现在推荐使用 AndroidX 库中的版本)
第三部分:重要注意事项与后续发展
1. 维护旧版应用的注意事项
如果你现在需要维护一个基于 Android 5.0 的旧应用,
- 安全风险: Android 5.0 已停止安全更新,存在已知的安全漏洞,应尽快引导用户升级到更新的系统版本。
- API 废弃: 许多在 5.0 中引入的 API(如部分通知相关的)在后续版本中被更优的 API 替代,在升级应用时,需要仔细处理这些废弃 API。
- ART 兼容性: 如果你的应用需要兼容 Android 5.0 之前的版本(使用 Dalvik),你需要确保代码在两种运行时下都能正常工作。
2. Android 5.0 之后的发展
- Android 6.0 (Marshmallow, 2025): 引入了运行时权限、Doze 模式(更深度省电)和指纹识别支持。
- Android 7.0 (Nougat, 2025): 引入了多窗口模式、通知渠道和 Java 8 语言特性支持。
- Android 8.0 (Oreo, 2025): 强制了后台执行限制、引入了官方的通知渠道、画中画模式等。
- Android 10 (2025): 取消了版本命名(甜品名),专注于隐私、安全和5G。
Android 5.0 Lollipop 是一个里程碑式的版本,它通过 Material Design 彻底改变了 Android 的视觉语言,并通过 ART 运行时 和 改进的通知系统 大幅提升了用户体验和系统性能,对于开发者来说,学习 Android 5.0 意味着掌握了现代 Android 应用的设计基石,如 RecyclerView 和 Snackbar 等组件至今仍在广泛使用,虽然它已成为历史,但其设计理念和技术遗产深刻地影响了整个 Android 生态系统。
