最近做了个小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系统中,由于安全性和资源隔离的考虑,不同应用程序之间的内存是不能直接共享的,因此需要通过特定的方式来实现跨进程通信(IPC, Inter-Process Communication)。Android SDK提供了四种主要的IPC机制,...
在Android开发中,跨进程访问Activity是一个相对复杂的主题,它涉及到Android系统对进程间通信(Inter-Process Communication, IPC)的支持。通常,Android中的每个应用都运行在一个独立的进程中,这意味着一个应用...
7. **自定义通道**:除了使用Android系统提供的组件外,框架还可能引入自定义的通道,如通过Socket或HTTP/HTTPS等方式实现跨进程通信,以满足更复杂的需求。 在"jarryleo-MagicMessenger-4900b5a"这个文件中,很...
Intent还可以用来启动跨进程的BroadcastReceiver,使得不同进程能够接收和响应特定的广播事件。 2. **Messenger**: Messenger是一种轻量级的IPC方案,适用于服务和服务之间的通信。它基于Handler和Message机制,...
ContentProvider是一种通用的跨进程数据共享方式,它可以暴露应用的数据供其他应用查询、修改。如果要访问其他应用的数据,可以通过ContentResolver来查询ContentProvider。 六、BroadcastReceiver ...
**Activity跨进程访问** Activity不仅可以在同一进程中调用,也可以实现跨进程调用。当在同一应用内启动Activity时,只需传入Context对象和Activity的Class对象。跨进程访问则不同,它需要一个特定的Action字符串来...
本示例"跨进程访问 aidl 客户端示例"正是为了演示如何运用AIDL来实现这一功能。 首先,AIDL的基本概念是定义一个接口文件,这个接口文件包含了客户端和服务端需要共享的方法声明。这些方法声明遵循Java语法,但有...
在Android系统中,应用程序默认是运行在各自的进程中,它们之间无法直接访问对方的数据或方法,如果需要进行数据交互或者调用服务,就需要一种机制来实现跨进程通信(IPC,Inter-Process Communication)。...
跨进程访问AIDL的优势在于其高效和安全。由于数据传递是通过系统底层的Binder机制,因此性能损失较小。同时,由于进程隔离,服务端的数据安全性和稳定性得到保障,不会因为客户端的异常而受到影响。 总结来说,AIDL...
对于跨进程调用,通常会使用显式Intent,明确指定被调用Activity的ComponentName。 2. **Intent传值**: 在Intent中,我们可以使用putExtra()方法来添加额外的数据,这些数据可以是各种类型,如字符串、整数、布尔...
在跨进程启动Activity时,需要借助Intent指定额外的FLAG_ACTIVITY_NEW_TASK标志,并通过startActivityForResult()或startActivity()方法启动。 其次,关于Activity的多个入口点,这意味着可以从不同的起点启动同一...
- 跨进程访问Activity则需指定一个Action字符串,它是目标Activity的标识。例如,拨打电话的Activity可以通过`Intent.ACTION_CALL`启动: ```java Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse...
**跨进程访问服务程序(AIDL)** 在Android系统中,由于进程间的隔离性,不同应用之间不能直接访问对方的数据或方法。为了实现进程间通信(IPC,Inter-Process Communication),Android提供了一种称为AIDL...
本教程将通过一个名为"AIDLdemo"的示例来深入解析如何利用AIDL进行跨进程通信。 首先,我们需要理解AIDL的基本概念。AIDL是一种接口定义语言,类似于Java中的接口,但它的目的是定义一个可以在不同进程间调用的方法...
6. **Socket通信**:尽管在Android中不常用,但在某些场景下,如设备间通信,开发者可能会选择使用Socket实现跨进程通信。 7. **Parcelables与Bundles**:在Binder传输过程中,数据通常需要序列化。Parcelable接口...
Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的...
服务端实现接口,客户端通过Binder代理调用服务端的方法,从而实现跨进程的数据交换。 **2. ContentProvider** ContentProvider是Android四大组件之一,专门用于数据共享。通过实现ContentProvider,一个进程可以将...
通过上述介绍可以看出,在Android中实现跨进程访问Activity以及数据的传递主要依赖于Intent及其相关的方法。无论是简单的数据传递还是复杂的双向通信,Intent都提供了灵活且强大的支持。理解这些机制对于构建复杂的...