目录
[4、 细说主线程(UI线程)的角色](#4、 细说主线程(UI线程)的角色)
4、 细说主线程(UI线程)的角色
近程通信
- 在Android里,无论组件在那一个进程里执行,于预设情形下,他们都是由该进程里的主线程来负责执行之。
- 例如下述的范例,由一个Activity启动一个Service,两者都在同一个进程里执行。此时,两者都是由主线程负责执行的。如下图所示:
java
// ac01.java
//......
public class ac01 extends Activity implements OnClickListener {
private Button btn, btn2;
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
btn = new Button(this); btn.setId(101);
btn.setText("run service");
btn.setBackgroundResource(R.drawable.heart);
btn.setOnClickListener(this);
LinearLayout.LayoutParams param
= new LinearLayout.LayoutParams(135, 50);
param.topMargin = 10; layout.addView(btn, param);
btn2 = new Button(this); btn2.setId(102);
btn2.setText("Exit");
btn2.setBackgroundResource(R.drawable.heart);
btn2.setOnClickListener(this);
layout.addView(btn2, param);
setContentView(layout);
//---------------------------------------
Thread.currentThread().setName(
Thread.currentThread().getName()+"-ac01");
}
public void onClick(View v) {
switch (v.getId()) {
case 101:
this.startService(new Intent(this, myService.class));
break;
case 102:
finish(); break;
}
}
}
// myService.java
//........
public class myService extends Service {
@Override public void onCreate(){
Thread.currentThread().setName(
Thread.currentThread().getName() + "-myService");
Toast.makeText(this, Thread.currentThread().getName(),
Toast.LENGTH_SHORT).show();
}
@Override public IBinder onBind(Intent intent)
{ return null; }
}
- 主线程先执行ac01的onCreate()函数,然后,继续执行myService的onCreate()函数。于是,输出了主线程的执行轨迹纪录:
- 除了上述的Activity和Service之外,还有BroadcastReceiver也是一样,是由主线程来执行的。例如,由一个Activity启动一个BroadcastReceiver,两者都在同一个进程里执行。此时,两者都是由主线程负责执行的。如下图所示
java
// ac01.java
// .......
public class ac01 extends Activity implements OnClickListener {
//.......
public void onCreate(Bundle icicle) {
//.........
Thread.currentThread().setName(Thread.currentThread().getName()+"-ac01");
}
public void onClick(View v) {
switch (v.getId()) {
case 101:
Intent in = new Intent(MY_EVENT);
this.sendBroadcast(in); break;
case 102:
finish(); break;
}
}
}
// myReceiver.java
//........
public class myReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent)
{
Thread.currentThread().setName(
Thread.currentThread().getName() + "-myReceiver");
Toast.makeText(context,
Thread.currentThread().getName(),
Toast.LENGTH_SHORT).show();
}
}
- 主线程先执行myActivity的onCreate()函数,之后继续执行myReceiver的onReceive()函数。于是输出了主线程执行的轨迹纪录:
远程通信
- 如果Activity、 Service和BroadcastReceiver三者并不是在同一个进程里执行时,它们之间的通讯就是跨进程通讯(IPC)了。
- 请先看个范例,它由一个Activity启动一个远距的Service,两者分别在不同的进程里执行,如下图所示:
- 当Activity与Service(或BroadcastReceiver)之间采用IPC通讯时,意味着两者分别在不同的进程里执行。此时, 于预设情形下,Activity、 BroadcastReceiver或Service都是由其所属进程里的主线程负责执行之。
- Android核心的Binder System从" remote"进程的线程池里,启动一个线程(名
为" Binder Thread #1")来执行myBinder的onTransact()函数。 - 依据Binder System的同步(Synchronization)的机制,主线程会等待
Binder Thread #1线程执行完毕,才会继续执行下去。