1、Activity的生命周期
onCreate():
- Activity被创建时调用,用于初始化Activity的基本状态。
- 在此方法中通常会进行布局的加载、变量的初始化等操作。
onStart():
- 当Activity即将变为可见时调用。
- 在此方法中通常会准备开始用户交互。
onResume():
- 当Activity开始与用户交互时调用。
- 在此方法中通常会启动动画、注册广播接收器等。
onPause():
- 当Activity失去焦点、但仍然可见时调用,即处于部分可见状态。
- 在此方法中通常会停止动画、保存数据等。
onStop():
- 当Activity完全不可见时调用。
- 在此方法中通常会释放资源、取消注册广播接收器等。
onDestroy():
- 当Activity即将被销毁时调用。
- 在此方法中通常会释放Activity所持有的资源。
onRestart():
- 当Activity由停止状态变为运行状态时调用。
- 在此方法中可以进行重新初始化的操作。
2、Android布局
LinearLayout(线性布局):
这是一种简单的布局,其中的子视图按照垂直或水平方向排列。通过设置orientation
属性为vertical
或horizontal
来决定其排列方式。LinearLayout很适合创建简单的列表或者当你需要将元素线性地堆叠起来时。RelativeLayout(相对布局):
在相对布局中,子视图的位置是相对于布局或者其它子视图的。这种布局提供了更大的灵活性,允许创建基于相对位置(如位于某个视图之上、下或并排等)的复杂布局。FrameLayout(帧布局):
帧布局是一种简单的布局,用于存放单个子视图。它通常用于包裹一个单独的子视图,特别是当需要在运行时替换界面元素时。子视图会堆叠在一起,通常你只会想要显示一个视图。ConstraintLayout(约束布局):
约束布局是一种较新的布局,通过使用约束来定义子视图之间的关系,允许创建大型且复杂的布局,同时保持层次结构的扁平化。这种布局非常灵活,是建立复杂界面的首选。TableLayout(表格布局):
表格布局用于以行和列的形式组织界面,类似于HTML中的表格。它适用于需要将视图组织成行和列的场景。GridLayout(网格布局):
网格布局是一种将子视图放置在一个可配置的网格中的布局。它允许创建复杂的布局,可以指定每个元素占据的行数和列数。CoordinatorLayout(协调布局):
这是一个超级强大的布局,用于创建涉及多个元素协同动作的复杂界面(如滑动消失的工具栏)。它主要用于Material Design中的应用程序。NavigationView(导航视图):
用于创建导航抽屉(Navigation Drawer),允许用户通过滑动从屏幕边缘拉出一个包含导航选项的菜单。
3、Activity启动模式
不同的Activity可以设置不同的启动模式,建议去看B站up主的视频讲解,以下的图片也截图自视频链接,有图片方便理解:39-Activity 启动模式_哔哩哔哩_bilibili
standard(标准模式):
这是默认的启动模式,每次启动Activity都会创建一个新的实例,并放置在任务栈的顶部。如果Activity已经存在,就会创建一个新的实例并放在任务栈的顶部。
适合场景:适用于大多数情况,特别是当Activity不需要与其他实例共享数据时。
singleTop(单顶模式):
如果要启动的Activity已经位于任务栈的顶部(即是当前显示的Activity),则不会创建新的实例,而是调用已经存在的实例的
onNewIntent()
方法。适合场景:适用于在任务栈中的某个Activity被多次启动时,保持单一实例的情况,比如用于处理通知或事件的Activity。
singleTask(单任务模式):
系统首先会检查任务栈中是否存在该Activity的实例,如果存在,则将该实例之上的所有Activity实例出栈,使得该Activity成为任务栈的顶部。如果不存在,则创建一个新的实例并放在任务栈的顶部。
适合场景:适用于需要确保在整个应用中只有一个实例存在的Activity,比如应用的主界面或者登录界面
singleInstance(单实例模式):
这是一种特殊的启动模式,会将Activity放置在一个新的任务栈中,并且该任务栈中只有这一个Activity实例。即使从其他应用启动该Activity,也会在一个新的任务栈中创建实例。
适合场景:适用于需要完全隔离的独立界面,比如应用的设置界面或者特定功能的界面。
4、显式Intent和隐式Intent
1、显式Intent:
显式 Intent 是一种在 Android 应用程序组件之间进行通信的方式,其中你明确指定了目标组件的类名。与隐式 Intent 不同,显式 Intent 直接指定了要启动的目标组件的类名,而不是根据 Intent 的内容动态确定目标组件。
可以用于启动特定的 Activity:你可以通过指定目标 Activity 的类名来直接启动该 Activity,而不需要系统根据 Intent 的内容来选择目标 Activity。也可以用于启动应用内的组件:你可以通过指定目标组件的类名来启动应用内的其他组件,比如 Service、BroadcastReceiver 等。以下是代码示例,启动一个service:
// 创建一个显式 Intent,指定要启动的 Service 的类名
Intent intent = new Intent(this, MyService.class);
// 启动 Service
startService(intent);
2、隐式 Intent:
隐式 Intent 是一种用于在 Android 应用程序组件之间进行通信的方式,其中目标组件由系统根据 Intent 的内容动态确定,而不是显式指定目标组件的类名。
在隐式 Intent 中,你不会直接指定要启动的目标组件的类名,而是通过指定 Intent 的动作(Action)和数据(Data)来描述你想要执行的操作以及操作所涉及的数据。然后系统会根据这些信息,匹配符合条件的组件来响应这个 Intent。
可以用于启动 Activity:例如,你想要启动一个用于查看网页的浏览器 Activity,但你不需要知道具体的浏览器 Activity 类名,只需要指定 Intent 的动作为 VIEW,并指定数据为网页的 URI。发送广播:你可以发送一个广播,系统会将这个广播发送给所有注册了匹配 Intent 过滤条件的广播接收器。启动服务:你可以启动一个服务来执行某项操作,系统会根据 Intent 的动作和数据来选择合适的服务组件来执行操作。
你想要启动一个用于查看网页的浏览器 Activity,但你不需要知道具体的浏览器 Activity 类名,只需要指定 Intent 的动作为 VIEW,并指定数据为网页的 URI的代码示例如下:
// 创建一个Intent对象,指定动作为VIEW,数据为网页的URI
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
// 检查是否有可以处理这个Intent的Activity
if (intent.resolveActivity(getPackageManager()) != null) {
// 找到了匹配的Activity,启动该Activity
startActivity(intent);
} else {
// 没有找到匹配的Activity,显示错误消息或者采取其他处理方式
Toast.makeText(this, "没有找到可用的浏览器应用", Toast.LENGTH_SHORT).show();
}
5、Fragment
1、静态注册
静态注册是指在 XML 布局文件中直接声明 Fragment,通过
<fragment>
标签将 Fragment 嵌入到 Activity 的布局中。在静态注册中,Fragment 的生命周期由 Activity 管理,系统会在 Activity 创建时自动创建并添加 Fragment,而无需手动操作。静态注册通常用于那些在整个应用生命周期内保持不变的静态界面元素,比如底部导航栏、固定的菜单等。代码示例如下:
<fragment
android:id="@+id/fragment_container"
android:name="com.example.MyFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
2、动态注册
动态注册是指在 Activity 的代码中通过 FragmentTransaction 动态添加、替换或移除 Fragment。在动态注册中,你可以在运行时根据需要添加、替换或移除 Fragment,灵活性更高,可以实现更复杂的界面交互和逻辑。动态注册通常用于那些需要根据用户操作或其他条件动态改变的界面元素,比如根据用户登录状态显示不同的页面等。以下是部分代码:
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(R.id.fragment_container, new MyFragment());
transaction.commit();