原始文件:frameworks\base\services\java\com\android\server\NativeDaemonConnector.java

  1. private
    void listenToSocket() throws IOException {
  2.     LocalSocket socket = null;
  3.  
  4.     try {
  5.         socket = new LocalSocket();
  6.         LocalSocketAddress address = new LocalSocketAddress(mSocket,
  7.                 LocalSocketAddress.Namespace.RESERVED);
  8.  
  9.         socket.connect(address);
  10.  
  11.         InputStream inputStream = socket.getInputStream();
  12.         mOutputStream = socket.getOutputStream();
  13.  
  14.         mCallbacks.onDaemonConnected();
  15.  
  16.         byte[] buffer = new
    byte[BUFFER_SIZE];
  17.         int start = 0;
  18.  
  19.         while (true) {
  20.             int count = inputStream.read(buffer, start, BUFFER_SIZE - start);
  21.             if (count < 0) break;
  22.  
  23.             // Add our starting point to the count and reset the start.
  24.             count += start;
  25.             start = 0;
  26.  
  27.             for (int i = 0; i < count; i++) {
  28.                 if (buffer[i] == 0) {
  29.                     String event = new String(buffer, start, i - start);
  30.                     if (LOCAL_LOGD) Slog.d(TAG, String.format("RCV <- {%s}", event));
  31.  
  32.                     String[] tokens = event.split("
    ", 2);
  33.                     try {
  34.                         int code = Integer.parseInt(tokens[0]);
  35.  
  36.                         if (code >= ResponseCode.UnsolicitedInformational) {
  37.                             mCallbackHandler.sendMessage(
  38.                                     mCallbackHandler.obtainMessage(code, event));
  39.                         } else {
  40.                             try {
  41.                                 mResponseQueue.put(event);
  42.                             } catch (InterruptedException ex) {
  43.                                 Slog.e(TAG, "Failed to put response onto queue", ex);
  44.                             }
  45.                         }
  46.                     } catch (NumberFormatException nfe) {
  47.                         Slog.w(TAG, String.format("Bad msg (%s)", event));
  48.                     }
  49.                     start = i + 1;
  50.                 }
  51.             }
  52.  
  53.             // We should end at the amount we read. If not, compact then
  54.             // buffer and read again.
  55.             if (start != count) {
  56.                 final
    int remaining = BUFFER_SIZE - start;
  57.                 System.arraycopy(buffer, start, buffer, 0, remaining);
  58.                 start = remaining;
  59.             } else {
  60.                 start = 0;
  61.             }
  62.         }
  63.     } catch (IOException ex) {
  64.         Slog.e(TAG, "Communications error", ex);
  65.         throw ex;
  66.     } finally {
  67.         synchronized (mDaemonLock) {
  68.             if (mOutputStream != null) {
  69.                 try {
  70.                     mOutputStream.close();
  71.                 } catch (IOException e) {
  72.                     Slog.w(TAG, "Failed closing output stream", e);
  73.                 }
  74.                 mOutputStream = null;
  75.             }
  76.         }
  77.  
  78.         try {
  79.             if (socket != null) {
  80.                 socket.close();
  81.             }
  82.         } catch (IOException ex) {
  83.             Slog.w(TAG, "Failed closing socket", ex);
  84.         }
  85.     }
  86. }

 

 

Android中java层使用LocalSocket和底层进行通讯的更多相关文章

  1. cocos2d-x 通过JNI实现c/c++和Android的java层函数互调

    文章摘要: 本文主要实现两个功能: (1)通过Android sdk的API得到应用程序的包名(PackageName),然后传递给c++层函数. (2)通过c++函数调用Android的java层函 ...

  2. Android中Java反射技术的使用示例

    import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Metho ...

  3. Android中Java与web通信

    Android中Java与web通信不是新的技术了,在android公布之初就支持这样的方式,2011年開始流行,而这样的模式开发也称作Hybird模式. 这里对android中的Java与web通信 ...

  4. Cocos2d-x3.3RC0通过JNI调用Android的Java层URI代码发送短信

    1.Jni不在赘述.翻看前面博客 2.直接上代码 1)Java层,直接加在AppActivity.java中 public class AppActivity extends Cocos2dxActi ...

  5. 【Unity】Unity中C#与Android中Java的互相调用遇到的一些问题

    1.有关调用的一些问题: (1).在C#中直接调用java中的代码,无返回值: 在java中: public static void setAge(Context context , int leve ...

  6. Android 中Java和JavaScript交互入门

    如何实现JavaScript 和java 交互 实现Java和js交互十分便捷.通常只需要以下几步. WebView开启JavaScript脚本执行 WebView设置供JavaScript调用的交互 ...

  7. Android中Java和JavaScript交互

    Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本.本文将介绍如何实现Java代码和Javascript代码的相互调用. 如 ...

  8. Android中Java与JavaScript之间交互(转)

    Android代码: package com.fyfeng.testjavascript; import android.app.Activity; import android.content.In ...

  9. Android中focusable属性的妙用——底层按钮的实现

    http://www.cnblogs.com/kofi1122/archive/2011/03/22/1991828.html http://www.juziku.com/weizhishi/3077 ...

随机推荐

  1. webstorm 编辑器破解 (麻麻再也不用担心过期了)

    先去官网下载webstorm2016.1.3版本(目前只知道2016.1这个版本可以永久破解,不会过期) 再下载webstorm2016.1的破解补丁 将下载好的破解补丁解压,会有一个Jetbrain ...

  2. iSCS协议介绍

    1.iSCSI 协议说明 一种在 TCP/IP上进行数据块传输的标准,由Cisco 和 IBM 两家发起,并且得到了各大存储厂商的大力支持.iSCSI 可以实现在 IP 网络上运行SCSI协议,使其能 ...

  3. 从源码解析TreeMap

    上篇文章我们介绍了HashMap集合,这是一个键值对集合,可以高效的按照键查找数值.但是它有一个缺陷:数据如果是无序的可以是很高效的,但是如果数据需要排列有顺序就不适合了.本篇将要介绍的一个集合是树集 ...

  4. Cloudera Manager安装_搭建CDH集群

    2017年2月22日, 星期三 Cloudera Manager安装_搭建CDH集群 cpu   内存16G 内存12G 内存8G 默认单核单线 CDH1_node9 Server  || Agent ...

  5. fastcgi的介绍,原理及配置

    fastcgi介绍: CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序一般运行在网络服务器上. C ...

  6. Struts2之访问路径

    上一篇已经和大家分享了关于Struts2命名空间和Action的三种创建方式,本篇我们接着命名空间的内容,来一起探讨一下关于Struts2的访问路径问题,何为访问路径,就是指当我们在浏览器输入地址,点 ...

  7. 【翻译】LPeg编程指南

    原文:http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html   译者序: 这个是官方的LPeg的文档.这段时间学习LPeg的时候发现国内关于LPeg的文章 ...

  8. move.js 源码 学习笔记

    源码笔记: /* move.js * @author:flfwzgl https://github.com/flfwzgl * @copyright: MIT license * Sorrow.X - ...

  9. Java 开机启动

    1.授权: <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">< ...

  10. 去掉标题栏的方法(使用requestWindowFeature(Window.FEATURE_NO_TITLE);为什么失效)

    使用requestWindowFeature(Window.FEATURE_NO_TITLE)隐藏标题栏失效的原因,可能是activity继承的是AppCompatActivity.下面详细介绍了使用 ...