By 高煥堂
欲瞭解Android底層架構,第一步就是掌握其進程(Process)和線程(Thread)機制,它是Android框架順利運作的基礎。
l
總是由進程(Process)的主線程(Main thread)執行SDK-Service(如下圖的myService)物件。
l
Android底層Binder System在binding-time會從該進程的Thread pool裡啟動一個線程來執行SDK-Service的Binder介面物件(如myBinder)。
l
執行myActivity物件的線程與myBinder物件的線程會同步(Synchronize),讓myActivity開發者覺得IPC遠程呼叫、跨進程的兩個線程,就如同單一線程一般。
本文就Local SDK-Service與Remote
SDK-Service兩種來說明之。
一、如果屬於Local Service。
----
則myActivity與myService兩者都是由main thread所執行。亦即,兩者是同一線程所執行。此情形下,兩個類別裡的函數都不宜太費時(例如不宜超過5秒鐘);但必要時可誕生子線程去執行費時的函數。
//ac01.java
(myActivity)
package com.misoo.kx02b;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class ac01 extends Activity implements OnClickListener {
//private final int
WC =
LinearLayout.LayoutParams.WRAP_CONTENT;
private TextView tx;
private Button btn;
@Override public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams param =
new LinearLayout.LayoutParams(150,
40);
param.topMargin = 5;
tx = new TextView(this);
tx.setTextSize(16);
tx.setTextColor(Color.BLUE);
tx.setBackgroundResource(R.drawable.x_yellow);
layout.addView(tx, param);
btn = new Button(this);
btn.setText("Exit");
btn.setBackgroundResource(R.drawable.earth);
btn.setOnClickListener(this);
layout.addView(btn, param);
this.setContentView(layout);
//--------------------------------------------------
String tna = Thread.currentThread().getName();
Thread.currentThread().setName(tna + "-myActivity");
//--------------------------------------------------
myService.setUpdateListener(new UpdateUIListener());
Intent svc = new Intent(this, myService.class);
startService(svc);
}
@Override protected void onDestroy() {
super.onDestroy(); {
Intent svc = new Intent(this, myService.class);
stopService(svc);
}
}
class UpdateUIListener
implements IListener {
public void update(String s) {
tx.setText(s);
}
}
public void onClick(View v) {
this.finish();
}
}
IListener.java
package com.misoo.kx02b;
public interface IListener {
public void update(String s);
}
//myService.java
package com.misoo.kx02b;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
public class myService extends Service {
private static IListener plis;
private static int k = 0;
private Timer timer = new Timer();
private String tna;
public Handler handler = new Handler(){
public void handleMessage(Message msg)
{
plis.update(tna);
}
};
@Override
public void onCreate() {
super.onCreate();
tna =
Thread.currentThread().getName();
TimerTask task = new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(0);
}
};
timer.schedule(task,1000,
4000);
}
@Override
public IBinder onBind(Intent intent)
{
return null;
}
public static void setUpdateListener(IListener listener)
{
plis = listener;
}
}
此程式輸出:
此結果說明了,myActivity與myService兩者都是由main thread所執行。