查看原文
其他

Activity系列--初识Activity

牛晓伟 牛晓伟
2024-08-24

android四大组件

在介绍Activity之前,先唠叨唠叨android的四大组件,android的四大组件分别是Activity,Broadcast,Service,ContentProvider。

为什么它们是组件,而像其他的比如Fragment,View等为啥不是组件,我的理解是在AndroidManifest.xml(清单文件)中声明或者叫配置的才被称为组件,它们四个是需要在清单文件中配置的。

每个组件的作用是不同的,Activity可以理解为是一个与用户进行交互的界面,Service是一个没有界面在后台默默运行的服务,Broadcast广播接收器,ContentProvider它的字面意思已经很明了了它是一个内容提供者。后面还会详细介绍它们,现在我们主要来探讨Activity。

Activity为何物

Activity是使用频率最高的组件,如果把它理解为一个界面,我觉得不够恰当,因为真正的各种View不是它实现的(android中各种view实现主要是view族来实现的)。可以把它理解为一个包含了各种view的特殊的窗口,并且这个特殊窗口是有状态一说的(也就是Activity的生命周期),这个特殊窗口包含的各种view是可以和用户进行交互的。

一个应用一般会包含多个Activity(也有不包含Activity的应用),一般会有一个主Activity作为启动器(在桌面上点击应用图标启动的Activity)。应用内的Activity之间是可以跳转的(比如微信首页Activity可以跳转到朋友圈Activity)。应用之间的Activity也是可以跳转的(当然需要应用把自己的Activity设置为允许调起),比如电子邮件应用在编写邮件的Activity中跳转到图库应用的Activity中去选取图片。

Activity的使用

Activity的使用主要分为下面几步。

1. 继承Activity类
public MainActivity extends Activity{

}
2. 重写它的onCreate方法
public MainActivity extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //必须调用父类的onCreate方法
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

onCreate方法是Activity的其中一个生命周期方法,在后面会有介绍。在onCreate方法里面必须调用父类的onCreate方法

setContentView方法的作用是设置ContentView,这样这个Activity就有内容了,R.layout.activity_main:android中所有的资源(比如layout文件,drawable文件等)都会在R类下面生成对应的正整数值,这样通过这个正整数值去定位一个资源。

3. 编写layout文件

在activity_main.xml文件里面配置view(布局文件都放在layout目录下面)

<?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">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

android中的view先来简单介绍android中的view view分为两种:

  1. 包含内容的view 如ImageView显示图片,TextView用来显示文本
  2. 布局view 布局view都是ViewGroup的子类,因此又被称为ViewGroup,它不包含内容,它会包含很多的view(view既可以是包含内容的view又可以是ViewGroup)

view不是咱们这节的主要内容,先简单介绍到此。

activity_main.xml可以看到上面的activity_main.xml是一个xml格式的文件,它里面配置了一个ConstraintLayout(它是ViewGroup的子类是一个布局view), 还配置了一个TextView(用来显示 hello world 文本内容)

android中可以使用布局文件来写view(如activity_main.xml),也可以使用代码的方式来写view(如TextView tv= new TextView()),但是强烈建议在布局文件中来写view,因为布局文件中有预览效果等丰富的工具来帮助查看排查所写view的效果。而通过代码写的view则非常难以看到实时效果并难以排查问题。

命名空间

命名空间解决什么问题?在布局文件中view的很多属性需要配置(比如width,height),命名空间就是为了解决怎么样来使用这些属性对view进行配置的,可以理解为命名空间内包含了很多的属性。

声明命名空间格式如下:xmlns:namespace_name="link"

xmlns:是xml namespace的缩写 namespace_name:就是一个名字可以理解为它是后面link的别名 link:就是一个http链接的格式,可以理解它为指向一个命名空间

命名空间主要分为3类:

  1. 存放android通用view属性的命名空间(比如view的width,height等) 格式:xmlns:android="http://schemas.android.com/apk/res/android"
    其中后面的http://schemas.android.com/apk/res/android这个不需要关心, xmlns:android中的android可以随便定义名字,但是不建议这样做,一般都叫android

  2. 存放自定义view属性的命名空间 比如在开发中免不了需要自定义view,自定义view的时候需要为view定义一些特有属性,android系统会把这些特有属性自动放入该命名空间下 格式:xmlns:app="http://schemas.android.com/apk/res-auto" 同样后面的link部分不需要关心 xmlns:app 一般都使用app这个名字

  3. 主要用来进行测试与工具为目的的命名空间 格式:xmlns:tools="http://schemas.android.com/tools" xmlns:tools 一般都使用tools这个名字 为什么要有它呢,比如在为TextView配置文本的时候需要看下它的效果,会直接使用android:text="测试测试测试" 这样来看效果,有可能忘记把这个信息忘记删掉了,真正页面显示出这个效果是不是很尴尬。如果使用tools:text="测试测试测试" 这个的话,这种文本不会显示在真正的页面上,只是在布局文件预览效果下才会出现,减少了出错的概率。

为view配置属性格式:namespace_name:属性

如下分别给view组件配置了它的宽和高这俩属性值 android:layout_width=100dp android:layout_height=100dp

关于为view配置属性会在后面详细介绍。

4. 在AndroidManifest(清单文件)中配置Activity
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.helloworld">

    <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.HelloWorld">
        <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>

如上代码就是在AndroidManifest.xml文件中配置刚刚写的MainActivity

编写的Activity要在AndroidManifest进行配置,否则就不会起作用。AndroidManifest文件会被打包到最终的apk(一个android app是一个apk格式的文件),这个apk被安装到手机上后,系统的服务PackageManagerService会读取apk中的AndroidManifest文件,会把配置的Activity信息解析出来,如果不配置,那系统完全就不知道Activity的存在。

intent-filter翻译过来叫作:意图过滤器,它的主要作用是为当前配置的Activity 配置一种启动它的方式。关于它及Intent(意图)的详细介绍在后面。

下面的意图过滤器代表当前Activity作为启动器(启动器:就是在桌面上点击app图标时候启动的Activity)

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

到此一个Activity就创建完毕,并且启动后在手机屏幕上会显示一个带有hello world 文案的界面。

总结

这一节主要是带大家初识Activity,大家是不是有这样一种感觉:Activity的使用确实很简单。

在使用Activity的时候,开发者只需要在继承Activity,在Activity的onCreate方法中实现自己的细节,关于onCreate方法什么时候调用这都不需要开发者关心(只需要关心自己的业务逻辑即可),onCreate方法肯定会被调用的开发者就放心吧,这或许就是框架(framework)的魅力所在,让使用者只需要关心自己的事情即可,剩下的就按框架制定的规则来实现。

android设计者为了让开发的成本最低化搭建了一套框架,框架犹如建房子,房子的整体架子都已经建好了,房子里面的具体细节就由各家自己实现了(比如有的想把墙刷为白色,有的想刷为其他颜色)。android框架也如此,android设计者设计实现了自己的框架,并且设计出了Activity等四大组件(每个组件有自己的作用),作为开发者就可以在这套框架以及框架的规则下面实现自己的功能了。

框架把便利留给了别人,自己却要承受很多苦楚。android的框架做了非常非常多的工作的,它对使用者来说是透明的,比如把main函数给隐藏了(在开发c/c++/Java的时候是需要main函数作为入口点来实现自己的功能),在main函数中实现了一套特殊的死循环,这样一个app就在这个循环内运行起来了。


继续滑动看下一个
牛晓伟
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存