`
功夫小当家
  • 浏览: 186798 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用Intent方式跨进程访问

阅读更多

       最近做了个小demo,需要在demo中访问其他apk中的信息。 网上版本很多,有用的很少。经过反复查阅和试验,总结了几种方法。

  (1)demo很简单,页面上只有一个按钮,点击按钮可以访问其他apk中相应的activity。Demo的主要代码

           如下:

package com.example.demo;

import com.example.demo.R;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		
		Button button1 = (Button) findViewById(R.id.button1);
		button1.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				method1();
			}
		});
		return true;
	}

	/*
	 * 1.利用compnent方式访问其他apk的(主activity),无需设置androidmanifest.xml
	 */
	public void method1() {

		// 这些代码是启动另外的一个应用程序的主Activity
		ComponentName componetName = new ComponentName(
		        // 这个是另外一个应用程序的包名 ,androidmanifest.xml中的package值!!!
				"com.amaker.test",
				// 这个参数是要启动的Activity (主activity)
				"com.amaker.test.MainActivity");
		
		try {
			Intent intent = new Intent();
			intent.setComponent(componetName);
			startActivity(intent);
		} catch (Exception e) {
			Toast.makeText(getApplicationContext(),"没有找到应用程序!!!", 0).show();
		}
	}

	/*
	 * 2.利用compnent方式访问其他apk的(非主activity),需要设置androidmanifest。xml中非主activity的exported属性,具体如下:
	 *   被访问的activity是"com.amaker.ch03.drawable.TestBitmapActivity" 则需要设置的是:<activity android:name="com.amaker.ch03.drawable.TestBitmapActivity"  android:exported="true"/>
	 */
	public void method2() {
		Intent intent = new Intent();
		intent.setComponent(new ComponentName("com.amaker.test","com.amaker.ch03.drawable.TestBitmapActivity"));
				//"com.amaker.ch03.string.TestStringActivity"));
		//intent.setAction("android.intent.action.VIEW");
		startActivity(intent);
	}

	/*
	 * 3.设置androidmanifest.xml访问其他apk的(非主activity)
	 * 注意:使用这种方式的时候需要在被调用的apk的androidmanifest.xml里做如下设置(访问非主activity) <activity
	 * android:name="com.amaker.ch03.xml.TestXmlActivity"> <intent-filter>
	 * <action android:name="android.intent.action.xml" /> <data
	 * android:scheme="info" /> <category
	 * android:name="android.intent.category.DEFAULT" /> </intent-filter>
	 * </activity>
	 */
	public void method3() {
		Intent intent = new Intent("android.intent.action.xml",
				Uri.parse("info://调用其他应用程序的Activity"));
		startActivity(intent);
	}
}

  (2)被调用的工程的名字是:Chapter03_Resource.
           这个android小工程,之所以可以被Demo调用,是因为AndroidManifest.xml被做了修改。具体代码如 

          下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.amaker.test"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <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="com.amaker.ch03.color.TestColorActivity">
           <action android:name="android.intent.action.color" />
           <category android:name="android.intent.category.DEFAULT" />
        </activity>  
        
        <activity android:name="com.amaker.ch03.string.TestStringActivity" android:exported="true"/>
        
        <activity android:name="com.amaker.ch03.dimen.TestDimensionActivity"/>
        
        
		<activity android:name="com.amaker.ch03.xml.TestXmlActivity">
		    <intent-filter>        
                <action android:name="android.intent.action.xml" />
                <data android:scheme="info" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
		</activity> 
		
	
		<activity android:name="com.amaker.ch03.drawable.TestBitmapActivity"  android:exported="true"/>	
		
		<activity android:name="com.amaker.ch03.layout.TestLayoutActivity"/>	
		<activity android:name="com.amaker.ch03.menu.TestMenuActivity"/>
    </application>
    <uses-sdk android:minSdkVersion="3" />

</manifest> 

   参照Demo中的注释即可理解。

 

  

 

 

 

 

 

分享到:
评论

相关推荐

    android中跨进程通讯的4种方式

    在Android系统中,由于安全性和资源隔离的考虑,不同应用程序之间的内存是不能直接共享的,因此需要通过特定的方式来实现跨进程通信(IPC, Inter-Process Communication)。Android SDK提供了四种主要的IPC机制,...

    跨进程访问Activity实例

    在Android开发中,跨进程访问Activity是一个相对复杂的主题,它涉及到Android系统对进程间通信(Inter-Process Communication, IPC)的支持。通常,Android中的每个应用都运行在一个独立的进程中,这意味着一个应用...

    Android-安卓跨进程跨app通信框架

    7. **自定义通道**:除了使用Android系统提供的组件外,框架还可能引入自定义的通道,如通过Socket或HTTP/HTTPS等方式实现跨进程通信,以满足更复杂的需求。 在"jarryleo-MagicMessenger-4900b5a"这个文件中,很...

    intent messenger aidl实现进程间通信.zip

    Intent还可以用来启动跨进程的BroadcastReceiver,使得不同进程能够接收和响应特定的广播事件。 2. **Messenger**: Messenger是一种轻量级的IPC方案,适用于服务和服务之间的通信。它基于Handler和Message机制,...

    跨进程通讯--访问其他应用程序的ActivityDemo

    ContentProvider是一种通用的跨进程数据共享方式,它可以暴露应用的数据供其他应用查询、修改。如果要访问其他应用的数据,可以通过ContentResolver来查询ContentProvider。 六、BroadcastReceiver ...

    android跨进程访问.pdf

    **Activity跨进程访问** Activity不仅可以在同一进程中调用,也可以实现跨进程调用。当在同一应用内启动Activity时,只需传入Context对象和Activity的Class对象。跨进程访问则不同,它需要一个特定的Action字符串来...

    跨进程访问 aidl 客户端示例

    本示例"跨进程访问 aidl 客户端示例"正是为了演示如何运用AIDL来实现这一功能。 首先,AIDL的基本概念是定义一个接口文件,这个接口文件包含了客户端和服务端需要共享的方法声明。这些方法声明遵循Java语法,但有...

    AIDL跨进程学习代码

    在Android系统中,应用程序默认是运行在各自的进程中,它们之间无法直接访问对方的数据或方法,如果需要进行数据交互或者调用服务,就需要一种机制来实现跨进程通信(IPC,Inter-Process Communication)。...

    跨进程访问 aidl,与 ch08_aidlclient 工程配合使用

    跨进程访问AIDL的优势在于其高效和安全。由于数据传递是通过系统底层的Binder机制,因此性能损失较小。同时,由于进程隔离,服务端的数据安全性和稳定性得到保障,不会因为客户端的异常而受到影响。 总结来说,AIDL...

    activity跨进程调用

    对于跨进程调用,通常会使用显式Intent,明确指定被调用Activity的ComponentName。 2. **Intent传值**: 在Intent中,我们可以使用putExtra()方法来添加额外的数据,这些数据可以是各种类型,如字符串、整数、布尔...

    042集-跨进程启动Activity和设置Activity多个入口

    在跨进程启动Activity时,需要借助Intent指定额外的FLAG_ACTIVITY_NEW_TASK标志,并通过startActivityForResult()或startActivity()方法启动。 其次,关于Activity的多个入口点,这意味着可以从不同的起点启动同一...

    android跨进程通信

    - 跨进程访问Activity则需指定一个Action字符串,它是目标Activity的标识。例如,拨打电话的Activity可以通过`Intent.ACTION_CALL`启动: ```java Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse...

    跨进程访问服务程序(AIDL)

    **跨进程访问服务程序(AIDL)** 在Android系统中,由于进程间的隔离性,不同应用之间不能直接访问对方的数据或方法。为了实现进程间通信(IPC,Inter-Process Communication),Android提供了一种称为AIDL...

    通过AIDLdemo掌握跨进程之间的通讯

    本教程将通过一个名为"AIDLdemo"的示例来深入解析如何利用AIDL进行跨进程通信。 首先,我们需要理解AIDL的基本概念。AIDL是一种接口定义语言,类似于Java中的接口,但它的目的是定义一个可以在不同进程间调用的方法...

    Anroid跨进程的IPC机制

    6. **Socket通信**:尽管在Android中不常用,但在某些场景下,如设备间通信,开发者可能会选择使用Socket实现跨进程通信。 7. **Parcelables与Bundles**:在Binder传输过程中,数据通常需要序列化。Parcelable接口...

    详解Android 进程间通信的几种实现方式

    Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的...

    android多进程通信二

    服务端实现接口,客户端通过Binder代理调用服务端的方法,从而实现跨进程的数据交换。 **2. ContentProvider** ContentProvider是Android四大组件之一,专门用于数据共享。通过实现ContentProvider,一个进程可以将...

    Android中进程之间通信的机制

    通过上述介绍可以看出,在Android中实现跨进程访问Activity以及数据的传递主要依赖于Intent及其相关的方法。无论是简单的数据传递还是复杂的双向通信,Intent都提供了灵活且强大的支持。理解这些机制对于构建复杂的...

Global site tag (gtag.js) - Google Analytics