Android App 多进程和多线程

通常情况下,Android APP 运行在一个进程中,所有组件共享进程中的数据。但有时候我们希望某些组件在自己独立的进程中运行,一般情况下 service 会这样用,而 activityreceiverprovider 组件也能做这样的设置

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 ,可以跑在其中

一般来说,一个应用中的不同组件设置为多进程是为了满足下列场景:

  1. 减少单个进程的内存占用,避免 OOM,以及资源占用过多时被系统 Kill 掉
  2. 避免某个组件崩溃时引发应用的退出
  3. 实现守护进程,用来做应用保活或者主进程故障监控
Android APP 多线程

我们知道 Android 应用中存在一个主线程概念,也叫做 UI 线程,所有的 UI 绘制都只能在其中完成,这是因为.android.widget 包并非线程安全的,在单独开启的子线程中做绘制 UI 的操作会引起问题,因此系统禁止在非 UI 线程中做 UI 操作

那么我们就需要从其他线程访问 UI 线程,才能完成 UI 相关操作,通过以下几种方式:

  1. Activity.runOnUiThread(Runnable)
  2. View.post(Runnable)
  3. 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 来完成,这样可以将相关内容放到一起处理,代码更清晰

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值