本文是关于 android 官网资料 “Processes and Threads” 的学些笔记。
对这篇文档的大概总结:
app第一次运行是os为其创建一个liunx进程。默认情况下一个app中的所有组件都运行在同一个进程和线程中。这几进程叫主进程也就是UI线程。app也可以自己增加进程和线程。
关于进程:
如果需要用户也可以在manifest中可以控制app或组件在那个进程中运行。
进程一般是一直在内存中运行的,只有当内存不够用时系统才会主动去kill进程。具体那个进程会背kill OS有自己的一套规则。规则的细节不在此详述,这些处理对用户来说都是透明的,即使被kill的进程,用户又去调用,系统也会恢复此进程。
关于线程:
app运作在一个主线程中,这个线程就是UI线程,关于UI的处理都要在这个线程中完成。并且这个线程不能被阻塞。根据android的设计理念,这个线程执行一定好流畅,如果5s内不能对用户的动作做出反映,就是有异常提示。所以在codeing时要不费时间的操作都放到其他的线程中执行(可以把这种线程叫worker 线程)。对于多线程操作android也提供了很多的api包括:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
用户只需要实现具体事物处理部分就ok,进程通讯和交互的部分android已经做好了。安它的套路出牌就行了。
另外该文档还讲了 线程安全 和 进程通讯 的问题。
重要的句子摘录和自己的理解批注,
1. By default, all components of the same application run in the same process and thread (called the "main" thread).
默认情况下app(作为一个Linux用户的)运行在一个进程一线程中。
2. The system does not create a separate thread for each instance of a component. All components that run in the same process are instantiated in the UI thread, and system calls to each component are dispatched from that thread.
系统没有给每个组件建立一个进程。所有运行在同一个进程中的组件,都是在ui线程中被实例化的,同时系统通过ui线程来调用组件。
3.Additionally, the Andoid UI toolkit is not thread-safe. So, you must not manipulate your UI from a worker thread—you must do all manipulation to your user interface from the UI thread. Thus, there are simply two rules to Android's single thread model:
Do not block the UI thread
Do not access the Android UI toolkit from outside the UI thread
另外,android 的ui工具包不是线程级安全的。因此不能在工作进程中处理UI,所有的用户界面的操作都必须在UI线程中进行。因此,对于android的单进程模式,有两个原则:
不能阻塞UI线程
除UI线程外其他线程不能调用android UI 工具包。
Interprocess Communication
进程间通讯
Android offers a mechanism for interprocess communication (IPC) using remote procedure calls (RPCs), in which a method is called by an activity or other application component, but executed remotely (in another process), with any result returned back to the caller. This entails decomposing a method call and its data to a level the operating system can understand, transmitting it from the local process and address space to the remote process and address space, then reassembling and reenacting the call there. Return values are then transmitted in the opposite direction. Android provides all the code to perform these IPC transactions, so you can focus on defining and implementing the RPC programming interface.
android采用的进程间通讯机制是:在另一进程中执行调用,一个activity或者一个组件调用一个方法,这个方法在另外一个进程中执行后将结果返回本调用者。这就要求“方法(method)”和“数据(data)”分离到OS可以理解的水平。在”方法“被调用时,OS在本地进程空间和worok进程空间之间传输数据,然后重载,执行,再把执行结果传回去。android提供了完整的IPC处理的代码,所以用户主要是实现具体的work进程处理。