Skip to content

Latest commit

 

History

History
164 lines (131 loc) · 8.43 KB

3.2.md

File metadata and controls

164 lines (131 loc) · 8.43 KB

HelloActivity分析

Android Studio目录结构

我们重新进入Android Studio,就会自动进入之前的工程:HelloActivity。如果不想自动打开上一次的工程,可以点击File下的Settings,然后选择Appearance & Behavior下面的System Settings,然后把Reopen last project on startup勾选掉。


我们看一下右侧的项目目录,可以看到除了gradle的配置文件外,有一个app的目录。这个app目录叫一个module,一个项目可以包含多个module,我们现在目前是一个。(本教程不会涉及到多module的使用,读者可以自行百度。)


下面展开app目录,这里一共有三个文件夹,manifests、java、res,分别代表着配置文件、源码、资源文件。


下面,开始分别讲解每个文件夹的作用和功能。

程序的入口:AndroidManifest.xml分析

首先,我们打开manifests文件夹,这里只有一个AndroidManifest.xml。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.kalen.helloactivity" >

    <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/AppTheme" >
        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

我们可以看到最外层是一个manifest标签,里面显示了包名是“com.example.kalen.helloactivity”。在manifest标签里面是一个application标签,也就是我们的Android应用,这里有一些属性,如icon、label,都是设置应用配置的。形如@xxx/xxx的都是从res文件夹下面读取的。比如说,我们要改应用的名称,可以打开res下的values文件夹的strings.xml,然后修改app_name的名字。


再运行应用安装到模拟器的时候,可以看到安装的app的名字就改变了。


当然,也可以通过替换mipmap下的ic_launcher和ic_launcher_round来修改图标,不过和修改字符串不同,我们可以直接在电脑上打开HelloActivity\app\src\main\res目录,可以看到有很多个以mipmap开头的目录,后面的代表不同的尺寸。我们需要设计多个尺寸的图标以适配不同像素的手机。


另外,我们也可以改变应用的主题(style/AppTheme),打开res下面的values里的styles.xml。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

可以看到这里设置了三种颜色。我们可以修改colors.xml的colorPrimary、colorPrimaryDark、colorAccent改变这几种颜色。比如我们可以把colorPrimary设置为#000000(黑色)。


再运行app,app顶部的一栏就变成了黑色。


看完了application标签的几个属性,我们来看看它的子标签:activity。这里首先有一个name是“.MainActivity”,这是一个相对的路径(相对于manifest标签下的package:“com.example.kalen.helloactivity”)。这个activity标签指向的是:com.example.kalen.helloactivity.MainActivity


另外,在activity下面有一个intent-filter标签。intent-filter里面有一个action和category,name属性一个是“android.intent.action.MAIN”还有一个是“android.intent.category.LAUNCHER”,通过名字可以看出,这个其实就是标示启动哪个activity的,这样的标签一个应用只能有一个,MainActivity就是我们程序的入口。

MainActivity.java分析

下面看看代码,打开MainActivity.java文件。发现MainActivity.java内只有一个方法:onCreate。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

在onCreate方法里面,除了调用父类的方法,也只有一行代码,setContentView,翻译过来就是设置内容视图,也就是显示什么内容。

那么R.layout.activity_main是什么?可以看到并没有import任何R文件。我们下面摁住ctrl键,鼠标滑动到layout上面。


可以看到这里显示出了一个0x7f04001b,看起来像一个地址一样。下面,我们再次摁住ctrl键,然后点击activity_main,看看这个是什么东西。可以看到我们跳转到了res下的layout的activity_main.xml里面。


现在应该明白了,这个R文件其实就是和res的一个对应,把res的每个变量都生成一个地址。比如我们输入R.color可以看到colors.xml的三种颜色。


再来看看activity_main.xml,我们可以看到最外面有一个android.support.constraint.ConstraintLayout,是一种布局格式。里面有一个TextView,里面的text属性写着“Hello World”,和app上面的Hello World相对应。


第二个Activity

了解了Activity的布局,下面我们创建第二个Activity,并尝试以第二个Activity作为启动项。

右击com.example.kalen.helloactivity,选择创建一个Java Class。


类的名字设置为SecondActivity,点击回车之后,就会生成一个空的类,下面让它继承AppCompatActivity,并重写onCreate方法。

package com.example.kalen.helloactivity;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

接着我们在layout目录下创建一个Layout XML。


命名为activity_second,然后点击Finish。


这里选择创建的布局是LinearLayout,下一章会讲解。先复制下面代码,在LinearLayout里面添加一个TextView用来显示一段文字。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第二个Activity" />

</LinearLayout>

接着,就可以在onCreate方法中添加setContentView(R.layout.activity_second);了。

最后,我们在AndroidManifest.xml里面注册SecondActivity,并把MainActivity的intent-filter添加到SecondActivity下面。

    <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/AppTheme" >
        <activity android:name=".MainActivity" > </activity>
        <activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

这时候,运行程序,就可以显示SecondActivity的内容了。


链接