读书人

Android中单APK运用多进程

发布时间: 2012-09-07 10:38:15 作者: rapoo

Android中单APK应用多进程

本人博客原文

Android中,默认一个APK包就对应一个进程,其进程名就为AndroidManifest.xml文件中 指定的package名。我们可以通过Activity, Service, BroadCastReceiver, ContentProvider的android:process属性来实现单APK多进程

但是需要注意进程间内存的不可见性。实例1文件1 MainActivity.java

package...;import..Bundle;import..Activity;import..Intent;import..Log;import..Menu;import..MenuItem;import....NavUtils;publicclassMainActivityextendsActivity{staticboolean=false;finalstaticString="robin";@Overridepublicvoid(Bundle){super.();(..);=true;Log.(,"on create() in MainActivity");this.(newIntent(this,MyService.class));}}

文件2 MyService.java

package...;import..Service;import..Intent;import..IBinder;import..Log;publicclassMyServiceextendsService{String="robin";@Overridepublicvoid(){Log.(,"MyService is oncreate");}@Overridepublicint(Intent,int,int){Log.(,"MainActivity is created: "+MainActivity.);return;}@Overridepublicvoid(){Log.(,"OnDestory");}@OverridepublicIBinder(Intent){returnnull;}}

文件3 layout\activity_main.xml

<RelativeLayoutxmlns: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>

文件4 AndroidManifest.xml

<manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.lenovo.robin.test"android:versionCode="1"android:versionName="1.0"><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="15"/><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme"><activityandroid:name=".MainActivity"android:label="@string/title_activity_main"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity><serviceandroid:name=".MyService"android:label="@string/title_activity_main"></service></application></manifest>

文件5 values\strings.xml

<resources><stringname="app_name"></string><stringname="hello_world"></string><stringname="menu_settings"></string><stringname="title_activity_main"></string></resources>

运行该应用程序DDMS截图显示的进程如下:Android中单APK运用多进程 运行打印出的日志如下:08-12 21:55:32.365: I/robin(25964): on create() in MainActivity08-12 21:55:32.435: I/robin(25964): MyService is oncreate08-12 21:55:32.435: I/robin(25964): MainActivity is created: true我们对AndroidManifest.xml文件进行修改,以实现当APK应用多进程。修改后的AndroidManifest.xml文件如下

<manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.lenovo.robin.test"android:versionCode="1"android:versionName="1.0"><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="15"/><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme"><activityandroid:name=".MainActivity"android:label="@string/title_activity_main"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity><serviceandroid:name=".MyService"android:label="@string/title_activity_main"android:process="com.lenove.robin.test.service"></service></application></manifest>

DDMS截图显示的进程如下:Android中单APK运用多进程 运行打印出的日志如下:08-11 06:58:56.917: I/robin(10561): on create() in MainActivity08-11 06:58:57.037: I/robin(10572): MyService is oncreate08-11 06:58:57.037: I/robin(10572): MainActivity is created: false虽然我们在MainActivity的onCreate中把iscreated变量设置为了true,因为进程间内存的不可见性,,所以才会打印日志“MainActivity is created: false”。简单点说就是每个进程都是运行在不同的虚拟机上,对于不同的进程,他们载入的Class文件虽然名字一样(比如都是com.lenovo.robin.test.MainActivity),但是他们其实是加载到了不同的内存地址空间。com.lenovo.robin.test.MainActivity中把iscreated变量设置为true,它其实只是把当前进程(com.lenovo.robin.test)的MainActivity类的iscreated变量的设置为了true,com.lenove.robin.test.service进程中的 com.lenovo.robin.test.MainActivity 类和它位于不同的内存地址空间,当然其变量iscreated也位于不同的内存地址空间,自然也不受影响。

读书人网 >Android

热点推荐