上午手敲了个纯素大白板,比helloworld都简陋的,目的是了解Android的框架结构。虽然工程浏览器里那一坨东西看起来比较凌乱,但是仔细分析一下,发现这个框架还是比较简单的。
mfc是以窗体作为程序基本构建单元的。窗体是集成了显示、消息、数据封装等多种功能的基本模块。编写mfc程序,就好像搭积木一样,窗体就是单独的积木块,把零七八碎的窗体拼凑在一起,就组成了完整的程序。类似的,Android中的基本单元叫做Activity。开发Android程序,就是用Activity来搭积木。在mfc中,设置窗体属性有两种方式,一是使用工具箱进行静态配置,二是在程序中调用api进行动态配置。其中工具箱是可视化的设置界面,所有参数设置都保存到文本配置文件中,也可以直接修改该文本文件来设置窗体。Android也是采用类似的机制,Activity的配置参数可以写到xml文本文件中,也可以在程序中调用api设置参数。虽然Android开发环境带有图形化的工具箱,但是功能不如mfc的工具箱完备易用,按照Android开发的习惯,一般还是采用文本方式编辑xml配置文件。
上图是用Android Studio创建的空白Android工程。要做一个最简纯素大白板,也就是仅仅能够完成启动功能的Android程序,需要哪些工作呢?首先要创建一个Activity,程序至少得有一个启动时能够显示出来的Activity。这个Activity的名字可以是任意的,在我的程序中,这个Activity叫做MainActivity,在上图中可以找到它。这是在一个java代码文件中定义的,代码如下:
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
代码中重写了onCreate方法,使用setContentView方法加载res/layout/main.xml中的参数对自身进行初始化设置。这个xml文件的名字也可以是任意的。
res文件夹是用来梳理Android工程中用到的资源数据的,例如图片、字符串、字体、窗体参数。MainActivity引用的R.layout.main包含一组窗体布局设置参数,内容如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity" android:id="@+id/root" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> </LinearLayout>
完成以上工作之后,程序还是暂时无法启动,因为没有将MainActivity设置为默认Activity。在manifests/AndroidManifest.xml中添加默认Activity的设置,文件内容如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.hanv.dspsir.mixview"> <application android:allowBackup="true" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:theme="@style/AppTheme"> <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> </application> </manifest>
此时一个纯素大白板就完工了,我们可以在Android模拟器中查看程序运行效果:
推荐使用基于开源Android模拟器的国内修改版进行调试模拟,比Android SDK带的模拟器快多了。一个Android程序,不论多么复杂,归根结底就是在这么个机制上添枝加叶而来的。补充一点:引号内以点号开头的字符串,表示当前包,省略一长串包名,例如".MainActivity"。