本人博客原文
Android中,默认一个APK包就对应一个进程,其进程名就为AndroidManifest.xml文件中 指定的package名。我们可以通过Activity, Service, BroadCastReceiver, ContentProvider的android:process属性来实现单APK多进程
但是需要注意进程间内存的
不可见性
。
实例1
文件1
MainActivity.java
package com . lenovo . robin . test ;import android . os . Bundle ;import android . app . Activity ;import android . content . Intent ;import android . util . Log ;import android . view . Menu ;import android . view . MenuItem ;import android . support . v4 . app . NavUtils ;public class MainActivity extends Activity {static boolean iscreated = false ;final static String TAG = "robin" ;@Overridepublic void onCreate ( Bundle savedInstanceState ) {super . onCreate ( savedInstanceState );setContentView ( R . layout . activity_main );iscreated = true ;Log . i ( TAG , "on create() in MainActivity" );this . startService ( new Intent ( this , MyService . class ));}}
文件2
MyService.java
package com . lenovo . robin . test ;import android . app . Service ;import android . content . Intent ;import android . os . IBinder ;import android . util . Log ;public class MyService extends Service {String tag = "robin" ;@Overridepublic void onCreate () {Log . i ( tag , "MyService is oncreate" );}@Overridepublic int onStartCommand ( Intent intent , int flags , int startId ) {Log . i ( tag , "MainActivity is created: " + MainActivity . iscreated );return START_STICKY ;}@Overridepublic void onDestroy () {Log . i ( tag , "OnDestory" );}@Overridepublic IBinder onBind ( Intent arg0 ) {return null ;}}
文件
3 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>
文件4
AndroidManifest.xml
<manifest xmlns: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><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" ></service></application></manifest>
文件5
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截图显示的进程如下:
运行打印出的日志如下:
08-12 21:55:32.365: I/robin(25964): on create() in MainActivity
08-12 21:55:32.435: I/robin(25964): MyService is oncreate
08-12 21:55:32.435: I/robin(25964): MainActivity is created: true
我们对
AndroidManifest.xml文件进行修改,以实现当APK应用多进程。
修改后的
AndroidManifest.xml文件如下
<manifest xmlns: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><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.lenove.robin.test.service" ></service></application></manifest>
DDMS截图显示的进程如下:
运行打印出的日志如下:
08-11 06:58:56.917: I/robin(10561): on create() in MainActivity
08-11 06:58:57.037: I/robin(10572): MyService is oncreate
08-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也位于不同的内存地址空间,自然也不受影响。