当一个Application启动时,如果该application此时没有其他Component在运行,Android System此时会为该application启动一个新的进程。 默认情况下,一个application中所有组件都运行在同一个进程和线程(主线程)中。 如果一个application启动时,该application已经有一个进程(已经有组件启动了),那么新启动的组件将会在已有进程中执行。你可以手动安排应用中不用组件运行在不同的进程中,也可以为任意进程增加线程。
默认情况下,一个application钟的所有Component都运行在同一个进程中,并且大多数application并没有必要去修改这点。但是,你也可以在manifest文件中定义哪些组件运行在哪个进程中。
android:process
manifest文件中,每种Component(activity,service,receiver,provider)中都支持 android:process 属性,该属性可以明确指出这个Component应该运行在哪个process中。利用这个属性,可以设置某个Component自己单独运行在一个进程中,也可以设置某些Component共享一个进程。还可以利用该属性设置不同Application的Components运行在同一个进程中(只要这两个应用使用相同的Linus user ID and are signed with the same certificates)
在内存容许的情况下,android系统会尽可能的保持进程不销毁。根据进程中Component的运行状态,android system判断process的重要程度。
Service process:服务进程:
A process that is running a service that has been started with the startService() method and doesn't fall into either of the two higher categories.
Background process
A process holding an activity that's not currently visible to the user.
一般会有很多背景进程,保存在一个LRU队列中
Empty process:
A process that doesn't hold any active application components.保存空进程是为了提高新进程的启动速度。
When an application is launched, the system creates a thread of execution for the application, call "main".
一个process中所有Component均运行在一个UI线程中(一个Application可能有多个进程)。System callback(例如 onKeyDown, onCreate , onDestroy 均运行在UI线程中)。Android UI 线程不是线程安全的,所以,所有对UI的操作都应该在UI线程中完成(而不应该从另一个线程中去更改UI)
Two rules to Android's single thread model:
Android offers several ways to access the UI thread from other threads:
AsyncTask: It performs the blocking operations in a worker thread and then publishes the results on the UI thread, without requiring you to handle threads or handlers yourself.
ContentProvider: 中的query(), insert(), delete(), update(), getType()可能被很多应用同时访问,因此它们必须是线程安全的方法,执行在ContentProvider所在进程的一个线程池中。