原始文件: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. 微信小程序,超能装的实例教程

    序言 开始开发应用号之前,先看看官方公布的「小程序」教程吧!(以下内容来自微信官方公布的「小程序」开发指南) 本文档将带你一步步创建完成一个微信小程序,并可以在手机上体验该小程序的实际效果.这个小程序 ...

  2. C#开发step步骤条控件

    现在很多的javascript控件,非常的不错,其中step就是一个,如下图所示: 那么如何用C#来实现一个step控件呢? 先定义一个StepEntity类来存储步骤条节点的信息: public c ...

  3. react配置之浅谈

    //复习 1 .块级作用域 let 和const 2 变量结构 默认值 一般往后写 rest参数(了解) 箭头函数(重要)(x,y)=>{} 3.map 存储高级键值对 4.set集合(去重) ...

  4. MyBatis 源码分析——类型处理器

    官网上面讲到:无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型.那 ...

  5. iOS 推送问题全解答《十万个为啥吖?》

    Q 1:为啥收不到推送(1)? 如果收到推送时,App 在前台运行,那么: iOS 10 before 顶部横幅不会弹出.没有任何展示,你以为「没有收到推送」. iOS 10 after 如果没有实现 ...

  6. Spring+SpringMVC+MyBatis+easyUI整合基础篇(七)JDBC url的连接参数

    在java程序与数据库连接的编程中,mysql jdbc url格式如下: jdbc:mysql://[host:port],[host:port].../[database][?参数名1][=参数值 ...

  7. .NET基础笔记(C#)

    闲着没事就把以前学习时的笔记拿出来整理了一下,个人感觉有点用,就想拿出来跟园友共享一下.有些基础性的内容比如基本概念.语法什么的就不发了. 内容:1.构造方法(函数) 2.继承   3.访问修饰符   ...

  8. java程序员入门:英语好不好对编程到底有没有影响

    我想当码农,听说钱钱拿的多! 哦.是很有钱!么样? 可是我不会! 那你想么样?去学撒! 可是,我英语差-- 有多差??? 很差-- 那????? 关于英语水平对编程的影响,我们一起来看看啦!希望可以解 ...

  9. linux网络编程1 最简单的socket编程

    下面是socket编程的服务器端 先看一个图,1 #include<stdio.h> #include<stdlib.h> #include<string.h> # ...

  10. Dev使用技巧

    1.  dev调试 I.建工程,选择console application II.设置断点(F4),并按F5,(完成输入后,)其它功能如Next line可运作 2.  修改字体大小:Tools-&g ...