二、環境搭建
1、Android---電腦===>兼容機
開源/免費
Android聯盟
2、Android開發環境搭建
A、java+eclipse3.5+
B、android sdk
C、adt--android的eclipse開發插件(安裝)
模擬器
屏幕分辨率
HVGA:320×480
QVGA:240x320
WQVGA400:240X400
WQVAG432:240X432
WVGA800: 480X800
WVGA854: 480X854
3、Android應用程序架構
src/java源代碼存放目錄
gen/自動生成目錄,Android開發工具自動根據你放入res目錄的xml界面文件、圖標與常量,同步更新R.java文件。通過R.java,應用可以很方便地找到對應資源。另外編譯器也會檢查R.java列表中的資源是否被使用到,沒有被使用到的資源不會編譯進軟件中,這樣可以減少應用程序在手機佔用的空間。
res/資源目錄,在這個目錄中我們可以存放應用使用到的各種資源
assets資源目錄,改目錄也可以存放資源,而且改目錄下的資源不會在R.java自動生成ID,所以讀取/assets目錄下的文件必須制定文件的路徑,如
file:///android_assets/xxx.3gp
AndroidManifest.xml:列出了應用程序所提供的功能,開發的各種組件需要在該文件中進行配置,
default.properties項目環境信息,
4、基本工具的應用
A、往模擬器上上傳東西---File Explore
B、設備管理Device--模擬器管理
C、控制模擬器--Emulator Control
5、第一個Android應用程序創建
應用名
包名---唯一的java包名
Activity名稱---類名
6、Android應用的簡單組成
AndroidManifest.xml---Android項目清單文件(配置文件)
res目錄--存放各種資源文件信息,比如字符串,圖片,音樂等,會自動把裏面的東西生成應用常量在R文件中。要注意文件名及name必須是合法的java標識符。
文件更特殊,Invalid file name: must contain only [a-z0-9_.]
<string name="address.city">城市</string>---這種資源解析時會變成address_city。
7、Android程序運行的過程
(1)、檢查環境
[2012-03-18 11:51:17 - gz1205-helloworld] ------------------------------
[2012-03-18 11:51:17 - gz1205-helloworld] Android Launch!
[2012-03-18 11:51:17 - gz1205-helloworld] adb is running normally.
[2012-03-18 11:51:17 - gz1205-helloworld] Performing cn.itcast.gz.hello.HelloActivity activity launch
[2012-03-18 11:51:17 - gz1205-helloworld] Automatic Target Mode: using existing emulator 'emulator-5554' running compatible AVD 'android2.2vm'
(2)、把應用上傳到模擬器上
[2012-03-18 11:51:17 - gz1205-helloworld] Uploading gz1205-helloworld.apk onto device 'emulator-5554'
(3)、在模擬器上安裝
[2012-03-18 11:51:42 - gz1205-helloworld] Installing gz1205-helloworld.apk...
[2012-03-18 11:51:52 - gz1205-helloworld] Success!
(4)、起動程序
[2012-03-18 11:51:52 - gz1205-helloworld] Starting activity cn.itcast.gz.hello.HelloActivity on device emulator-5554
[2012-03-18 11:51:55 - gz1205-helloworld] ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]
cmp=cn.itcast.gz.hello/.HelloActivity }
8、關於andorid的apk包
jar包
web程序war包
android程序apk包---也是一個普通的壓縮文件。---裏面的xml資源文件是加密的。
*.class文件被打包到classes.dex (類似於jar包,實際是包含了jar包及一些xml資源文件)===可以通過工具把他裏面的jar包提取出來。
四、Android應用程序界面簡單開發
1、Activity及View介紹
A、Activity代表一個屏幕--Android四大組件之一
(1)、寫一個類繼承Activity類
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加入自己的代碼
System.out.println("onCreate()....");
}
}
(2)、配置Activity-在AndroidManifest.xml進行配置
<activity android:name="cn.itcast.gz.ui.MainActivity"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<!-- 意圖過濾器 ,設置爲起動Activity,這樣就會在開始菜單界面中找到-->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
(3)、設置內容,調用Activity的setContentView()方法即可。
B、View---可視化的控件
Veiw-具體的控件,比如Button。
ViewGroup->容器控件,佈局控件。
2、直接用程序創建界面。---與Swing類似
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加入自己的代碼
System.out.println("onCreate()....");
//往Activity中設置內容
//在寫Android組件的時候,凡是要用Context的地方,要麼就組件本身繼承自Context(直接用this),或者組件提供getContext()方法來獲得
Button btn1=new Button(this);
//設置按鈕的屬性
btn1.setText("確定");
//this.setContentView(btn1);
Button btn2=new Button(this);
//設置按鈕的屬性
btn2.setText("取消");
//創建ViewGroup
//ViewGroup vg=
//往容器中添加控件
LinearLayout layout=new LinearLayout(this);
//設置佈局的屬性,比如設置Orientation來指定容器中控件的排放方式
layout.setOrientation(LinearLayout.VERTICAL);
layout.addView(btn1);
layout.addView(btn2);
setContentView(layout);
}
}
3、使用標記語言來聲明界面。
A、Activity類
public class MainActivity2 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//設置屏幕中顯示的內容,從layout佈局中文件中加載
setContentView(R.layout.ui);
}
}
B、佈局資源文件layout\ui.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="確定" >
</Button>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消" >
</Button>
</LinearLayout>
五、事件處理
1、事件響應
2、在程序中使用setOnXXXX方法來設置事件監聽對象
//獲得Button對象,通過按鈕的id去查找
Button btn=(Button)this.findViewById(R.id.btnOk);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("點擊了按鈕....");
EditText et=(EditText)findViewById(R.id.txtMsg);
System.out.println(et.getText().toString());
}
});
3、可以直接在佈局資源文件中指定事件響應方法-- android:onClick="test"
A、佈局文件
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="test"
android:text="Button1" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="cancel"
android:text="Button2" />
B、Activity的源代碼
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
}
public void test(View v){
System.out.println("測試一下....");
}
public void cancel(View v){
EditText et = (EditText) findViewById(R.id.txtMsg);
System.out.println(et.getText().toString());
}
}
4、處理按鍵事件--重寫Activity的onKeyDown等事件處理方法
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
System.out.println("按鍵:"+keyCode);
//return true;
return super.onKeyDown(keyCode, event);
}
六、Android應用簡單示例及工具應用:
1、電話拔打實例 dial
A、界面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/telNumber" />
<EditText
android:id="@+id/txtTel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/btnDial"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dial"
/>
</LinearLayout>
B、添加代碼
public class MainActivity extends Activity {
private EditText txtTel;
private Button btnDial;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//初始化控件對象--直接查找
txtTel=(EditText) findViewById(R.id.txtTel);
btnDial=(Button)findViewById(R.id.btnDial);
//設置事件監聽對象
btnDial.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//獲得用戶輸入電話號碼
String tel=txtTel.getText().toString();
//調用Android中的撥號程序來撥號
Intent it=new Intent(Intent.ACTION_CALL,Uri.parse("tel:"+tel));
//起動通話程序
startActivity(it);
}
});
}
}
C、出示權限
03-18 16:31:56.414: E/AndroidRuntime(3898): java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:110
cmp=com.android.phone/.OutgoingCallBroadcaster } from ProcessRecord{44f7c158 3898:cn.itcast.gz.dial/10039} (pid=3898, uid=10039) requires android.permission.CALL_PHONE
<!-- 出示權限,表示應用要使用到哪些權限的操作 -->
<uses-permission android:name="android.permission.CALL_PHONE"/>
2、發短信
public void sendSms(View v){
//獲得電話號碼及短信內容
String tel=txtTel.getText().toString();
String c=txtContent.getText().toString();
//發送短信,調用手機短信管理硬件設備來發短信
//獲得短信管理器
SmsManager smsManager=SmsManager.getDefault();
//撤分短信,確保全部發完
ArrayList<String> msgs= smsManager.divideMessage(c);
for (int i = 0; i < msgs.size(); i++) {
smsManager.sendTextMessage(tel,null,msgs.get(i),null,null);
}
System.out.println("成功發送了"+msgs.size()+"條短信!");
}
3、消息通知
A、對話框 B、消息欄Notification C、Toast消息
Toast消息的實現
/*
//創建Toast對象
Toast toast=Toast.makeText(this, "成功發送了"+msgs.size()+"條短信!", Toast.LENGTH_LONG);
//顯示
toast.show();
*/
//直接創建後立即顯示
Toast.makeText(this, "成功發送了"+msgs.size()+"條短信!", Toast.LENGTH_SHORT).show();
4、真機測試
A、賣出價一臺手機
B、裝驅動usb驅動,從設置中並打開USB調試模式
C、直接運行即可---與在模擬器上一樣。