深入Android架构(从线程到AIDL)_10 主线程(UI 线程)的角色

目录

[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线程执行完毕,才会继续执行下去。
相关推荐
4***997417 小时前
Kotlin序列处理
android·开发语言·kotlin
t***D26417 小时前
Kotlin在服务端开发中的生态建设
android·开发语言·kotlin
玲珑Felone17 小时前
flutter 状态管理--InheritedWidget、Provider原理解析
android·flutter·ios
BoomHe17 小时前
车载应用配置系统签名
android·android studio
路人甲ing..19 小时前
用 Android Studio 自带的模拟 Android Emulator 调试
android·java·ide·ubuntu·kotlin·android studio
路人甲ing..19 小时前
Android Studio 模拟器报错 The emulator process for AVD xxxxx has terminated.
android·java·ide·kotlin·android studio
弥巷20 小时前
【Android】 View事件分发机制源码分析
android·java
wanna21 小时前
安卓自学小笔记第一弹
android·笔记
Kapaseker21 小时前
五分钟实战 Compose 展开/收起动画
android·kotlin