[入门指导]简述Android 应用程序开发方法

简述Android 应用程序开发方法

随着Android系统的普及,越来越多的学生,工程师开始步入了Android开发的行列。那么对于一个从来没有接触过Android开发的人,该从哪里入手,怎样做出自己的第一个应用程序呢?以下将以一个简单的应用程序--LED测试应用程序来简述Android应用程序开发方法。
我这里要介绍的LED测试应用程序名为TestKey,其软件的实现是我们重点讲述的,他符合Android应用程序开发框架,有利于您对Android系统的学习。所用的系统是Ubuntu 12.04操作系统,开发工具是ADT-Bundle。

一 软件实现框架

TestKey 软件实现Led控制的系统调用图如下:



下面我们由下至上来说明每一层的功能:
Linux kernel层:
由linux系统为Led测试Demo提供驱动支持,产生设备节点/dev/leds。
led驱动代码位于linux内核目录/driver/char/forlinx210_leds.c中。
Libraries层:
Android包含一个C/C++库的集合,供Android系统的各个组件使用。一些核心库包括:系统C库,媒体库,界面管理,LibWebCore,SGL,3D库,FreeType,SQLite等。
此处我们用到了JNI方法。JNI是Java Native Interface的缩写,译为Java本地接口。它允许Java代码和其他语言编写的代码进行交互。在Android中使用JNI方法可以让Java程序调用C/C++语言程序。Android中很多Java类都具有native接口,这些接口由本地实现,然后注册到系统中。
JNI在Android系统中有着广泛的应用。Android系统底层都是C/C++实现的,上层提供的API都是Java的,Java通过JNI调用底层的实现。比如:AndroidAPI多媒体接口MediaPlayer类,其实底层通过JNI调用libmedia库。由于JNI的存在可以让我们重用很多已经存在C/C++的库,省去了重复开发的麻烦,并且可以利用很多开源的库(Android库中就有很多开源库,比如libjpeg,libpng等等),并且让我们开发的程序更有效率(C/C++代码发挥硬件最佳性能)
在Led测试程序中本地的C文件位于源代码树的./device/samsung/smdkv210/leds下面,里面实现了向框架层注册本地函数,供上层的framework.jar库调用。文件编译成libleds.so动态库,位于文件系统的/system/lib目录下面。
Application Framwork 层:
framework层代码采用Java语言编写,提供了大量的API接口供上层应用程序进行调用。
在Led测试程序中framework层代码位于./frameworks/base/forlinx/java/device/v210/leds/Leds.java。
编译好的framework.jar位于文件系统的/system/framework/目录下面。
Application 层:
应用层位于Android系统架构的最高层,是给用户提供服务的最直接的程序,用户编写的程序基本上位于这一层。
TestKey.apk是用户操作界面,用户通过操作界面上的按钮来打开和关闭Led。
Testkey.apk源码工程文件位于源代码树的./packages/apps/TestKey。
下面的章节重点讲述的就是Application层中Testkey.apk应用软件在Eclipse中的开发过程。打开TestKey应用程序,可以看到有led,ADC,温度,蜂鸣器等功能,在这里我们主要关注led的实现部分。


二、创建APP工程
打开eclipse创建一个新的android工程,菜单栏点击File->New->Android Application Project
弹出New AndroidApplication框,输入工程名等如下图:


然后一直点next直到最后点finish,创建工程完毕。为打开工程编辑页面,点击eclipse左侧的java图标,如下图所示:



为方便编辑,弹出工程编辑窗口后,拖动窗口使其全屏,如下图:



至此创建并打开了新工程,下面就为其添加内容。
首先,设定界面布局。
在进行界面设计之前,先说一下Android界面的布局类型。Andorid的界面定义文件,在工程目录下的res/layout的xml文件里面,一般情况下一个xml对应一个或一类界面。
Android界面基本布局类型:
FrameLayout(框架布局):里面只可以有一个控件,并且不能设计这个控件的位置,控件会放到左上角。
LinearLayout(线性布局):里面可以放多个控件,但是一行只能放一个控件。
TableLayout(表格布局):这个要和TableRow配合使用,很像html里面的table。
AbsoluteLayout(绝对布局):里面可以放多个控件,并且可以自己定义控件的x,y的位置。
RelativeLayout(相对布局):里面可以放多个控件,不过控件的位置都是相对位置。
在eclipse左侧的Package Explorer部分找到布局文件并打开。单击LedTest/res/layout/双击activity_main.xml则在右侧代码编辑部分打开。在代码编辑部分的底部有显示方式的选择,xml文件有两种显示方式,布局图像显示方式和代码显示方式,对应Graphical Layout和activity_main.xml。因此设定布局也有两种方法,第一种是在Graphical Layout界面,从左侧拖动需要的控件到右侧的工程布局显示框中,第二种是直接编辑xml文件。在这里采用第二种方法。点击activity_main.xml以代码方式打开。把原有代码删掉,自己写xml代码,如下:

http://schemas.android.com/apk/res/android" data-ke-src=">http://schemas.android.com/apk/res/android" data-ke-src=">http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
     
      <CHECKBOX
        android:id="@+id/led1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/led1" />
     
      <CHECKBOX
        android:id="@+id/led2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/led2" />

      <CHECKBOX
        android:id="@+id/led3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/led3" />

      <CHECKBOX
        android:id="@+id/led4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/led4" />
 

以上布局是用垂直方式排列四个checkbox复选框。复选框提供一个制造单一选择开关的方法;它包括一个小框和一个标签。
同时需要修改工程中的TestKey/res/values/strings.xml文件,添加复选框标签的定义。添加完成后strings.xml文件内容如下:

      TestKey
      Settings
      Hello world!
      LED1
      LED2
      LED3
      LED4


以上步骤完成了主界面的布局,效果可以通过activity_main.xml文件的Graphical Layout显示方式查看,如下图:



 其次,添加java代码部分。
这部分我们要实现的功能是勾选界面上的checkbox复选框,开发板上相应的LED灯则点亮,取消勾选则变暗。在上一步已经做好了四个checkbox复选框的布局工作,这一步要做的是为checkbox绑定监听器,监听checkbox的选中和取消勾选这种勾选状态的改变,并且执行相应的打开和关闭LED的操作。监听器用到的是OnCheckedChangeListener类。打开和关闭LED的操作用到的是我们在第一章中自己编译的SDK中device.v210.leds包中的Leds.class类中的ledOn和LedOff方法,可以在eclipse左侧的Package Explore里点击TestKey工程下的Android4.0.3展开,再点击android.jar展开包含所有的包找到我们需要的包和类,如下图:



以上是大体的实现方法,然后就是添加实际的代码。在eclipse左侧的Package Explorer部分找到源码并打开,单击TestKey/src/com.example.testkey/双击MainActivity.java则在右侧代码编辑部分打开。此时默认已经有写好的Activity,需要在里面添加自己的代码,之后整个MainActivity.java如下:
package com.example.testkey;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import device.v210.leds.Leds;

public class MainActivity extends Activity {
 
 private CheckBox        LED1;  //define checkbox
    private CheckBox        LED2;
    private CheckBox        LED3;
    private CheckBox        LED4;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  LED1=(CheckBox)findViewById(R.id.led1); //get checkbox from xml file
  LED2=(CheckBox)findViewById(R.id.led2);
  LED3=(CheckBox)findViewById(R.id.led3);
  LED4=(CheckBox)findViewById(R.id.led4);
  
  //set listener for checkbox
  LED1.setOnCheckedChangeListener(new OnCheckedChangeListener(){

   @Override
   public void onCheckedChanged(CompoundButton buttonView,
     boolean isChecked) {
    // TODO Auto-generated method stub
    Leds leds = new Leds();
    if(isChecked==true){
     leds.ledOn(0);  //turn on the LED
                }
                else
                {
                    leds.ledOff(0); //turn on the LED
                }
    
   }
   
  });
  
  LED2.setOnCheckedChangeListener(new OnCheckedChangeListener(){

   @Override
   public void onCheckedChanged(CompoundButton buttonView,
     boolean isChecked) {
    // TODO Auto-generated method stub
    Leds leds = new Leds();
    if(isChecked==true){
     leds.ledOn(1);
                }
                else
                {
                    leds.ledOff(1);
                }
    
   }
   
  });
  LED3.setOnCheckedChangeListener(new OnCheckedChangeListener(){

   @Override
   public void onCheckedChanged(CompoundButton buttonView,
     boolean isChecked) {
    // TODO Auto-generated method stub
    Leds leds = new Leds();
    if(isChecked==true){
     leds.ledOn(2);
                }
                else
                {
                    leds.ledOff(2);
                }
    
   }
   
  });
  LED4.setOnCheckedChangeListener(new OnCheckedChangeListener(){

   @Override
   public void onCheckedChanged(CompoundButton buttonView,
     boolean isChecked) {
    // TODO Auto-generated method stub
    Leds leds = new Leds();
    if(isChecked==true){
     leds.ledOn(3);
                }
                else
                {
                    leds.ledOff(3);
                }
    
   }
   
  });
  
 }
 
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

}
以上则完成了整个TestKey应用程序LED部分的开发。实现了从界面上选中和取消LED框来控制led灯的亮灭的功能。现在,对Android应用程序开发有了基本的了解,开始动手开发自己的Android应用程序吧!
更多关于 嵌入式开发板 相关知识点就在飞凌官网: http://www.forlinx.com

 

资料下载:

[入门指导]简述Android 应用程序开发方法    点击下载