现在的位置: 首页 > 综合 > 正文

Android 组件复用和进程关系

2013年01月10日 ⁄ 综合 ⁄ 共 4348字 ⁄ 字号 评论关闭

一:跨进程调用Activity

案例设计, 设计两个Application, 第一个Application1将调用第二个Application中的Activity2, 同时第二个Application2会调用自身的Activity2. 以此判断进程ID来观察进程的存在情况, 详细说明和代码如下:

Application1: ClientApk 这个程序有一个ClientMainActivity会发起对应用二的一个Activity(名称为ServerActivity)的调用, ClientMainActivity启动时, 将进程的id打印出来.

注意ComponentName前面的是包名, 后面的是Activity的ClassPath

[java] view
plain
copy

  1. public class ClientMainActivity extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.         TextView tv = (TextView)findViewById(R.id.ClientTV);  
  8.         ClickAction l = new ClickAction();  
  9.         tv.setOnClickListener(l);  
  10.         int myProcessID = Process.myPid();  
  11.         //打印当前进程的ID  
  12.         Log.i("---ClientMainActivity----", myProcessID + "");  
  13.     }  
  14.       
  15.     class ClickAction implements OnClickListener{  
  16.         public void onClick(View v) {  
  17.             Intent intent = new Intent("com.ostrichmyself.tiantian");  
  18.             //ComponetName不描述清楚的话, 就无法正确的找到ServerActivity, 但系统提供的Activity,如main都可以为什么?  
  19.              final ComponentName cn = new ComponentName("com.ostrichmyself","com.ostrichmyself.ServerActivity");  
  20.              intent.setComponent(cn);  
  21.              startActivity(intent);  
  22.               
  23.         }  
  24.           
  25.     }  
  26. }  

 

 

Application2: ServerApk 这个程序有两个Activity, 其一为ServerMainActivity, 其二为ServerActivity, 点击ServerMainActivity, 会对ServerActivity进行调用.  ServerActivity 即被调用, 这两个Activity启动的时候, 进程号也会打印出来.

[java] view
plain
copy

  1. package com.ostrichmyself;  
  2. import android.app.Activity;  
  3. import android.content.ComponentName;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.os.Process;  
  7. import android.util.Log;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.widget.TextView;  
  11. public class ServerMainActivity extends Activity {  
  12.     /** Called when the activity is first created. */  
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.main);  
  17.         TextView tv = (TextView)findViewById(R.id.mainTV);  
  18.         ClickAction l = new ClickAction();  
  19.         tv.setOnClickListener(l);  
  20.         int myProcessID = Process.myPid();  
  21.         Log.i("---ServerMainActivity----", myProcessID + "");  
  22.     }  
  23.       
  24.     class ClickAction implements OnClickListener{  
  25.         public void onClick(View v) {  
  26.             Intent intent = new Intent("com.ostrichmyself.tiantian");  
  27.              final ComponentName cn = new ComponentName("com.ostrichmyself","com.ostrichmyself.ServerActivity");  
  28.              intent.setComponent(cn);  
  29.              startActivity(intent);  
  30.               
  31.         }  
  32.           
  33.     }  
  34. }  


[java] view
plain
copy

  1. package com.ostrichmyself;  
  2. import android.app.Activity;  
  3. import android.os.Process;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6. /** 
  7.  * 这个将被自身和外部调用 
  8.  */  
  9. public class ServerActivity extends Activity {  
  10.       
  11.     @Override  
  12.     public void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.server_gui);  
  15.         int myProcessID = Process.myPid();  
  16.         Log.i("---ServerActivity----", myProcessID + "");  
  17.     }  
  18. }  

下面有三个有意思的过程:

三个试验:

 

试验一:

1. 模拟器关闭

2. 启动ServerAPK 发现MainServerActivity所在的进程为193

3. 触发MainServerActivity的Text让ServerActivity启动, 发现ServerActivity的进程号为193

4. 启动ClientAPK, 发现MainClientActivity所在的进程号为250

5. 触发MainClientActivity的Text让ServerActivity再次启动, 发现进程号为:193

 

结论: 如果Activity已经启动, 第三方调用公用的Activity, 将在已经启动的Activity进程中调用

 

实验二:

继续上面的试验:

1. 按返回键, 分别退出两个APK

2. 启动ClientAPK, 发现进程号为250

3. 触发MainClientActivity的Text让ServerActivity再次启动, 发现进程号为:193

4. 长按住Home健, 触发MainServerActivity的Text让ServerActivity启动, 发现ServerActivity的进程号为193

5. 触发MainServerActivity的Text让ServerActivity启动, 发现ServerActivity的进程号为193

 

结论: 进程没有销毁, 都在后台运行着


试验三:

1. 模拟器关闭

2. 启动ClientAPK, 发现MainClientActivity所在的进程号为214

3. 触发MainClientActivity的Text让ServerActivity启动, 发现进程号为:232

4. 启动ServerAPK 发现MainServerActivity所在的进程为258

5. 触发MainServerActivity的Text让ServerActivity启动, 发现ServerActivity的进程号为258

6. 长按住Home健启动ClientAPK

7. 触发MainClientActivity的Text让ServerActivity启动, 发现进程号为:258

 

 

结论:

1. 调用对方的公有Activity组件, 如果对方还没有启动, 则重新开一个进程将公有Activity组件启动起来

2. 公有Activity组件所在的应用程序启动时, 会重新将公有Activity组将放在自己应用程序的进程中, 并将1中新开启的进程销毁

3. 后面将一直在公有Activity组件所在应用程序的进程中,启动公有Activity组件。

点击此处:源码下载

二: 跨进程调用Service

抱歉!评论已关闭.