編輯:初級開發
1.2.4 範例程式(3):採單純委託方法
1.2.4.1 撰寫步驟:
Step-1: 建立android專案:Px03。
Step-2: 撰寫Activity的子類別:ac01,其程式碼如下:
/* ac01.Java */
package com.misoo.pkcc;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.VIEw;
import android.view.VIEw.OnClickListener;
import android.widget.LinearLayout;
import android.widget.TextVIEw;
public class ac01 extends Activity implements OnClickListener {
private final int WC = LinearLayout.LayoutParams.WRAP_CONTENT;
private final int FP = LinearLayout.LayoutParams.FILL_PARENT;
private mp3Player mp3_player;
private myButton btn, btn2, btn3;
public TextVIEw tv;
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
mp3_player = new mp3Player(this);
LinearLayout layout = new LinearLayout(this);
layout.setOrIEntation(LinearLayout.VERTICAL);
btn = new myButton(this);
btn.setId(101);
btn.setText("play");
btn.setOnClickListener(this);
LinearLayout.LayoutParams param =
new LinearLayout.LayoutParams(btn.get_width(),
btn.get_height());
param.topMargin = 10;
layout.addVIEw(btn, param);
btn2 = new myButton(this);
btn2.setId(102);
btn2.setText("stop");
btn2.setOnClickListener(this);
layout.addVIEw(btn2, param);
btn3 = new myButton(this);
btn3.setId(103);
btn3.setText("exit");
btn3.setOnClickListener(this);
layout.addVIEw(btn3, param);
tv = new TextVIEw(this);
tv.setTextColor(Color.WHITE);
tv.setText("Ready");
LinearLayout.LayoutParams param2 =
new LinearLayout.LayoutParams(FP, WC);
param2.topMargin = 10;
layout.addVIEw(tv, param2);
setContentVIEw(layout);
}
public void onClick(VIEw v) {
switch(v.getId()){
case 101: mp3_player.start(); break;
case 102: mp3_player.stop(); break;
case 103: finish(); break;
}
}
}
Step-3: 撰寫mp3Player類別,其程式碼如下:
/* mp3Player.Java */
package com.misoo.pkcc;
import android.app.Activity;
import android.content.Context;
import android.media.MediaPlayer;
import android.util.Log;
public class mp3Player {
private MediaPlayer mPlayer;
private Context ctx;
public mp3Player(Context context){
ctx = context;
mPlayer = MediaPlayer.create(ctx, R.raw.test_cbr);
}
public void start(){
try{
mPlayer.start();
((ac01)ctx).tv.setText("Playing audio...");
((Activity)ctx).setTitle("MP3 Music");
} catch (Exception e) {
Log.e("StartPlay", "error: " + e.getMessage(), e);
}
}
public void stop(){
if (mPlayer != null) {
((ac01)ctx).tv.setText("Stop");
mPlayer.stop();
mPlayer.release();
mPlayer = null;
}
}
}
Step-4: 撰寫Button的子類別:myButton,其程式碼如下:
/* myButton.Java */
package com.misoo.pkcc;
import android.content.Context;
import android.widget.Button;
public class myButton extends Button {
public myButton(Context ctx){
super(ctx);
super.setBackgroundResource(R.drawable.heart);
}
public int get_width(){
return 80;
}
public int get_height(){
return 50;
}
}
Step-5: 執行之。
1.2.4.2 說明:
1. 由於mp3Player類別並沒有繼承MediaPlayer類別,清晰地告訴外界的類別或函數(如ac01類別),它們只能透過mp3Player類別定義的兩個函數(即start()和stop()函數)來播放或停止音樂。
2. mp3Player類別之物件顯然單純喜多,如下圖:
3. 其實,這種委託機制,就是本書前面各章介紹過的物件組合方法。只是在這裡拿來與繼承機制比較一番,讓大家能兼具這兩把刷子,並且能交換使用,截長補短、相輔相成,達到完美之境
講義摘錄之12:認識android的UID(Unix user ID)與權限
傳統電腦上,UID是跟隨著「人」(例如電腦的使用者或用戶)。Android裡的UID是跟隨著「軟體」(例如android應用程式)。
由於每個應用程式都有個UID,只有帶著此UID,才能存取該UID所涵蓋的有關資料。所以如果AP-1與AP-2的UID不同,則在預設(Default)情況下,雙方都無法讀取對方的資料。這種分而治之的方式,可以減輕駭客軟體的惡意傷害資料,提升手機的安全性。
當手機使用者(即User)下載你(即開發者)的應用程式,在安裝(Install)時,Android就會給予一個UID。這個UID可連結到該應用程式的 AndroidManifest.xml檔案的內容。所以User在安裝你的應用程式時,在螢幕上的視窗裡可以檢視這個androidManifest.XML檔案的內容。在檢視時,用戶會看到你對應用程式的目的、權限等說明。當你接受這支程式的意圖、權限說明之後,Android就安裝它,並給它一個UID。萬一在你的應用程式執行期間有越軌(企圖做出非權限範圍)的行為時,用戶將會得到android的警告訊息。
有一些特殊情形下,兩支應用程式是可以持有一樣的UID。例如,同一位開發者撰寫的應用程式,常常需要推出新版本,這兩種版本的程式可以持有一樣的UID, 才有權限去將舊版程式所產生的資料拷貝轉移到新版軟體裡。
一個用戶在其使用手機的用例(Use Case)裡,通常由一個Activity啟動開始,透過Intent物件去啟動其他的Activity、Service、ContentProvider等具有不同UID的一連串應用程式,才能滿足一個用例的目標。在傳統電腦上,UID是跟隨著「人」,一個用戶持著一個UID就能執行一連串的應用程式,而且在預設條件下是可以互相共享資料。但是在android裡,這一連串的應用程式是各有自己的UID,而且可能都持著不同的UID,原則上是不能任意存取對方的資料。
UID與AndroidManifest.xml檔案的連結除了可以保護各程式的私有資料之外,還可以禁止程式越權使用手機的各項資源。例如,開發者在AndroidManifest.xml檔案裡表明此程式有READ_CONTACTS的授權。用戶在安裝此應用程式時,檢視過androidManifest.XML的授權內涵,而且接受之。此應用程式就能合法地存取手機裡的通訊錄資料,甚至授權撥打電話、發簡訊等等。
剛才提到過,一個用戶的用例(Use Case)裡,通常由多個不同UID的Activity、Service、ContentProvider等一連串的應用程式所串接,才能滿足用例的目標。此時,如果它們都必須存取通訊錄的話,必須都持有相同的READ_CONTACTS授權才行。
以上就應用程式的開發者、使用者的角度來說明Android的UID之意義和用法。至於Android如何運用Linux的進程(Process)機制及android的特殊管理政策,在此講義的節錄版裡,就省略之。
這篇文章沒有打算有一個很好的邏輯去介紹android的某個方面,全盤大致上就是我接觸、了解android的ui開發後到現在的一些感想以及個人理解吧! &nbs
Nexue One是有一定的緣分的,記得是在1月12號的晚上寫的Nexus One評測,因為對這款手機的關注,使得在奔赴下一個工作征程的時候最後用Nexu
android是一個針對觸摸屏專門設計的操作系統,當點擊編輯框,系統自動為用戶彈出軟鍵盤,以便用戶進行輸入。 那麼,彈出軟鍵盤後必然
HTC Hero作為一款硬件配置強悍的智能手機,對不同版本的android系統兼容性非常好,曾有用戶將HTC新機Espresso內的2.1版android系統和最新的S