[入門指導(dǎo)]簡(jiǎn)述Android 應(yīng)用程序開發(fā)方法

原創(chuàng) 2015-06-23 10:10:00 [入門指導(dǎo)]簡(jiǎn)述Android 應(yīng)用程序開發(fā)方法

簡(jiǎn)述Android 應(yīng)用程序開發(fā)方法

隨著Android系統(tǒng)的普及,越來越多的學(xué)生,工程師開始步入了Android開發(fā)的行列。那么對(duì)于一個(gè)從來沒有接觸過Android開發(fā)的人,該從哪里入手,怎樣做出自己的第一個(gè)應(yīng)用程序呢?以下將以一個(gè)簡(jiǎn)單的應(yīng)用程序--LED測(cè)試應(yīng)用程序來簡(jiǎn)述Android應(yīng)用程序開發(fā)方法。
我這里要介紹的LED測(cè)試應(yīng)用程序名為TestKey,其軟件的實(shí)現(xiàn)是我們重點(diǎn)講述的,他符合Android應(yīng)用程序開發(fā)框架,有利于您對(duì)Android系統(tǒng)的學(xué)習(xí)。所用的系統(tǒng)是Ubuntu 12.04操作系統(tǒng),開發(fā)工具是ADT-Bundle。

一 軟件實(shí)現(xiàn)框架

TestKey 軟件實(shí)現(xiàn)Led控制的系統(tǒng)調(diào)用圖如下:



下面我們由下至上來說明每一層的功能:
Linux kernel層:
由linux系統(tǒng)為L(zhǎng)ed測(cè)試Demo提供驅(qū)動(dòng)支持,產(chǎn)生設(shè)備節(jié)點(diǎn)/dev/leds。
led驅(qū)動(dòng)代碼位于linux內(nèi)核目錄/driver/char/forlinx210_leds.c中。
Libraries層:
Android包含一個(gè)C/C++庫(kù)的集合,供Android系統(tǒng)的各個(gè)組件使用。一些核心庫(kù)包括:系統(tǒng)C庫(kù),媒體庫(kù),界面管理,LibWebCore,SGL,3D庫(kù),F(xiàn)reeType,SQLite等。
此處我們用到了JNI方法。JNI是Java Native Interface的縮寫,譯為Java本地接口。它允許Java代碼和其他語言編寫的代碼進(jìn)行交互。在Android中使用JNI方法可以讓Java程序調(diào)用C/C++語言程序。Android中很多Java類都具有native接口,這些接口由本地實(shí)現(xiàn),然后注冊(cè)到系統(tǒng)中。
JNI在Android系統(tǒng)中有著廣泛的應(yīng)用。Android系統(tǒng)底層都是C/C++實(shí)現(xiàn)的,上層提供的API都是Java的,Java通過JNI調(diào)用底層的實(shí)現(xiàn)。比如:AndroidAPI多媒體接口MediaPlayer類,其實(shí)底層通過JNI調(diào)用libmedia庫(kù)。由于JNI的存在可以讓我們重用很多已經(jīng)存在C/C++的庫(kù),省去了重復(fù)開發(fā)的麻煩,并且可以利用很多開源的庫(kù)(Android庫(kù)中就有很多開源庫(kù),比如libjpeg,libpng等等),并且讓我們開發(fā)的程序更有效率(C/C++代碼發(fā)揮硬件最佳性能)
在Led測(cè)試程序中本地的C文件位于源代碼樹的./device/samsung/smdkv210/leds下面,里面實(shí)現(xiàn)了向框架層注冊(cè)本地函數(shù),供上層的framework.jar庫(kù)調(diào)用。文件編譯成libleds.so動(dòng)態(tài)庫(kù),位于文件系統(tǒng)的/system/lib目錄下面。
Application Framwork 層:
framework層代碼采用Java語言編寫,提供了大量的API接口供上層應(yīng)用程序進(jìn)行調(diào)用。
在Led測(cè)試程序中framework層代碼位于./frameworks/base/forlinx/java/device/v210/leds/Leds.java。
編譯好的framework.jar位于文件系統(tǒng)的/system/framework/目錄下面。
Application 層:
應(yīng)用層位于Android系統(tǒng)架構(gòu)的最高層,是給用戶提供服務(wù)的最直接的程序,用戶編寫的程序基本上位于這一層。
TestKey.apk是用戶操作界面,用戶通過操作界面上的按鈕來打開和關(guān)閉Led。
Testkey.apk源碼工程文件位于源代碼樹的./packages/apps/TestKey。
下面的章節(jié)重點(diǎn)講述的就是Application層中Testkey.apk應(yīng)用軟件在Eclipse中的開發(fā)過程。打開TestKey應(yīng)用程序,可以看到有l(wèi)ed,ADC,溫度,蜂鳴器等功能,在這里我們主要關(guān)注led的實(shí)現(xiàn)部分。


二、創(chuàng)建APP工程
打開eclipse創(chuàng)建一個(gè)新的android工程,菜單欄點(diǎn)擊File->New->Android Application Project
彈出New AndroidApplication框,輸入工程名等如下圖:


然后一直點(diǎn)next直到最后點(diǎn)finish,創(chuàng)建工程完畢。為打開工程編輯頁(yè)面,點(diǎn)擊eclipse左側(cè)的java圖標(biāo),如下圖所示:



為方便編輯,彈出工程編輯窗口后,拖動(dòng)窗口使其全屏,如下圖:



至此創(chuàng)建并打開了新工程,下面就為其添加內(nèi)容。
首先,設(shè)定界面布局。
在進(jìn)行界面設(shè)計(jì)之前,先說一下Android界面的布局類型。Andorid的界面定義文件,在工程目錄下的res/layout的xml文件里面,一般情況下一個(gè)xml對(duì)應(yīng)一個(gè)或一類界面。
Android界面基本布局類型:
FrameLayout(框架布局):里面只可以有一個(gè)控件,并且不能設(shè)計(jì)這個(gè)控件的位置,控件會(huì)放到左上角。
LinearLayout(線性布局):里面可以放多個(gè)控件,但是一行只能放一個(gè)控件。
TableLayout(表格布局):這個(gè)要和TableRow配合使用,很像html里面的table。
AbsoluteLayout(絕對(duì)布局):里面可以放多個(gè)控件,并且可以自己定義控件的x,y的位置。
RelativeLayout(相對(duì)布局):里面可以放多個(gè)控件,不過控件的位置都是相對(duì)位置。
在eclipse左側(cè)的Package Explorer部分找到布局文件并打開。單擊LedTest/res/layout/雙擊activity_main.xml則在右側(cè)代碼編輯部分打開。在代碼編輯部分的底部有顯示方式的選擇,xml文件有兩種顯示方式,布局圖像顯示方式和代碼顯示方式,對(duì)應(yīng)Graphical Layout和activity_main.xml。因此設(shè)定布局也有兩種方法,第一種是在Graphical Layout界面,從左側(cè)拖動(dòng)需要的控件到右側(cè)的工程布局顯示框中,第二種是直接編輯xml文件。在這里采用第二種方法。點(diǎn)擊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" />
 

以上布局是用垂直方式排列四個(gè)checkbox復(fù)選框。復(fù)選框提供一個(gè)制造單一選擇開關(guān)的方法;它包括一個(gè)小框和一個(gè)標(biāo)簽。
同時(shí)需要修改工程中的TestKey/res/values/strings.xml文件,添加復(fù)選框標(biāo)簽的定義。添加完成后strings.xml文件內(nèi)容如下:

    TestKey
    Settings
    Hello world!
    LED1
    LED2
    LED3
    LED4


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



 其次,添加java代碼部分。
這部分我們要實(shí)現(xiàn)的功能是勾選界面上的checkbox復(fù)選框,開發(fā)板上相應(yīng)的LED燈則點(diǎn)亮,取消勾選則變暗。在上一步已經(jīng)做好了四個(gè)checkbox復(fù)選框的布局工作,這一步要做的是為checkbox綁定監(jiān)聽器,監(jiān)聽checkbox的選中和取消勾選這種勾選狀態(tài)的改變,并且執(zhí)行相應(yīng)的打開和關(guān)閉LED的操作。監(jiān)聽器用到的是OnCheckedChangeListener類。打開和關(guān)閉LED的操作用到的是我們?cè)诘谝徽轮凶约壕幾g的SDK中device.v210.leds包中的Leds.class類中的ledOn和LedOff方法,可以在eclipse左側(cè)的Package Explore里點(diǎn)擊TestKey工程下的Android4.0.3展開,再點(diǎn)擊android.jar展開包含所有的包找到我們需要的包和類,如下圖:



以上是大體的實(shí)現(xiàn)方法,然后就是添加實(shí)際的代碼。在eclipse左側(cè)的Package Explorer部分找到源碼并打開,單擊TestKey/src/com.example.testkey/雙擊MainActivity.java則在右側(cè)代碼編輯部分打開。此時(shí)默認(rèn)已經(jīng)有寫好的Activity,需要在里面添加自己的代碼,之后整個(gè)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;
 }

}
以上則完成了整個(gè)TestKey應(yīng)用程序LED部分的開發(fā)。實(shí)現(xiàn)了從界面上選中和取消LED框來控制led燈的亮滅的功能。現(xiàn)在,對(duì)Android應(yīng)用程序開發(fā)有了基本的了解,開始動(dòng)手開發(fā)自己的Android應(yīng)用程序吧!
更多關(guān)于嵌入式開發(fā)板相關(guān)知識(shí)點(diǎn)就在飛凌官網(wǎng):http://www.szrcclub.com

 

資料下載:

[入門指導(dǎo)]簡(jiǎn)述Android 應(yīng)用程序開發(fā)方法  點(diǎn)擊下載





相關(guān)產(chǎn)品 >

  • OKT507-C 開發(fā)板

    CPU: T507 工業(yè)級(jí)處理器,超低功耗,10年+生命周期|推薦全志工業(yè)級(jí)T507開發(fā)板系列,飛凌OKT507-C開發(fā)板采用全志T507 四核工業(yè)級(jí)處理器 T507設(shè)計(jì)開發(fā),Cortex-A53架構(gòu),工業(yè)級(jí)寬溫,性能強(qiáng),低功耗,是一款高性價(jià)比的工業(yè)級(jí)產(chǎn)品,提供豐富的開發(fā)設(shè)計(jì)資料,提供產(chǎn)品規(guī)格書,軟硬件手冊(cè)等,全志的T507適用于車載電子、電力、醫(yī)療、工業(yè)控制、物聯(lián)網(wǎng)、智能終端等領(lǐng)域。

    了解詳情
    OKT507-C 開發(fā)板
  • OK3568-C開發(fā)板

    強(qiáng)而穩(wěn),國(guó)產(chǎn)芯,1Tops算力,多路高速接口|飛凌RK3568系列RK3568開發(fā)板基于國(guó)產(chǎn)工業(yè)級(jí)AI處理器RK3568四核64位Cortex-A55 處理器設(shè)計(jì)。RK3568作為國(guó)產(chǎn)化高性能處理器,瑞芯微RK3568芯片是一款定位中高端的通用型SoC,瑞芯微RK3568芯片是一款定位中高端的通用型SoC,NPU達(dá)到1Tops,飛凌RK3568系列核心板提供瑞芯微RK3568規(guī)格書_datasheet_數(shù)據(jù)手冊(cè)_原理圖等,


    了解詳情
    OK3568-C開發(fā)板

推薦閱讀 換一批 換一批