Android 组件复用和进程关系

  案例设计如下:
  应用一: ClientApk 这个程序有一个ClientMainActivity会发起对应用二的一个Activity(名称为ServerActivity)的调用, ClientMainActivity启动时, 将进程的id打印出来 public class ClientMainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = (TextView)findViewById(R.id.ClientTV); ClickAction l = new ClickAction(); tv.setOnClickListener(l); int myProcessID = Process.myPid(); //打印当前进程的ID Log.i("---ClientMainActivity----", myProcessID + ""); } class ClickAction implements OnClickListener{ public void onClick(View v) { Intent intent = new Intent("com.ostrichmyself.tiantian"); //ComponetName不描述清楚的话, 就无法正确的找到ServerActivity, 但系统提供的Activity,如main都可以为什么? final ComponentName cn = new ComponentName("com.ostrichmyself","com.ostrichmyse lf.ServerActivity"); intent.setComponent(cn); startActivity(intent); } } } 应用二: ServerApk 这个程序有两个Activity, 其一为ServerMainActivity, 其二为ServerActivity, 点击ServerMainActivity, 会对ServerActivity进行调用. ServerActivity 即被调用, 这两个Activity启动的时候, 进程号也会打印出来. [b]package com.ostrichmyself; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; import android.os.Process; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; public class ServerMainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = (TextView)findViewById(R.id.mainTV); ClickAction l = new ClickAction(); tv.setOnClickListener(l); int myProcessID = Process.myPid(); Log.i("---ServerMainActivity----", myProcessID + ""); } class ClickAction implements OnClickListener{ public void onClick(View v) { Intent intent = new Intent("com.ostrichmyself.tiantian"); final ComponentName cn = new ComponentName("com.ostrichmyself","com.ostrichmyse lf.ServerActivity"); intent.setComponent(cn); startActivity(intent); } } } [/b]
  [b]package com.ostrichmyself; import android.app.Activity; import android.os.Process; import android.os.Bundle; import android.util.Log; /** * 这个将被自身和外部调用 */ public class ServerActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.server_gui); int myProcessID = Process.myPid(); Log.i("---ServerActivity----", myProcessID + ""); } } [/b]
  下面有三个有意思的过程:
  三个试验:
  试验一:
  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组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值