Activity系列--初识Activity

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就在这个循环内运行起来了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容