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进程和线程,特别是进程这块存在着一些误解,看来任何时候还是要自己亲自动手去验证,实践是检验真理的唯一标准

 

posted on 2013-12-31 16:46  梅义  阅读(392)  评论(0编辑  收藏  举报