Android平台支持多进程通信,也支持应用内实现多进程,Android中,默认一个APK包就对应一个进程,其进程名就为AndroidManifest.xml文件中 指定的package名。我们可以通过Activity,Service,BroadCastReceiver,ContentProvider的android:process属性来实现单APK多进程,但是需要注意进程间内存的不可见性。

我们都知道,android平台对应用都有内存限制,其实这个理解有点问题,应该是说android平台对每个进程有内存限制,比如某机型对对进程限制是24m,如果应用有两个进程,则该应该的总内存限制是2*24m。使用多进程就可以使得我们一个apk所使用的内存限制加大几倍。
所以可以借此突破对应用的内存限制,比如一些要对图片、视频、大文件进程处理的好内存的应用可以考虑用多进程来解决应用操作不流畅问题。

实现多进程可以通过设置service、broadcast、activity的标签android:process来实现。
一般情况下启动这些组件默认是在同一个进程里运行的,如果设置了android:process标签,则会运行在其他进程里。
如果android:process的value不是":"开头,则系统里有同样名字的进程的话,会放到已存在的同名进程里运行,这样能减小消耗。
如果android:process的value是以":"开头,则启动一个名字为value的进程。

实现应用多进程之后,就是进程间通信啦,进程间通信有两种实现方式:
1、用系统框架实现:系统框架实现进程通信有用过Service,Broadcast,Activity,ContentProvider。
2、自己实现AIDL。

Android使用多进程实例:

MainActivity.java

package com.haier.oet.androidplayerground;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;public class MainActivity2 extends Activity {static boolean iscreated=false;final static String TAG="ysm";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);iscreated=true;Log.i(TAG,"on create() in MainActivity");this.startService(new Intent(this,MyService.class));}
}

MyService.java

package com.haier.oet.androidplayerground;
/*** Created by oet on 16/4/13.*/
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;public class MyService extends Service {String tag="ysm";@Overridepublic void onCreate() {Log.i(tag,"MyService is oncreate");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i(tag, "MainActivity is created: " + MainActivity2.iscreated);return START_STICKY;}@Overridepublic void onDestroy() {Log.i(tag,"OnDestory");}@Overridepublic IBinder onBind(Intent arg0) {return null;}
}

layout\activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:text="@string/hello_world"tools:context=".MainActivity" /></RelativeLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.haier.oet.androidplayerground"xmlns:android="http://schemas.android.com/apk/res/android"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activityandroid:name=".MainActivity"android:label="@string/app_name"android:theme="@style/AppTheme.NoActionBar"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity><serviceandroid:name=".MyService"android:label="@string/title_activity_main"android:process="com.haier.ysm.test.service"></service></application>
</manifest>

values\strings.xml

<resources><string name="app_name">Test</string><string name="hello_world">Hello world!</string><string name="menu_settings">Settings</string><string name="title_activity_main">MainActivity</string>
</resources>

运行该应用程序
DDMS截图显示的进程如下:

运行打印出的日志如下:

04-13 15:07:32.811 10762-10762/com.haier.oet.androidplayerground I/robin: on create() in MainActivity
04-13 15:07:32.831 10762-10762/com.haier.oet.androidplayerground I/robin: MyService is oncreate
04-13 15:07:32.831 10762-10762/com.haier.oet.androidplayerground I/robin: MainActivity is created: true

我们对AndroidManifest.xml文件进行修改,以实现当APK应用多进程。
修改后的AndroidManifest.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.haier.oet.androidplayerground"xmlns:android="http://schemas.android.com/apk/res/android"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activityandroid:name=".MainActivity2"android:label="@string/app_name"android:theme="@style/AppTheme.NoActionBar"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity><serviceandroid:name=".MyService"android:label="@string/title_activity_main"android:process="com.haier.ysm.test.service"></service></application>
</manifest>

DDMS截图显示的进程如下:

运行打印出的日志如下:

04-13 15:13:48.161 18420-18420/? I/ysm: on create() in MainActivity
04-13 15:13:48.242 18435-18435/? I/ysm: MyService is oncreate
04-13 15:13:48.242 18435-18435/? I/ysm: MainActivity is created: false

虽然我们在MainActivity的onCreate中把iscreated变量设置为了true,因为进程间内存的不可见性,,所以才会打印日志“MainActivity is created: false”。
简单点说就是每个进程都是运行在不同的虚拟机上,对于不同的进程,他们载入的Class文件虽然名字一样(比如都是com.haier.oet.androidplayerground.MainActivity),但是他们其实是加载到了不同的内存地址空间。
com.haier.oet.androidplayerground.MainActivity中把iscreated变量设置为true,它其实只是把当前进程(com.haier.oet.androidplayerground.test)的MainActivity类的iscreated变量的设置为了true,
com.haier.oet.androidplayerground.service进程中的 com.haier.oet.androidplayerground.MainActivity 类和它位于不同的内存地址空间,当然其变量iscreated也位于不同的内存地址空间,自然也不受影响。

Android 应用内多进程实现 单APK应用多进程相关推荐

  1. Android应用内多进程分析和研究

    正常情况下,一个apk启动后只会运行在一个进程中,其进程名为AndroidManifest.xml文件中指定的应用包名,所有的基本组件都会在这个进程中运行.但是如果需要将某些组件(如Service.A ...

  2. Android应用内安装apk包

    Android应用内安装 public static void installApk(Activity context, String filePath, int requestCode) {Log. ...

  3. Android 12 内置APK mismatch in the <uses-library> tags

    Android系统源码开发系列教学视频链接: Android 10.0 AOSP源码编译: AOSP源码开发环境搭建教学视频-百问100ask Android系统 10.0 AOSP源码编译--CSD ...

  4. android悬浮动态权限,android应用内悬浮窗-自动贴边,不需要权限!

    简单基于注释的API来处理运行时6.0权限配置 热门度(没变化) 10.0/10 (没变化) ">10.0 活跃度(没变化) 0.8/10 (没变化) ">0.8 Wa ...

  5. 如何在Android模拟器上安装和卸载APK程序包

    如何在Android模拟器上安装和卸载APK程序包 Android, 程序包, APK, 卸载, 模拟 一,安装APK          安装APK当然首先是要有模拟器,和要安装的APK包,这个不多废 ...

  6. Android应用内社区SDK技术架构浅析

    Android应用内社区SDK技术架构浅析 图1为雪球财经自选界面,图2是雪球财经App内的社区,也就是动态页面. 一.以友盟微社区为例 简单来说,友盟的微社区就是一款帮助开发者在应用中快速搭建一个社 ...

  7. android应用市场点击下载APK安装详解

    Android系统启动篇 1,<android系统启动流程简介> 2,<android init进程启动流程> 3,<android zygote进程启动流程> 4 ...

  8. 三步实现Android应用内一键换肤,无需重启应用,无需编写多余代码

    古人学问无遗力,少壮工夫老始成. 纸上得来终觉浅,绝知此事要躬行. --<冬夜读书示子聿> · 陆游 换肤效果演示 四种皮肤切换:默认白色.蓝色.绿色和玫瑰红: 前言 先给大家介绍一下现在 ...

  9. Android应用内打开.docx/.pdf/.xlsx/.txt等文档——腾讯TBS

                                   Android应用内打开.docx/.pdf/.xlsx/.txt等文档-腾讯TBS 1.功能借鉴:https://blog.csdn.n ...

最新文章

  1. matlab心电图诊断系统,ECG-diag MATLAB心电图自动诊断程序 联合开发网 - pudn.com
  2. oracle 全局临时变量,如何解析Oracle PL / SQL中的简单XML片段并将其加载到全局临时表中?...
  3. Git学习系列(二)创建本地仓库及文件操作
  4. CSS之transition, transform, tanslate,animation
  5. apollo 配置中心_apollo-1:apollo配置中心单机模拟分布式部署
  6. 自动驾驶汽车定位技术
  7. SQL2000 MD5加密
  8. python爬取京东评论_Python如何爬取京东的评价信息
  9. Android设置Alpha值实现图片渐变效果
  10. 我为什么用 SQLite 和 FMDB 而不用 Core Data
  11. node repl环境
  12. 信捷XD5程序+TG765触摸屏程序,功能为XY双轴排版机
  13. Linux C/C++编程之(十四)文件操作相关函数
  14. gomonkey permission denied
  15. 老友记台词笔记S0101-ijk英语
  16. Class not found: “xxx.xxx.xxx“报错
  17. 又酸啦!华为「天才少年」校招薪资曝光....
  18. 【C++项目】2048益智小游戏
  19. matlab三大重要数组之胞元数组
  20. 推荐和讯网改革开放三十年系列文章

热门文章

  1. Android Toast源码分析
  2. 【JavaSE】Java中的异常那些事儿
  3. 计算机网络选择填空题
  4. 中国移动如何才能“不作恶”
  5. 计算机软件职称聘用,关于做好2017年“以聘代评”系列职称聘任工作的通知
  6. 海康、大华IpCamera摄像机 RTSP地址和格式
  7. 下列( )类型不是mysql中的数据类型_下列( )类型不是MySQL中常用的的数据类型。_学小易找答案...
  8. ASEMI整流桥KBU610和KBP210封装参数区别
  9. 把彩色图片变成适合素描的黑白图片
  10. ETU-LINK 400G DAC 高速线缆 你get了吗?