總網頁瀏覽量

2012年3月30日 星期五

argc argv

argc argc用法

int main(int argc, char **argv)

假設執行為:  test.exe  a b c

則輸出為:   argv[0] = test.exe, argv[1] = a, argv[2] = b, argv[3] = c

argc = 4

2012年3月27日 星期二

savedInstanceState Bundle 存值取值


savedInstanceState.putParcelable("名稱 A", 物件_A);
savedInstanceState.putInt("名稱 B", 物件_B);
物件_C.writeToBundle(savedInstanceState, "名稱 C");
物件_D.writeToBundle(savedInstanceState, "名稱 D");


super.onRestoreInstanceState(savedInstanceState);
物件_A = savedInstanceState.getParcelable("M名稱 A");
物件_B = savedInstanceState.getInt("名稱 B");
物件_C.readFromBundle(savedInstanceState, "名稱 C");
物件_D.readFromBundle(savedInstanceState, "名稱 D");

2012年3月24日 星期六

Broadcast 設計


Broadcast 廣播機制

//傳送廣播
public class SentBroadcas extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Button b1 = (Button) findViewById(R.id.Button01);
//點擊Button後發送廣播
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent().setAction("android.intent.test")
sendBroadcast(intent);
}
});
}
}

//接收廣播
public class BroadcastReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("android.intent.test")){
}
}
}


//在AndroidManifest.xml註冊
<receiver android:name="BroadcastReciever">
    <intent -filter="">
        <action android:name="android.intent.test">
        </action></intent>
</receiver>

----------------------------------------------------------------------------------------------




2012年3月5日 星期一

Android Handler


Handler
使用Handlerpost方法,將要執行的執行緒物件加到佇列中
handler.post(updateThread); 馬上加入到消息佇列內

創造一個Handler物件
Handler handler = new Handler();

將要執行的功能寫到執行緒物件的run方法中
Runnable updateThread = new Runnable(){
        @override
        public void run(){
        System.out.println(“UpdareThread”);
        handler.postDelayed(updateThread, 3000); 3000毫秒加一次
}
}
Thread移除
handler.removeCallbacks(updateThread);

ProgressBar加入到Handler
根據控制鍵ID取的代表控制鍵的物件,並為按鈕設置監聽器
Runnable updateThread = new Runnable(){
int i = 0 ;
        @Override
        public void run() {
            System.out.println("Begin Thread");
            i = i + 10 ;
                //取的一個消息物件,Message類別由Android操作系統提供
            Message msg = updateBarHandler.obtainMessage();
                //msg物件的arg1參數設置為I,用arg1arg2這兩個成員資料傳遞消息,優點為系統  性能消耗較少
            msg.arg1 = i ;
            try {
                        //設置當前執行緒睡眠1
                        Thread.sleep(1000);
            } catch (InterruptedException e) {
                        e.printStackTrace();
            }
                //msg物件加入到消息佇列中
                updateBarHandler.sendMessage(msg);
            if( i == 100){ //i值為100時,將執行緒物件從Handler中移除
                        updateBarHandler.removeCallbacks(updateThread);
            }
        }
};

//使用匿名內部類別來覆寫Handler中的handleMessage方法
Handler updateBarHandler = new Handler(){
@Override
public void handleMessage(Message msg) { //取得Message msg
bar.setProgress(msg.arg1);
updateBarHandler.post(updateThread);
}

sendMessage(msg); msg到佇列
handleMessage(Message msg) 從佇列取msg

Handler不是產生一個thread來執行而是直接使用runnable方法

Bundle 類似鍵值對


HandlerThread 實作了looper來處理消息佇列功能
這個類別由Android應用程序框架提供
HandlerThread  handlerThread = new HandlerThread(“handler_thread”);
handlerThread.start();
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
Message msg = myHandler.obtainMessage(); //得到消息
Msg.sendToTarget(); //msg發送到目標物件,所謂的目標物件就是生成msg物件的handler物件

class MyHandler exteands Handler{
        public MyHandler(){
}
Public MyHandler(Looper looper){ //handler綁定到looper
        super(looper);
}
}

傳送資料與取得資料
msg.obj=”abc”;
String s = (String)msg.obj;

傳送大量資料利用Bundle
Bundle b = new Bundle();
b.putInt(“age”, 20);
b.putString(“name”, “Jhon”);
msg.setData(b);
msg.sendToTarget();

取資料
Bundle b = msg.getData();
Int ag = b.getInt(“age”);
String name = b.getString(“name”);