Android系统Native和Framework通信方式

最近一个项目中需跨进程通信,对Windows来说So easy~,结果在Android上让我快崩溃了,尝试了3个方案,优缺点如下:

  1. 通过文件通信,不评价了。
  2. 通过AM命令通信,适合频率低、数据少,单工的通知,数据量、频率一大就呵呵了。
  3. 通过Socket通信,适合频率高,数据大,双工的交互,效果棒棒达~
顺便列一下Windows平台进程间的通信,如数家珍啊,给Android参考一下:
  • Clipboard
  • COM
  • Data Copy
  • DDE
  • File Mapping
  • Mailslots
  • Pipes
  • RPC
  • Windows Sockets
  • Memory Share
贴一点点示例代码:
服务端:
char buffer[BUFSIZE] = {0};

m_fdListen = android_get_control_socket("hipsd");
if (-1 == m_fdListen) {
    goto exit;
}
if (listen(m_fdListen,  1) < 0) {
    goto exit;
}

fcntl(m_fdListen, F_SETFD, FD_CLOEXEC);

do {
    m_fdControl = accept(m_fdListen, NULL, 0);

    if (m_fdControl < 0) {
        continue;
    }

    fcntl(m_fdControl, F_SETFD, FD_CLOEXEC);

    do {
        if (m_queue.size() > 0) {
            char* p = m_queue.front();
            memset(buffer, 0, BUFSIZE);
            strcpy(buffer, p);
            buffer[BUFSIZE - 1] = '\0';
            delete[] p;
            p = NULL;
            if (___DBG) {
                ALOGD("SiteChecker::InitSocket->send: %lu,%s", m_queue.size(), buffer);
            }
            send(m_fdControl, buffer, strlen(buffer), 0);
            m_mutex2 = 1;
            m_queue.pop();
            m_mutex2 = 0;
        } else {
            sleep(2);
        }
    } while(true);
    close(m_fdControl);
    sleep(2);
} while (true);

close(m_fdListen);
客户端:
LocalSocketAddress lsa = new LocalSocketAddress("hipsd", LocalSocketAddress.Namespace.RESERVED);
int count = 0;
int len = 128;
while(count++ < 99) {
    LocalSocket ls = new LocalSocket();
    try {
        ls.connect(lsa);
        byte[] buffer = new byte[len];
        while(true) {
            InputStream is = ls.getInputStream();
            int bytes = is.read(buffer, 0, len);
            if (bytes < 0) {
                break;
            } else if (bytes >= len) {
                bytes = len - 1;
            }
            String srcData = new String(buffer, 0, bytes, "utf-8");
            // onGetUrl(mContext, srcData);
        }
    } catch (Exception e) {
        Slog.d("SiteChecker", "Exception:" + e.toString());
    } finally {
        try{
            ls.close();
            ls = null;
        } catch (IOException e) {}
    }
    try {
        Thread.sleep(5000);
        Slog.d("SiteChecker", "connect..." + count);
    } catch( InterruptedException e) {}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值