今天开始我们一起分析第一节创建的程序是怎么运行起来的,还会讲 Java 的 for 循环。有人想学头皮护理???那也满足你们。不知道之前讲的项目结构有没有记得住,或者是直接看蒙了?不过记不记得住都没关系,这并不影响你接下来的学习。随着学习的深入,你反复地和我一起用,自然就记住了。
1x0 从 AndroidManifest.xml 入手
我们已经知道了项目的结构,那么下一步就按照应用程序运行的流程来分析吧。你在手机上点击 apk 文件后,会打开软件包安装程序。软件包安装程序会读取 apk 中的 AndroidManifest.xml 文件,从里面分析出软件的名字版本还有各种权限,然后展示给用户,用户确定安装后就会交给框架程序来真正完成安装。那我们就从 AndroidManifest.xml 开始分析吧。打开上次的项目,找到 AndroidManifest.xml 。下面两个动图分别演示 Android Studio 和 AIDE 的打开过程。注:Android studio 请切换到 project 视图。具体操作见第四节。
我们可以从 AndroidManifest.xml 里看到这些代码:
由于创建项目时每个人输入的项目名字以及主活动的名字可能不同,这里的代码可能会与你看到的有轻微差异,这时就需要触类旁通一下了。
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
这些代码注册了一个活动:MainActivity。所有的活动必须在 AndroidManfest 中注册。还记得之前讲的活动吗?所有 Android 应用程序中你能看到的东西都是放在活动中的。你运行程序之后看到的 helloworld 就是在这个活动中。其中 intent-filter 标签中的 <action android:name="android.intent.action.MAIN" /> 和 <category android:name="android.intent.category.LAUNCHER" /> 告诉系统这个是主活动。在桌面点击图标,就会启动带有这两个标签的活动。说来说去,好像 helloworld 这几个字是 MainActivity 来显示在界面上的。我们快去看看。
1x1 初探活动
我们打开项目目录下的 "appsrcmainjavacomgithubmyapplicationMainActivity.java" 。其中 "comgithubmyapplication" 是你新建项目时输入的包名。下面两个动图分别演示 Android Studio 和 AIDE 的打开过程。注:Android studio 请切换到 project 视图。具体操作见第四节。
映入眼帘的是这些代码。注:由于新建项目时大家输入的主活动名称可能不同,编译器版本可能不同,导致代码可能有轻微差异,大家请触类旁通。
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
首先可以看到....嗯...根本看不懂,因为我还没讲 Java 的类的概念。但是我还是要说一说。我就那么一说,你就那么一听,很快我们就会讲 Java 的类和对象,到时候会那他当例子来讲解,所以莫慌,我在的。咳咳,开始白话了:MainActivity 类是继承(extends)自 Activity 父类的。你如果用的是 Android Studio 生成的项目的话,看到的应该是
public class MainActivity extends AppCompatActivity
其中 AppCompatActivity 是一种新的用来替换 " Activity " 的类,具有 " Activity " 的所有特性,而且为 MD 质感设计提供 API支持。Activity 是所有活动的基类,上面说的 AppCompatActivity 也是他的子类。你可以这么理解,Activity 是爸爸名字叫活动,只有他的孩子继承(extend)了他,才是活动,才具有了活动的特性。然后向下接着看,有一个 onCreate() 方法。几乎所有的活动都会重写 onCreate() 方法,系统在创建活动(Activity)时会调用 onCreate() 方法。其中只有两行代码,并没有我们要找的 helloworld 字样,那么他到底在哪呀?其实 Android 的开发是逻辑和视图分离的,视图是被写在布局里的。在 onCreat() 方法里调用了 setContextView() 方法,就是给当前活动引入一个 main 布局,那么 helloword 就一定是在里面了。
注意:上一段中的 “基类”,“子类” ,“继承”,“重写方法”,“方法” 等都是 Java 面向对象中的术语,关于 Java 的面向对象,近几期就会讲解,
1x2 初探布局
打开项目目录下的 "appsrcmainreslayoutmain.xml" 文件,其中 "main" 是你新建项目最后一步输入的,估计你已经忘了当时选的是什么了。但这个目录下现在应该只有一个文件,就是他了。Android Studio 默认是 activity_main ,至于 AIDE ,不支持在创建时自定义,默认就是 main.xml 。布局文件都是放在 res/layout 目录下的,layout 文件夹下的文件就都是布局。下面两个动图分别演示 Android Studio 和 AIDE 的打开过程。注意:Android Studio 打开布局之后默认是设计 (design) 模式,因为我们是初学者,应该了解本质,所以请点击左下角的Text 标签切换到代码视图。
映入眼帘的是如下代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
>
<TextView
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
看不懂?没关系,以后会重点讲的,反正我们看到 hello word 了。让我们来改一下,就改成 "我学会Android 编程了!" 吧。
修改后的代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
>
<TextView
android:text="我学会Android 编程了!"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
下面两个动图分别演示 Android Studio 和 AIDE 的修改过程。为了录制效果,这里都是粘贴的,大家不要意外为什么字突然变了。
我们小小的分析下,我们在一个 TextView 里找到了 helloword 字样。其实就是通过 android:text="Hello World" 来定义的。
今天 Android 部分就这样吧,我们再来学一些 Java 基础。
2x0 Java 中的 for 循环
不知道你们有没有忘掉 while 循环,忘了的话快去第五讲复习一下!今天讲的 for 循环更加简洁,大部分情况下,for 循环可以替代 while 循环,do while 循环。for 循环的基本语法如下:
for ([循环初始化语句];[循环条件];[迭代语句]){
循环体
}
//[]内的为可省略
程序执行 for 循环时,先执行循环初始化语句,初始化语句只在循环开始前执行一次。每次执行循环体之前,先计算循环条件的状态,如果是 true 则执行循环体,循环体执行之后执行迭代语句,用于更新循环条件,因此对于 for 循环而言,循环条件总比循环体多执行一次,因为最后一次执行循环条件的状态是 false ,将不再执行循环体。来看下面的例子:
//循环的初始化语句,循环条件,迭代语句
for (int i = 0; i < 10; i++){
System.out.println(i);
}
System.out.println("循环结束!");
在上面的循环语句中,for 循环的初始化语句只有一个,循环条件也是一个简单的 boolean 表达式。运行流程就是:
- 定义整型变量 a 并赋值为 0
- i 小于 10 成立
- 输出 i 的值
- i++
- i 小于 10 成立
- 输出 i 的值
- i++i 小于 10 成立
- 输出 i 的值
- i++
- 。。。。。。
- i 小于 10 不成立
- 输出 循环结束
值得一提的是,循环的初始化语句,循环条件,迭代语句都可以省略:下面的语句语法绝对是对的,但是是个死循环
for (;;){
System.out.println("这是个死循环");
}
下面的语句也可以运行,但是及其不推荐修改循环计数器(也就是循环变量,就是上面定义的 int a = 0;),这样会导致程序可读性下降。
int i = 0;
for (; i < 10;){
i++;
System.out.println(i);
}
System.out.println("循环结束!");
//非常不推荐在循环中修改循环计数器。
3x0 头皮护理 & 总结
ps:收集自互联网。
- 洗发之后一定要上护发素,并且不要选择洗护二合一的洗发水。护发素不要涂膜在头皮上。
- 上护发素或者发膜的时候,注意先用毛巾擦干头发上的水分。
- 尽量自然风干头发,避免使用电吹风。
- 不要熬夜,早睡、睡充分。
你们吵着要头皮护理的,这就来了。其实之前我也不信邪,但是,自从我开始写教程,我真的开始掉头发了。
今天我们粗略分析了app的 AndroidManifest.xml 还有活动,布局。你一定累坏了,但是收获满满,不是吗?
欢迎关注我的公众号,
每日一文,轻轻松松带你入门 Android 开发
2020/5/24 注:
这是我 2018 年高中毕业的假期写的,当时并没有自己搭建博客,近期我给这一系列的文章都放到我自己的博客上。
当时写这个系列文章的想法就是扎实下基础,然后能帮到更多的人就更好了,但是大学开学之后就开始了新生活,没有大块的时间去编撰,系列文章也没有再更新过。但是我其实并不想放弃这个系列,那就,有缘再见吧,拜拜ヾ(•ω•`)o