一、什么是活动
活动( Activity)是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用户进行交互。
一个应用程序中可以包含零个或多个活动,但不包含任何活动的应用程序很少见。
活动也是Android四大组件之一。
二、手动创建一个活动
这样一个活动就创建完成了。
package com.example.activityteset;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
要知道,项目中的任何活动都应该重写Activity 的onCreate()方法, 而目前我们的FirstActivity中已经重写了这个方法,这是由Android Studio自动帮我们完成的。
三、创建和加载布局
Android 程序的设计讲究逻辑和视图分离,最好每一个活动都能对应一个布局,布局就是用来显示界面内容的,现在就来手动创建一个布局文件。
创建成功后如下:
code模式下,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
在code模式下为布局添加一个button元素,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button_1"
android:text="Button 1"/>
</LinearLayout>
这里添加了一个Button元素,并在Button元素的内部增加了几个属性。
android:id是给当前的元素定义一个唯一标识符,之后可以在代码中对这个元素进行操作。
你可能会对@+id/button_1这种语法感到陌生,但如果把加号去掉,变成@id/button_1,这样你就会觉得有些熟悉了吧,这不就是在XML中引用资源的语法吗?只不过是把string替换成了id。是的,如果你需要在XML中引用一个id,就使用@id/id_ name 这种语法,而如果你需要在XML中定义一个id,则要使用@+id/id_name 这种语法。
android:layout width 指定了当前元素的宽度,这里使用match_ parent 表示让当前元素和父元素一样宽。android: layout_ height 指定了当前元素的高度,这里使用wrap_content表示当前元素的高度只要能刚好包含里面的内容就行。
android:text 指定了元素中显示的文字内容。
在Design模式下,观察效果如下:
在活动中加载布局:
可以看到,这里调用了setContentView() 方法来给当前的活动加载一个布局,而在setContentView()方法中,我们一般都会传人一个布局文件的id。
项目中添加的任何资源都会在R文件中生成一个相应的资源id,因此我们刚才创建的first_layout.xml布局的id现在应该是已经添加到R文件中了。
在代码中去引用布局文件的方法,只需要调用R. layout. first_ layout 就可以得到first_layout.xml布局的id,然后将这个值传人setContentView( )方法即可。
四、在AndroidManifest文件中注册
所有的活动都要在AndroidManifest.xml中进行注册才能生效,而实际上FirstActivity 已经在AndroidManifest.xml 中注册过了,打开app/src/main/ AndroidManifest.xml,代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activityteset">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ActivityTeset">
<activity
android:name=".FirstActivity"
android:exported="true" />
</application>
</manifest>
可以看到,活动的注册声明要放在标签内,这里是通过标签来对活动进行注册的。
Android Studio帮我们自动完成了对FirstActivity 的注册。
之前在使用Eclipse创建活动或其他系统组件时,很多人都会忘记要去AndroidManifest.xml中注册一下,从而导致程序运行崩溃,AndroidStudio在这方面做得更加人性化。
在标签中我们使用了android:name 来指定具体注册哪一个活动, 那么这里填入的. FirstActivity其实这不过就是com. example. activitytest. FirstActivity的缩写而已。由于在最外层的标签中已经通过package 属性指定了程序的包名是com. example. activitytest,因此在注册活动时这一部分就可以省略了 ,直接使用. FirstActivity就足够了。
不过,仅仅是这样注册了活动,我们的程序仍然是不能运行的,因为还没有为程序配置主活动,也就是说,当程序运行起来的时候,不知道要首先启动哪个活动。配置主活动的方法其实在就是在标签的内部加入标签,并在这个标签里添加和这两句声明即可。
除此之外,我们还可以使用android:label指定活动中标题栏的内容,标题栏是显示在活动最顶部的,待会儿运行的时候就会看到。需要注意的是,给主活动指定的label 不仅会成为标题栏中的内容,还会成为启动器( Launcher )中应用程序显示的名称。
修改后的AndroidManifest.xml文件,代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activityteset">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ActivityTeset">
<activity
android:name=".FirstActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
这样的话,FirstActivity 就成为我们这个程序的主活动了,即点击桌面应用程序图标时首先打开的就是这个活动。
另外需要注意,应用程序中没有声明任何一个活动作为主活动,这个程序仍然是可以正常安装的,只是无法在启动器中看到或者打开这个程序。这种程序一般都是作为第三方服务供其他应用在内部进行调用的,如支付宝快捷支付服务。
运行程序,效果如下: