通常情况下,Android APP 运行在一个进程中,所有组件共享进程中的数据。但有时候我们希望某些组件在自己独立的进程中运行,一般情况下 service
会这样用,而 activity
,receiver
,provider
组件也能做这样的设置
Android APP 多进程
新建一个 Android application 工程,添加一个 Activity 和一个 Service,将 Service 设置为在另一个进程中运行只需要在清单文件中添加属性 android:process
<service android:name=".MainService"
android:process=":remote"/>
注意,这里的命名是有规定的,随意命名的话在安装 APK 时会报错:The application could not be installed: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
命名规则:
-
私有进程,需要以冒号开头,如
:remote
这种进程不允许其他组件也跑在其中,其进程名为
packageName:remote
, 比如:com.example.test.remote -
公有进程,命名中需要至少包含一个
.
,如:com.test
这种进程允许其他应用通过设置一个相同的
sharedUID
,可以跑在其中
一般来说,一个应用中的不同组件设置为多进程是为了满足下列场景:
- 减少单个进程的内存占用,避免 OOM,以及资源占用过多时被系统 Kill 掉
- 避免某个组件崩溃时引发应用的退出
- 实现守护进程,用来做应用保活或者主进程故障监控
Android APP 多线程
我们知道 Android 应用中存在一个主线程概念,也叫做 UI 线程
,所有的 UI 绘制都只能在其中完成,这是因为.android.widget
包并非线程安全的,在单独开启的子线程中做绘制 UI 的操作会引起问题,因此系统禁止在非 UI 线程中做 UI 操作
那么我们就需要从其他线程访问 UI 线程,才能完成 UI 相关操作,通过以下几种方式:
- Activity.runOnUiThread(Runnable)
- View.post(Runnable)
- View.postDelayed(Runnable, long)
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
textView.post(new Runnable() {
public void run() {
textView.setText("");
}
});
}
}).start();
}
简单的 UI 处理可以用上述提到的方法,如果是复杂的场景,推荐的还是使用线程间通信方式 Handler
或者 AsyncTask
来完成,这样可以将相关内容放到一起处理,代码更清晰