- 一:跨进程调用Activity
- 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.ostrichmyself.ServerActivity"); intent.setComponent(cn); startActivity(intent);} }}
- 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 + ""); }}
- 点击此处:源码下载
- 二: 跨进程调用Service
一:跨进程调用Activity
案例设计, 设计两个Application, 第一个Application1将调用第二个Application中的Activity2, 同时第二个Application2会调用自身的Activity2. 以此判断进程ID来观察进程的存在情况, 详细说明和代码如下:
Application1: ClientApk 这个程序有一个ClientMainActivity会发起对应用二的一个Activity(名称为ServerActivity)的调用, ClientMainActivity启动时, 将进程的id打印出来.
注意ComponentName前面的是包名, 后面的是Activity的ClassPath
- 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.ostrichmyself.ServerActivity");
- intent.setComponent(cn);
- startActivity(intent);
- }
- }
- }
Application2: ServerApk 这个程序有两个Activity, 其一为ServerMainActivity, 其二为ServerActivity, 点击ServerMainActivity, 会对ServerActivity进行调用. ServerActivity 即被调用, 这两个Activity启动的时候, 进程号也会打印出来.
- 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.ostrichmyself.ServerActivity");
- intent.setComponent(cn);
- startActivity(intent);
-
- }
-
- }
- }
- 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.ostrichmyself.ServerActivity");
- intent.setComponent(cn);
- startActivity(intent);
- }
- }
- }
- 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 + "");
- }
- }
- 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 + "");
- }
- }
下面有三个有意思的过程:
三个试验:
试验一:
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组件。