安卓作为日常生活中不可缺少的移动操作系统,在5G的发展和应用过程中发挥着其重要的作用。
5G是第五代移动通信技术,拥有更快的速度、更高的带宽、更低的延迟和更大的连接密度。这一技术的快速发展为移动设备和应用提供了更多的可能性。
安卓和5G的关系是相辅相成的,两者共同推动了移动通信和应用技木的发展,为用户带来了更加便捷、高效的移动体验。
一、5G与智能终端
1.1 5G网络技术
5G的简称是第五代移动通信技术(Fifth Generation),LDPC码、极化码、Turbo码。
5G之前移动通信标准经历了 1G(模拟语音)、2G(数字化语音)、3G(多媒体通信)、4G(无线宽带)的发展历程。
1.2 智能终端
在5G时代,智能终端的内涵更为广泛,可以通过网络
实现高速、低延迟的互联网接入,为用户提供更加丰富、便捷的服务。
智能终端是指安装手机操作系统(如Android、iOS等)的设备,通过使用宽带无线移动通信技术(如4G、5G等)实现互联网接入。这些设备可以通过下载、安装应用软件和数字内容为用户提供服务,如社交媒体、游戏、购物、支付等。这些设备具备一定的智能计算能力,能够执行一些复杂的任务,如语音识别、图像识别、自然语言处理等。
智能手机
包括:硬件、操作系统、网络支持
1.2.1 常见的移动操作系统:
智能手机操作系统主要有Android、iOS和鸿蒙。
Android:Android是由谷歌(Google)开发的开源操作系统,被广泛应用于大多数智能手机和平板电脑上。它提供了强大的自定义功能和丰富的应用程序生态系统(Google Play商店)。Android具有灵活性和开放性的特点,允许用户自定义和调整其界面和功能,支持多任务处理、通知管理、智能助手等功能。
iOS:iOS是由苹果公司开发的专有操作系统,仅用于苹果公司的iPhone、iPad和iPod Touch等设备。iOS设计简洁、稳定而流畅,注重用户体验和安全性。它提供了一个丰富的应用程序生态系统(App Store),并与苹果的硬件和软件紧密集成,提供优化和统一的使用体验。
鸿蒙(HarmonyOS):鸿蒙是华为公司自主研发的分布式操作系统,于2019年正式发布。鸿蒙旨在构建一种支持多设备、多场景的统一操作系统,涵盖手机、平板、智能穿戴、智能家居、汽车等多个领域。鸿蒙具有高度的灵活性和可扩展性,能够快速适配各种设备并提供流畅的体验。
总的来说,Android和iOS是目前市场份额最大的智能手机操作系统,它们都有自己独特的特点和优势;而鸿蒙作为新兴的操作系统,正在不断发展和拓展应用范围,为用户带来更多可能性。
1.2.2 未来的发展
安全性、电池采用新技术、人工智能等等一系列为更好的交互体验。
二、Android 简介
Android基于Linux内核,这使得它具有强大的硬件兼容性和稳定性。
iOS基于Unix内核,这使得它具有良好的稳定性和安全性。
Android平台组成:操作系统、中间件、用户界面、应用软件。
2.0 Android SDK
SDK (Software development kit) ,软件开发工具包,是指为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。Android SDK是指专门用于Android手机操作系统创建应用软件的软件开发工具包。
2.1 体系结构:
应用程序程序层、应用框架层、系统库和Android运行时和Linux内核(操作系统OS)
(0)在Android系统的架构中,通常包括以下几个主要层级:
-
Linux内核层:作为Android系统的基础,提供了底层的硬件驱动、内存管理、进程管理等功能。Android系统构建在Linux内核之上,利用Linux内核提供的稳定性和安全性。
-
Android系统运行库层:包括了C/C++库以及一些核心的Java类库,用于支持Android应用程序的运行。其中包括了运行时环境和核心Java类库,支持应用程序的运行和管理。
-
Android应用框架层:提供了各种系统服务和API接口,包括了窗口管理、资源管理、通讯服务等。开发人员可以通过应用框架层提供的API来访问系统功能,实现应用程序的开发和运行。
-
Android应用层:最上层是用户直接面对的应用程序,包括各种应用软件,如社交应用、游戏、工具应用等。用户通过应用层与系统交互,进行各种操作和任务。
了解Android各个版本及API之间的关系
(1)底层Linux(核心)
Linux内核层为Android设备的各种硬件提供了底层的驱动
C语言开发,只提供基本功能是硬件和其他软件之间的一个抽象隔离层。提供着安全机制、内存管理、进程管理、网络协议栈、WIFI驱动、电源管理等等。
(2)中间层
包含库和虚拟机,由C++开发的
函数库
Surface Manager:用于管理屏幕显示和窗口管理。负责处理显示表面的分配、合成和刷新等任务,帮助应用程序实现流畅的界面显示和交互。
Media Framework:用于处理音频和视频数据的录制、播放和管理。
SQLite是一种轻量级的关系数据库管理系统,被广泛用于安卓系统中存储和管理应用程序的数据。
在安卓系统中,字体渲染通过FreeType库来实现。
运行时
核心库:提供了Android系统特有的功能和Java功能的代码
Dalvik虚拟机:Android系统的核心组件之一,它是一个基于寄存器的虚拟机;主要功能是运行Dex格式的字节码,这是Android系统中的应用程序的标准格式。
[是.class文件编译后产生的,因此文件更小。]
(一个应用启动都运行一个单独的虚拟机运行在-一个物的进程中。)
通过Dalvik虚拟机来运行Java程序。Dex文件相比jar更加紧凑,但是为了在运行过程中进一步提高性能,dex文件还会进一步优化成odex文件。
(3)应用框架层
在安卓系统中,应用框架层是系统的核心部分,它提供了许多关键的服务和API,应用程序可以运行在安卓设备上。以下是应用框架层的一些主要组成部分:
-
Activity Manager:负责管理应用的生命周期,包括创建、销毁和切换应用。
-
Window Manager:负责管理应用的窗口,包括窗口的创建、销毁和切换。
-
Content Providers:应用可以共享数据(跨进程数据访问)。
-
View System:应用可以创建和管理用户界面。
-
Package Manager:负责管理应用的安装、卸载和更新。
-
Telephony Manager:应用可以访问电话服务。
-
Location Manager:应用可以访问位置服务(地图相关的服务)。
-
Notification Manager:应用可以创建和管理通知(状态栏显示提示信息)。
-
Resource Manager:应用可以访问系统资源,如字符串、图像和布局(处理非代码内容)。
-
Activity Manager Service:应用可以访问系统的活动管理服务。
这些组件共同工作,使得应用可以在安卓设备上运行,并与设备的硬件和其他应用进行交互。
(4)应用层
应用层是用户直接与之交互的部分,包括各种应用程序和用户界面。
由Java/kotlin编写
自带的联系人程序、短信程序,或者从Google Play上下载的小游戏等都属于应用程序层。
2.2 Android Studio
2.2.1 安装
(需要同意其协议)下载 Android Studio 和应用工具 - Android 开发者 | Android Developers (google.cn)
养成良好的习惯,我们把和开发的相关工具放置在D盘下我们创建一个develop文件夹中方便管理。
2.2.2 运行程序
new一个Empty Views Activity
当我们以java为例的讲解的时候我们就把语言选择为Java,
当然我们还需要把脚本控制语言换成Gradle
最终的是我们一定要确定好包名和项目的保存地址
API尽量选择用户可以上行下行几乎键入的版本
同意并等待Gradle的项目构建
运行程序,最终可以看到自带的模拟器出现app程序
2.2.3 卸载
(1)控制面板 ->程序(卸载程序)
(2)配置信息的删除
【1】进入“C:\Users<你的用户名下>”目录下
删除文件夹
删除.android 文件夹
删除 .AndroidStudioX.X文件夹
删除.gradle 文件夹
删除Android文件夹【2】用户名下>\AppData\Roaming\Google 删除 .AndroidStudioX.X 文件夹
【3】进入C:\Users\lenovo\AppData\Local\Google 删除 .AndroidStudioX.X 文件夹
2.2.4 创建一个心仪的AVD虚拟机
2.2.5 插件推荐
2.2.6 Android Studio面板介绍
2.2.7 LogCat
多个级别–颜色不同
2.3 如何工作的
2.3.1 生成APK
- 代码编译
android应用程序源文件是用Java(.java文件)或Kotlin(.kt文件)编程语言编写的。
在 Android 环境中,该过程从将 Java/Kotlin 源代码编译到 Java 类文件中开始。类文件的扩展名为 *.class,它包含 java 字节码(表示 Java 程序集)。此编译任务分别由 Java 和 Kotlin 语言代码的 javac 和 kotlinc 编译器执行。 - 转换为 Dalvik 字节码
Android 有自己独特的字节码格式,称为 Dalvik 字节码。Dex 编译器将 Java 字节码转换为 Dalvik 字节码,后者是理论处理器的机器码指令。在编译过程中,dx 命令将所有 .class 文件以及 .jar 文件绑定在一起,并创建一个以 Dalvik 字节码格式编写的 classes.dex 文件 。此文件现在可以在称为Android Runtime(或Dalvik Virtual Machine(DVM)的Android版本早于Kitkat(4.4))的Android操作系统中的虚拟机上执行。 - 生成.apk文件
由Android Asset Packaging Tool(aapt)转换为单个编译的资源单元。此外,编译后的资源单元以及 classes.dex 文件由 apkbuilder 工具压缩,并创建一个类似 zip 的文件,称为 Android Package(.apk file)。生成的 .apk 文件包含运行 Android 应用程序所需的所有数据。 - 应用分发
开发人员需要对其进行签名。Android 应用程序需要使用证书进行数字签名,以便用户可以安装它们。
2.3.2 部署应用程序
Android Debug Bridge(ADB) 将应用程序部署到 Android 设备。它是一个命令行工具,充当界面并方便开发人员与 android 设备进行通信
ADB 命令将 .apk 文件传输到目标 Android 设备的本地文件系统中。设备文件系统中的应用位置由其包名称定义。
三、Android 应用程序
3.1 项目构成
AndroidManifest.xml
AndroidManifest.xml是XML格式的Android程序声明文件,是全局描述文件,包含了Android系统运行Android程序前所必须掌握的重要信息,这些信息包含应用程序名称、图标、包名称、模块组成、授权和SDK最低版本等。创建的每个Android项目应用程序必须在根目录下包含一个AndroidManifest.xml工程文件
3.2 安卓的四大组件包括:
- Activity(活动):Activity是Android应用的一个组件,它提供了一个屏幕,用户可以在屏幕上进行交互。每个Activity都是一个单独的类,它通常对应于应用的一个屏幕。
Activity(活动)
显示可视化的用户界面,并接收到所有因交互所产生的事件。我们的App可以包含一个或者多个活动,其中只有一个座位mainActivity启动显示。View来管理用户界面UI,通过XML描述定义,也可以在代码中生成。类swing设计,通过布局layout组织。
- Service(服务):Service是一个后台运行的组件,它没有用户界面。Service通常用于执行长时间运行的操作,例如下载文件或播放音乐。
服务就像我们应用程序的隐形工人。这些组件在后端运行,更新数据源和活动,触发通知,并广播意向。当应用程序处于非活动状态时,它们还会执行一些任务。
public class ServiceName extends Service {
}
-
BroadcastReceiver(广播接收器):BroadcastReceiver是一个组件,它可以接收系统或应用发送的广播消息。例如,当设备的电池电量发生变化时,系统会发送一个广播消息,所有注册了电池电量变化的BroadcastReceiver都会接收到这个消息。
-
ContentProvider(内容提供器):ContentProvider是一个组件,它提供了一种统一的方式来访问应用的数据。其他应用可以通过ContentProvider来读取或写入应用的数据,这样可以确保数据的安全性和一致性。
它用于管理和保存应用程序数据,通常也与 SQL 数据库交互。他们还负责在应用程序边界之外共享数据。可以将特定应用程序的内容提供程序配置为允许从其他应用程序进行访问,也可以配置其他应用程序公开的内容提供程序。
public class contentProviderName extends ContentProvider {
public void onCreate(){}
}
3.3 Android 生命周期
3.3.1 程序生命周期
Android 应用程序的进程可以根据它们所处的状态被分为几种类型:前台进程、可见进程、服务进程、后台进程和空进程。这些状态影响着Android系统对进程的管理和可能的终止顺序。
- 前台进程(Foreground process)–用户正在进行交互的进程:
- 这些进程对用户来说是可见的,并且正在与用户交互。例如,用户正在与应用的界面互动,或者应用的一个组件正在执行某些对用户来说是可见的操作(如播放音乐或执行语音导航)。
- 系统尽量保持这些进程不被杀死,除非在极端的内存不足情况下。
用户正在进行交互的活动
当服务被调用且正在进行交互,
进程服务正在回调方法(onCreate()、onStart()、onDestroy())
进程的BroadcastReceiver正在执行onReceive()方法
-
可见进程(Visible process):
一个进程包含服务,且这个服务正在被用户可见的活动调用 不在前台与用户交互且不影响界面事件的进程。
- 这些进程不在前台,但仍对用户可见。比如,一个Activity已经进入了“暂停”(Paused)状态,不再处于前台,但用户仍然可以看到它(比如,当用户在一个透明的新Activity上)。
- 这些进程也很少被系统杀死,除非内存非常紧张。
-
服务进程(Service process):
无用户界面,在后台长期运行。
- 当应用中有正在运行的服务时,该应用就处于服务进程状态。即使用户不与应用直接交互,这些服务可能在后台执行长时间运行的操作。
- 系统会尽量保持这些进程,但在需要为前台进程或可见进程释放内存时,它们可能会被杀死。
-
后台进程(Background process):
不包含已经启动的服务,且没有可视化的活动进程
- 当Activity不再对用户可见时,它就进入了后台进程状态。系统可能会随时终止这些进程,以便为前台进程或其他更重要的进程释放内存。
- 这些进程是系统回收内存时的首选目标(优先处理的,数量较多的)。
-
空进程(Empty process):
优先级: 取决于所有组件优先级最高的部分; 根据其他进程的依赖关系所变化。
- 这些进程不包含任何活动的应用组件。它们通常是系统已经终止了应用的组件,但仍然保留了进程本身,以便更快地重新启动应用。
- 这些进程是系统回收内存时的首选目标之一,通常在后台进程之后被杀死。
为提高启动速度,将其保留在系统内存中,重新启动程序时,空进程会被再次启动
3.3.2 组件的生命周期
(1)服务(Service)
服务是 Android 应用开发中一个强大的组件,能够执行后台任务而不影响用户的主线程
需要谨慎使用,以避免消耗过多的系统资源。
Android 中的服务是一个特殊组件,它有助于应用程序在后台运行,以便执行长时间运行的操作任务。
确保应用程序在后台保持活动状态,以便用户可以同时操作多个应用程序。
Android 服务(Service)主要可以分为两种类型:
前台服务(ForegroundService)和后台服务(Background Service)。
此外,还有一种特殊类型的服务称为绑定服务(Bound Service)
它可以是前台服务也可以是后台服务,具体取决于其如何被使用。
1. 前台服务(Foreground Service)
前台服务因其对用户可见性而被系统赋予较高的优先级,不太可能因为系统内存不足而被杀死。
-
前台服务是一种必须向用户显示通知的服务,这意味着用户清楚地知道某个服务正在运行。
这种服务用于执行用户主动启动且希望持续运行的操作,即使用户不与应用交互。
-
例如,音乐播放器应用在后台播放音乐或导航应用在后台提供导航指示时使用的服务。
2. 后台服务(Background Service)
-
后台服务是在应用不在前台时执行操作的服务。
这类服务对用户来说不直接可见,且通常用于执行不需要用户即时知晓结果的操作。
例如,应用可能在后台服务中同步数据或处理复杂的计算。
-
对后台服务的使用上的限制,以减少对系统性能的影响。应用在后台时,不能随意启动后台服务。
3. 绑定服务(Bound Service)
- 绑定服务是一种通过调用
bindService()
来创建的服务,允许组件(如Activity)与服务进行通信,发送请求,接收响应,甚至进行进程间通信(IPC)。一个服务可以同时被多个组件绑定。 - 绑定服务只在另一个应用组件与之绑定时运行,因此不需要显示通知。当所有组件都解除绑定后,服务会被销毁。
- 绑定服务可以是前台服务,也可以是后台服务,这取决于它是否调用了
startForeground()
方法。
4.选择服务类型
如果操作必须由用户明确启动并且需要持续用户注意(如播放音乐),则应使用前台服务。
如果操作可以在后台静默运行,并且不需要用户的持续注意,可以考虑使用后台服务
如果需要组件与服务进行通信,则应使用绑定服务。
5.服务的生命周期
6. 启动服务
在Android中,服务(Service)的生命周期可以通过两种方式来完成:Started(启动式)和Bound(绑定式)。这两种方式分别使用不同的方法来启动服务、绑定服务或停止服务。
- Started(启动式)方式:
启动后,服务可以在后台连续运行,即使负责启动服务的组件被销毁也是如此。
一旦启动,即使启动的组件被破坏,它也会在后台无限期运行。startService()
- 启动服务:通过调用
startService(Intent)
方法来启动服务。服务会调用onStartCommand(Intent, int, int)
方法。
Intent serviceIntent = new Intent(context, MyService.class);
context.startService(serviceIntent);
- 停止服务:通过调用
stopService(Intent)
或stopSelf()
方法来停止服务。服务会调用onDestroy()
方法。
context.stopService(serviceIntent);
// 或
stopSelf();
2.Bound(绑定式)方式:
可被视为客户端-服务器接口中的服务器。通过遵循此路径,Android 应用程序组件可以向服务发送请求并获取结果。
当另一个应用程序组件调用方法时,服务是 Bound 的。只要绑定了另一个应用程序组件,绑定服务就会运行。bindService()
- 绑定服务:通过调用
bindService(Intent, ServiceConnection, int)
方法来绑定服务。服务会调用onBind(Intent)
方法。
Intent serviceIntent = new Intent(context, MyService.class);
context.bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
- 解绑服务:通过调用
unbindService(ServiceConnection)
方法来解绑服务。服务会调用onUnbind(Intent)
方法。
context.unbindService(serviceConnection);
在使用服务时,可以根据应用的需求选择合适的方式来管理服务的生命周期。Started方式适用于需要在后台长时间运行的任务,而Bound方式适用于需要与服务进行交互或获取返回结果的情况。通常,Started方式更常用,因为它允许服务在后台独立运行,而Bound方式更适合需要与服务进行交互的场景。
(2)活动 Activity
Activity就是一个可视化的界面或者看成是控件的容器
活动是与用户交互的入口点。每个活动都包含布局,该布局具有用于与用户交互的用户界面。众所周知,每个活动都包含与之关联的布局,因此可以说活动类是网关,用户可以通过它以编程方式与 UI 进行交互。特定活动的布局是在 setContentView() 的帮助下设置的。 setContentView() 是一个将 View 作为参数的函数。view 参数基本上包含该活动的布局文件。
【1】Activity状态
活动状态、暂停状态、停止状态、非活动状态。
(1)活动状态Active:被OnCreate创建,在用户界面的上层,可视且可被交互
(2)暂停状态Pauser:当活动市区焦点,此时就会进入Pause状态。活动在此时被部分遮挡,不再处于用户界面的最上层,不可被交互,在系统内存不足时候终止。
(3)停止状态Stop:一个活动被另一个覆盖的时候进入Stop状态。不能被看懂,且全部遮挡,系统在内存需要的时候终止。
(4)非活动状态:不属于上述三种的状态的活动属于非活动状态。
当活动处于Pause和Stop状态下,系统可能会终止并回收。因此有必要在OnPause()和OnStop()方法下将一些运行状态持久保存,例如:用户输入。
【2】回调方法
在Android应用中,当用户尝试离开活动时,系统会使用回调方法来完全或部分销毁该活动,并在用户返回时恢复活动的状态。根据需求,我们可以选择性地使用回调方法来实现活动,而不必在每个应用中都使用所有的回调方法。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 创建View、绑定数据、恢复信息
}
@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 onRestart() {
super.onRestart();
// 当Activity从停止状态重新启动时调用
}
@Override
protected void onDestroy() {
super.onDestroy();
// 在Activity被销毁之前调用
}
Android Activity生命周期包括以下方法:
onCreate()
: 当Activity第一次创建时调用。用于创建View、绑定数据、恢复信息。onStart()
: 当Activity变为可见但未获得焦点时调用。onResume()
: 当Activity获得焦点并与用户交互时调用。处于栈顶,接受用户输入。onPause()
: 当Activity失去焦点但仍可见时调用。用于保存持久化数据或释放资源。
可终止onStop()
: 当Activity不再可见时调用。
可终止onRestart()
: 当Activity从停止状态重新启动时调用。onDestroy()
: 在Activity被销毁之前调用。
可终止
活动的状态保存和恢复时间的回调方法
在安卓开发中,你可以通过重写活动(Activity)的onSaveInstanceState
和onRestoreInstanceState
方法来保存和恢复活动的状态和时间。这两个方法可以帮助你在活动被销毁和重新创建时保存和恢复数据。以下是一个简单的示例:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// 在这里保存你需要的状态和时间数据到Bundle中
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// 在这里从Bundle中恢复之前保存的状态和时间数据
}
onSaveInstanceState
方法用于在活动即将被销毁时保存活动的状态数据,以便在活动重新创建时恢复这些数据。这个方法通常在活动即将进入后台或被销毁时调用,例如在旋转屏幕、按下返回键或系统内存不足时。
onRestoreInstanceState
方法用于在活动重新创建时恢复之前保存的状态数据。这个方法通常在活动重新创建时调用,例如在旋转屏幕后重新创建活动时。
【3】生命周期的分类
1.全生命周期
从建立到销毁的整个过程,始于OnCreate()
初始化所有的资源以及状态,终于OnDestroy()
释放所用到的资源。一般不会调OnDestroy()
函数,而直接结束进程。
2.可视生命周期
始于OnStart()
初始化或启动与更新界面相关的资源,结束于OnStop()
暂停或者停止一切和更新界面有关的线程、计时器、服务。
OnRestart()
在OnStart()
前被调用,用于在吧不可见变可视化的进程中,进行某项特定的处理。
OnStart()
和OnStop()
可以被多次调用,也经常用来注册BroadcastReceiver
3.活动生命周期
到了这点,为我们就真正的是和用户交互的阶段了。
始于OnResume()
终止与OnPause()
4.如图
除了红色是代表着函数层层递进的关系
黑、绿、蓝分别对应着属于他们的生命周期的范围
OnPause
和OnSaveInstanceState()
方法均用于用户的输入数据的保存。
前者一般保存持久化数据,并保存在设备的文件系统中或者数据库系统中。
后者动态的保存状态信息,一般在Bandle(多种格式数据的对象)
当系统调用OnRestartInstanceState()
和OnCreate()
同样的会利用Bandle将数据传递给方法。
(3)广播接收器 BroadcastReceiver
广播接收器是 Android 应用程序中的一个组件,用于接收系统或其他应用程序发送的广播事件。可以通过注册广播接收器来监听特定的广播消息,并在接收到消息时执行相应的操作。我们使用 Intent 将广播事件传送到其他应用。
3.4 Intent
Intent 是一个消息传递对象,用于从其他应用组件(如活动、服务、广播接收器和内容提供商)请求操作。
Intent 是 Android 中用于在不同组件之间传递消息和执行操作的对象。它可以用于启动活动、启动服务、发送广播等。Intent 可以携带数据和指示要执行的操作类型。
将用户发送到其他应用
从活动获取结果
允许其他应用启动您的活动记录
3.4.1 隐式 Implicit Intent
隐式意图是在 Android 中用于在不指定特定组件的情况下执行操作的 Intent。通过隐式意图,您可以请求系统中的其他应用程序执行特定操作,而无需指定要启动的确切组件。这使得应用程序可以与其他应用程序进行交互,从而实现更灵活的功能。
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.baidu.com/"));
startActivity(intent);
3.4.2 显式
Java、Kotlin代码里面跳转