深入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线程执行完毕,才会继续执行下去。
相关推荐
Jackilina_Stone8 小时前
【faiss】用于高效相似性搜索和聚类的C++库 | 源码详解与编译安装
android·linux·c++·编译·faiss
棒棒AIT8 小时前
mac 苹果电脑 Intel 芯片(Mac X86) 安卓虚拟机 Android模拟器 的救命稻草(下载安装指南)
android·游戏·macos·安卓·mac
fishwheel9 小时前
Android:Reverse 实战 part 2 番外 IDA python
android·python·安全
消失的旧时光-194311 小时前
Android网络框架封装 ---> Retrofit + OkHttp + 协程 + LiveData + 断点续传 + 多线程下载 + 进度框交互
android·网络·retrofit
zcychong12 小时前
Handler(二):Java层源码分析
android
Chef_Chen14 小时前
从0开始学习R语言--Day58--竞争风险模型
android·开发语言·kotlin
用户20187928316714 小时前
演员的智能衣橱系统之Selector选择器
android
CYRUS_STUDIO14 小时前
OLLVM 混淆 + VMP 壳照样破!绕过加壳 SDK 的核心检测逻辑
android·逆向·汇编语言
Kapaseker15 小时前
憋了一周了,12000字深入浅出Android的Context机制
android