Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> Android開發教程之高煥堂-上課講義(4)

Android開發教程之高煥堂-上課講義(4)

編輯:初級開發

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類別之物件顯然單純喜多,如下圖:

clip_image041

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的特殊管理政策,在此講義的節錄版裡,就省略之。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved