android 如何让两个apk相互通信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 如何让两个apk相互通信相关的知识,希望对你有一定的参考价值。

A.apk,B.apk都是我写的.现在我想在B.apk里实现获得A.apk的某控件ID,并向其发送一个按键事件.如何实现,谢谢!也就是用B控制A.

这两个apk 是在两个进程里的,(或许可以配置成一个进程。不过如何直接操作这个没有试过。)

所以一般的有两种方法:
1、RPC
2、通过 BroadcastRecever 或 Service

第二种方法比较简单一些。
比如B 控制 A的话,
A定义Service ,比如com.my.ServerA .自定义actionFilter “com.my.serverA.action"
B中调用Intent it = newIntent("com.my.serverA.action");
it.putExtra(....);// 传递你的自定义控制指令。
B.startService(it);
在A中ServerA的 onStartService(Intent it) 。解析这个控制指令,做相应操作就可以了。

用BroadcastRecever 的道理一样。

Aidl,android平台的IPC方式之一,基于系统的Ibinder机制。
网上大多数例子都是在一个apk下来测试调用service,现在我在两个project下面来调用。
一个是server project,一个是client project
首先我们建立的是server project,这里面要实现aidl文件和一个service,activity只是用来启动service的,当然,你也可以通过发广播的形式来启动service。
首先看IAidlService.aidl文件:

Java代码
package com.ds.server;
interface IAidlService
int getType();


这样在eclipse里面自动编译的时候会在gen下面生成IAidlService.java文件(灯下我们的client project要用)。
然后新建一个service,这个service里面has a IAidlService的stub对象,service具体代码如下:

Java代码
package com.ds.server;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class AidlService extends Service

private IAidlService.Stub mBinder = new IAidlService.Stub()

@Override
public int getType() throws RemoteException
// TODO Auto-generated method stub
return 5;

;

private void Log(String str)
Log.d("AidlService", "------ " + str + "------");


@Override
public void onCreate()
Log("service create");


@Override
public void onStart(Intent intent, int startId)
Log("service start id=" + startId);


@Override
public IBinder onBind(Intent t)
Log("service on bind");
return mBinder;


@Override
public void onDestroy()
Log("service on destroy");
super.onDestroy();


@Override
public boolean onUnbind(Intent intent)
Log("service on unbind");
return super.onUnbind(intent);


public void onRebind(Intent intent)
Log("service on rebind");
super.onRebind(intent);




这里一定要实现onBind方法,并返回一个IAidlService.Stub对象。
再去AndroidManifest.xml注册这个service:

Xml代码
<service
android:name=".AidlService"
android:enabled="true"
android:process=":remote" >
<intent-filter>
<action android:name="com.ds.server.IAidlService" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>

android:enabled="true"
android:process=":remote"这两个标签可有可无。
只要注册了这个service就行。
好了,到此,服务端已经完成。

-------------------华丽的分割线-----------------------------------------

下面我们开始client project。
client project比较简单,需要注意的地方是,首先需要把server project中gen文件夹中aidl生成的那个IAidlService.java类以及包都拷贝到我们的client project中。
(注意:client project的包名为com.ds.client;另外一个包名com.ds.server以及这个server包下面的IAidlService.java类都是从server project的gen文件夹拷贝过来的,至于gen文件夹的其他文件就不需要拷贝过来。)。
好了,这样的话,client project只要从activity去远程调用service就好了,实现代码如下:

Java代码
package com.ds.client;

import com.ds.server.IAidlService;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class AidlClientActivity extends Activity

IAidlService iservice;

private ServiceConnection connection = new ServiceConnection()

public void onServiceConnected(ComponentName name, IBinder service)
// TODO Auto-generated method stub
// 从远程service中获得AIDL实例化对象
iservice = IAidlService.Stub.asInterface(service);
Log.i("Client","Bind Success:" + iservice);


public void onServiceDisconnected(ComponentName name)
// TODO Auto-generated method stub
iservice = null;
Log.i("Client","onServiceDisconnected");

;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final TextView tv = (TextView) findViewById(R.id.tv);
Button bt = (Button) findViewById(R.id.bt);
bt.setOnClickListener(new OnClickListener()

@Override
public void onClick(View arg0)
// TODO Auto-generated method stub
Intent service = new Intent(IAidlService.class.getName());
bindService(service, connection, BIND_AUTO_CREATE);
if (iservice != null)
try
tv.setText("" + iservice.getType());
catch (RemoteException e)
e.printStackTrace();





);




注意几点:
1,import com.ds.server.IAidlService;使用的是我们拷贝过来的IAidlService.java类
2,需要一个ServiceConnection对象
3,通过Intent service = new Intent(IAidlService.class.getName());
bindService(service, connection, BIND_AUTO_CREATE);来bind service。这样就可以调用aidl中定义的接口来获取service中的值了。

唉,由于在使用中没有注意拷贝server project中gen文件夹下面的包和IAidlService.java,老是出现Unable to start service Intent这样的错误。搞了好久。
附件是源码。注意使用的时候,先要运行server project,启动服务,然后再运行client project。
参考技术A android要使两个apk程序相互传递数据需要使用到SQlite存储。
使用步骤:

1、命名两个apk程序分别为A/B。
2、在A程序中输入执行代码“sqlite3 new.db”建立数据库。
3、将需要传递的数据存放到new.db数据库中。
4、B程序使用执行代码“select * from mytable”查找数据库中带有*的数据,并反馈出来。

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。

如何让我的 iOS 应用程序相互通信?

【中文标题】如何让我的 iOS 应用程序相互通信?【英文标题】:How can I make my iOS apps talk to each other? 【发布时间】:2011-08-15 06:58:31 【问题描述】:

我有几个 iOS 应用程序,我需要它们相互了解。更准确地说,我需要知道是否已经安装了我的某个应用。

我考虑注册一个自定义 URL 方案(例如 my-app-present://),以便检查是否支持自定义方案,如果支持,我会知道设备上已经有我的一个应用程序。但这不起作用,因为方案是通过Info.plist 注册的,并且应用程序在有机会检查其是否存在之前就注册了该方案。换句话说,检查总是成功的。

然后我想在临时目录中创建一个文件,但是 NSTemporaryDirectory() 在应用程序沙箱中返回一个文件夹,所以这也行不通。我也考虑过钥匙串,但看起来每个应用程序在 iOS 上都有严格独立的钥匙串。

我不想浏览正在运行的应用程序列表,也不想使用网络。你还知道一些其他的技巧吗?

【问题讨论】:

实际上,您的许多应用程序可能使用相同的钥匙串,但前提是它们具有您在 iOS Provisioning Portal 中提供给它们的 Bundle Seed ID 时创建新的应用 ID。这只是 P.S.,因为您已经从 @jtbandes 找到解决问题的方法。 【参考方案1】:

自定义 URL 方案方法听起来不错,只要您为每个应用程序设置不同的方案,例如 my-app-1://my-app-2://。然后(我假设这是您已经知道的)您可以使用canOpenURL: 检查是否可以处理 URL(即,您的应用已安装)。

【讨论】:

这实际上是大多数应用程序所做的,他们需要这种互操作性。 谢谢 (+1)。我想过这一点,但我已经为滥用一个 URL 方案而感到尴尬,更不用说其中几个了。但更糟糕的是,每当我发布新应用时,我都必须更新所有应用中的逻辑,对吧? 是的,如果您的所有应用都需要了解所有您的其他应用。如果是这种情况,也许您可​​以将所有 URL 方案存储在服务器上并动态加载它们? 不幸的是,我所有的应用程序都需要知道它们是否首先在设备上。存储在服务器上的应用程序列表可以正常工作,但对于我正在尝试做的事情来说已经有点过火了。 你想做什么?在提出问题时,这总是有用的信息。【参考方案2】:

如果“互相交谈”意味着您只想检测是否已安装其他应用程序,那么 iHasApp 是一个开源 iOS 框架可能会派上用场。我还没用过。但从描述来看,它似乎是一个不错的选择。

http://www.ihasapp.com/documentation/Classes/iHasApp.html

【讨论】:

iHasApp 不再与 App Store 兼容

以上是关于android 如何让两个apk相互通信的主要内容,如果未能解决你的问题,请参考以下文章

Android:两个独立 APK 的两个服务之间的通信

Java 使组件相互通信

angular2中,如何让子组件相互通信?

是否可以同时运行两个 apk 并使它们通过 Windows 服务进行通信?

Android Flutter:手把手教你如何进行Android 与 Flutter的相互通信

Android动态部署五:如何从插件apk中启动Service