Android的每一个应用程序(不考虑service),默认情况下,系统会为这个应用启动一个新的Linux进程,并且这个进程只有一个线程.即通常讲的UI主线程.当然,你完全可以安排不同的组件运行于不同的进程,并且你可以为任何程序创建另外的线程.
1、让我们来验证一下默认情况下,Android是不是只有个进程和一个主UI线程。新建一个工程,添加两个Activity页面,在每个Activity的onCreate中将当前的进程ID和线程ID打印出来
//Debug.print是我自己包装的日志打印方法,你可以直接用原生的android.util.Log Debug.print(TAG, "myPid=" + android.os.Process.myPid()); Debug.print(TAG, "myTid=" + android.os.Process.myTid());
当我们从一个页面跳转到另外一个页面时,发现两个页面输出的信息是一致的,这也就说明了他们共享一个进程和一个线程
MainActivity->onCreate()->18 myPid=17929 MainActivity->onCreate()->19 myTid=17929 FirstActivity->onCreate()->16 myPid=17929 FirstActivity->onCreate()->17 myTid=17929
2、当你在应用中使用了比如new Thread的时候,这个时候当然就会开启一个新的线程了,需要主要的是新开启的线程是不能直接操作主线程的空间的,比如不能直接访问UI控件,你可以通过Handler来实现间接访问。
3、默认情况下,android应用的进程名称为应用的包名,你可以自己指定进程的名字
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:process="com.newthreadname" android:theme="@style/AppTheme" >
在android手机应用管理器中去查看正在运行的程序,可以发现名字已经被更改过来了
4、我们还可以让两个Activity分别运行在不同的进程空间中.
<activity android:name=".MainActivity" android:label="@string/app_name" android:process="com.mainactivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".FirstActivity" android:process="com.firstactivity"/>
对应的输入日志
MainActivity->onCreate()->18 myPid=19056 MainActivity->onCreate()->19 myTid=19056 FirstActivity->onCreate()->16 myPid=19236 FirstActivity->onCreate()->17 myTid=19236
注意虽然两个Activity分别运行在不同的进程空间,但是并不会影响页面间通过Intent传递参数,Intent的传值方式操作系统层面已经实现了跨进程的访问。
5、默认情况下,service其实也是和应用运行同一个进程和同一个线程中. 看如下的配置
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:process="com.newprocessname" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".FirstActivity" /> <service android:name=".SampleService"> </service>
对应的日志输出
MainActivity->onCreate()->18 myPid=21366 MainActivity->onCreate()->19 myTid=21366 SampleService->onCreate()->35 myPid=21366 SampleService->onCreate()->36 myTid=21366
我们也可以让Service运行在不同的进程中,将android:process改个不一样的名字即可,一般情况下,我们都会讲service设置在一个不同的进程中.
<service android:name=".SampleService" android:process="com.service"> </service>
对应的日志输出
MainActivity->onCreate()->18 myPid=21506 MainActivity->onCreate()->19 myTid=21506 SampleService->onCreate()->35 myPid=21532 SampleService->onCreate()->36 myTid=21532
6、总结
之前对android进程和线程,特别是进程这块存在着一些误解,看来任何时候还是要自己亲自动手去验证,实践是检验真理的唯一标准