我想通过使用ParcelFileDescriptor.createPipe()一个流到流的复制线程和一个ParcelFileDescriptor,将一个Android服务从一个Android服务"发送"到一个不同进程中运行的另一个服务,该表示管道的读取端,它被提供给另一个服务借助Binder IPC.
我想将一个给定的InputStream发送到接收服务:
public sendInputStream() {
InputStream is = ...; // that's the stream for process/service B
ParcelFileDescriptor pdf = ParcelFileDescriptorUtil.pipeFrom(is);
inputStreamService.inputStream(pdf);
}
Run Code Online (Sandbox Code Playgroud)
ParcelFileDescriptorUtil是一个帮助器类,具有经典的java.io.流到流复制线程:
public class ParcelFileDescriptorUtil {
public static ParcelFileDescriptor pipeFrom(InputStream inputStream) throws IOException {
ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
ParcelFileDescriptor readSide = pipe[0];
ParcelFileDescriptor writeSide = pipe[1];
// start the transfer thread
new TransferThread(inputStream, new ParcelFileDescriptor.AutoCloseOutputStream(writeSide)).start();
return readSide;
}
static class TransferThread extends Thread {
final InputStream mIn;
final OutputStream mOut;
TransferThread(InputStream in, OutputStream …Run Code Online (Sandbox Code Playgroud) 我试图从本机cpp代码调用一个intent.基本上,根据我的理解,我必须编写一个Parcel以匹配frameworks/base/core/java/android/app/ActivityManagerNative.java中的确切反序列化序列; 案例BROADCAST_INTENT_TRANSACTION.
到目前为止的进展是我已经在Java应用程序中收到了意图,但我对bundle有效负载有一些问题.我已经调试了Java应用程序,似乎它将int作为int读取而不是读取包含bundle的键的类型的int.
W/System.err( 1386): java.lang.RuntimeException: Parcel android.os.Parcel@71aa5c5: Unmarshalling unknown type code 6815843 at offset 12
W/System.err( 1386): at android.os.Parcel.readValue(Parcel.java:2228)
W/System.err( 1386): at android.os.Parcel.readArrayMapInternal(Parcel.java:2485)
W/System.err( 1386): at android.os.BaseBundle.unparcel(BaseBundle.java:221
Run Code Online (Sandbox Code Playgroud)
这是使用的本机代码
#include <unistd.h>
#include <binder/IBinder.h>
#include <binder/IServiceManager.h>
#include <binder/Parcel.h>
#include <utils/String8.h>
#include <assert.h>
namespace android {
static const int BROADCAST_INTENT_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION + 13;
int send_intent()
{
int NULL_TYPE_ID = 0;
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> am = sm->checkService(String16("activity"));
assert(am != NULL);
Parcel data, reply;
data.writeInterfaceToken(String16("android.app.IActivityManager"));
data.writeStrongBinder(NULL);
/*intent*/
data.writeString16(String16("com.etc.etc.receiver")); /* action */ …Run Code Online (Sandbox Code Playgroud) 在Android中dev/binder也是为层层沟通负责.是否可以收听消息?我知道它们必须被解码,但我怎么能得到这些消息.例如,如果应用程序发送消息成为地理位置.我也在我的Android设备上root.
我有一个通过AIDL与其他服务进行通信的服务.我希望该服务受我的应用程序中的活动约束.该服务可以定义两个绑定器\接口吗?我已经尝试过使用信使与活动进行通信,重写"onBind"方法,以便根据获取的意图返回不同的绑定器(一个用于其他服务,一个用于活动).
但是当活动(使用相同的绑定器)从服务解除绑定时,我有一个错误"myService已泄漏ServiceConnection ...最初绑定在这里",我相信这是关于服务用来与其他人通信的绑定服务.
如果服务不能使用两个接口,我如何实现活动与该服务之间的通信?
谢谢你,-Liron
在IServiceManager.cpp文件中,我看到了BnServiceManager::onTransact函数定义.
在该功能内部,有一个" addService"," listServices"等的调用.
我找不到那些函数的实现(在IServiceManager下声明).
有人可以告诉我,在哪里可以找到BnServiceManager的实现.
我希望每个应用程序都能够向我的服务发送数据。因此我需要进程间通信。我能找到的每个页面都建议使用 Messenger、AIDL 或 Intents (BroadcastReceiver)。到目前为止,我通过构建一些测试应用程序可以发现,BroadcastReceiver 非常慢,如果在while(true)循环内使用多个线程发送消息,消息可能会在没有通知的情况下丢失。AIDL 和 Messenger 不仅实现起来很复杂(需要服务,活页夹,...)而且可以提供奇怪的行为,例如当使用多线程发送时导致 RemoteException(!!!失败的 BINDER TRANSACTION !!!)与 AIDL 就在使用 oneway 关键字。我想确保交货有保障。oneway在应该保证交货的情况下甚至有理由使用吗?
尽管如此,LocalSocket 似乎非常易于使用(不需要服务,就像 java socket 一样工作)。客户端应用程序只需打开一个 LocalSocket,连接到提供的地址,然后while(true) outputstream.writeObject();
使用 LocalSocket 时是否有任何缺点,因为 android 开发人员页面说“某些应用程序尝试使用传统的 Linux 技术(例如网络套接字和共享文件)来实现 IPC。我们强烈建议您改用 Android 系统功能进行 IPC”,但没有进一步评论在这
我完全与Bounded Services混淆.我的问题是: - Binding是什么意思?Binder课程做什么?从服务返回iBinder对象是什么意思?什么是IBinder对象?onBind方法的工作原理是什么?这些是关于有界服务的几个问题.请详细解释我.我已经阅读了这些文件.目前还不清楚.
1804-11 09:43:24.482 22968 22968 E CrashHandler: In thread: Thread[main,5,main]
1904-11 09:43:24.482 22968 22968 E CrashHandler: UncaughtException detected: java.lang.IllegalStateException: Failure reading AssistStructure data: android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died
2004-11 09:43:24.482 22968 22968 E CrashHandler: at android.os.Parcel.readException(Parcel.java:1953)
2104-11 09:43:24.482 22968 22968 E CrashHandler: at android.os.Parcel.readException(Parcel.java:1891)
2204-11 09:43:24.482 22968 22968 E CrashHandler: at android.app.IActivityManager$Stub$Proxy.reportAssistContextExtras(IActivityManager.java:7637)
2304-11 09:43:24.482 22968 22968 E CrashHandler: at android.app.ActivityThread.handleRequestAssistContextExtras(ActivityThread.java:3483)
2404-11 09:43:24.482 22968 22968 E CrashHandler: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2125)
2504-11 09:43:24.482 22968 22968 E CrashHandler: at android.os.Handler.dispatchMessage(Handler.java:108) …Run Code Online (Sandbox Code Playgroud) 在检查了这个确切的问题(https://github.com/jupyterhub/binderhub/issues/237)之后,似乎已经通过合并的合并请求(https://github.com/jupyterhub/binderhub/)实现了此功能。拉/ 671)。
但是我似乎在文档或其他地方找不到指导来解释应该在secrets.yml文件中输入的内容,或者是否需要其他步骤才能将Binder与私有Github存储库结合使用(如果我错过了显而易见的-完整的Binder noobie,我们深表歉意)这里)
链接到原始问题中的同一个问题:https : //github.com/jupyterhub/binderhub/issues/237#issuecomment-462711995
github reproducible-research jupyter jupyter-notebook android-binder