这是我参与「第四届青训营 」笔记创作活动的的第3天
上篇:Android 简介 Android 简介 - www.wolai.com/cyansu/mSnu…
本篇:Android Activity - www.wolai.com/cyansu/i1DV…
Activity
在 Android 平台上,Activity 是应用的基本构建块之一。它们充当用户与应用互动的入口点,同时也决定了用户在应用内部或应用之间导航的方式,前者如返回按钮,后者如“最近使用的应用”按钮。
Activity类是 Android 应用的关键组件。在编程范式中,应用是通过 main() 方法启动的,而 Android 系统与此不同,它会调用与其生命周期特定阶段相对应的特定回调方法来启动 Activity 实例中的代码。
Activity 提供窗口供应用在其中绘制界面。此窗口通常会填满屏幕,但也可能比屏幕小,并浮动在其他窗口上面。通常,一个 Activity 实现应用中的一个屏幕。大多数应用包含多个屏幕,这意味着它们包含多个 Activity。通常,应用中的一个 Activity 会被指定为主 Activity,这是用户启动应用时出现的第一个屏幕。然后,每个 Activity 可以启动另一个 Activity,以执行不同的操作。
生命周期
Activity 类中定义了七个回调方法,覆盖 Activity 整个生命周期:
onCreat():在Activity第一次被创建的时候调用;onStart():在Activity由不可见变可见时调用;onResume():在Activity与用户交互时调用,此时的Activity一定位于栈顶;onPause():在Activity被暂停,调用另一个程序或Activity时被调用;onStop():在Activity完全不可见时调用;onDestroy():在Activity被销毁前调用,调用后Activity变为销毁状态;onRestart():在Activity由停止状态变为运行状态前被调用,调用后Activity重新启动。
正如把大象塞进冰箱需要三步,一个
Activity的创建也分为三步。
注册
所有的 Activity 都需要在 AndroidManifest.xml (清单文件)中进行注册才能生效。
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.test">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Test"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
我们在 application 标签内使用 activity 标签对 Activity 进行注册。
具体参考: Android 开发者 | Android Developers (google.cn)
-
<activity>:-
android:name:指定具体注册的Activity,.MainActivity是com.example.activitytest.FirstActivity的缩写; -
android:exported:此元素设置Activity是否可由其他应用的组件启动:- 如果设为“
true”,那么Activity可由任何应用访问,并且可通过其确切类名称启动。 - 如果设为“
false”,则Activity只能由同一应用的组件、使用同一用户 ID 的不同应用或具有特权的系统组件启动。 没有intent过滤器时,这是默认值。
- 如果设为“
-
</intent-filter>:<action android:name="string" />:向Intent过滤器添加操作。如果Intent过滤器中没有<action>元素,则过滤器不接受任何Intent对象。<category android:name="string" />:向 Intent 过滤器添加类别名称。
注:此声明用于设置主启动
Activity:
-
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
布局
Android程序的设计讲究逻辑和视图分离。布局是用来显示界面内容的,布局文件采用 xml 进行编写。
res/layout/activity_main.xml :
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
</androidx.constraintlayout.widget.ConstraintLayout>
绑定
在Activity 中调用 setContentView() 方法来给当前的 Activity 加载一个布局,在 setContentView() 方法中,我们一般会传入一个布局文件的 id 。项目中添加的任何资源都会在 R 文件中生成一个相应的资源 id ,因此我们刚才创建的 activity_main.xml布局的 id 现在已经添加到 R 文件中了。只需要调用 R.layout.activity_main 就可以得到布局的 id,然后将这个值传入 setContentView() 方法即可。
java/com/example/test/MainActivity.kt :
package com.example.test
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
引用: