[入門指導]簡述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.tkbv.cn
資料下載:
相關產品 >
-
OKT507-C 開發板
CPU: T507 工業級處理器,超低功耗,10年+生命周期|推薦全志工業級T507開發板系列,飛凌OKT507-C開發板采用全志T507 四核工業級處理器 T507設計開發,Cortex-A53架構,工業級寬溫,性能強,低功耗,是一款高性價比的工業級產品,提供豐富的開發設計資料,提供產品規格書,軟硬件手冊等,全志的T507適用于車載電子、電力、醫療、工業控制、物聯網、智能終端等領域。
了解詳情 -
OK3568-C開發板
強而穩,國產芯,1Tops算力,多路高速接口|飛凌RK3568系列RK3568開發板基于國產工業級AI處理器RK3568四核64位Cortex-A55 處理器設計。RK3568作為國產化高性能處理器,瑞芯微RK3568芯片是一款定位中高端的通用型SoC,瑞芯微RK3568芯片是一款定位中高端的通用型SoC,NPU達到1Tops,飛凌RK3568系列核心板提供瑞芯微RK3568規格書_datasheet_數據手冊_原理圖等,