本论坛将全面搬家到:http://www.cnblogs.com/91program,请大家以后来这里看看。

昨天正式开始 Android 编程学习与实践,由于 Android 模拟器在 WinXP 下一直未安装成功(见帖子: http://bbs.csdn.net/topics/390879802),所在将闲置很久的 Android 手机: 联想 A750 找到用于调试。

A750 是 Android 版本是: 2.3.6,在手机 上打开 USB 调试功能后,就可以通过 USB 线与 PC 连接进行调试了。
调试的主要功能是 Socket 通讯,手机做为服务器端。先用 PC 做为客户端。后期的客户端是车机,车机的系统可能是 WinCE 或 Android。
开始之前,先了解了一下 Android 编程的基本知识(后附个人学习记录的知识点),然后学习了如下链接: http://www.cnblogs.com/lknlfy/archive/2012/03/04/2379628.html 关于 Socket 编程的知识。

其中 一个关键的知识点是线程与主进程之间的消息传递机制,主要是线程中的消息传递到主进程。例如:

mHandler.sendMessage(msg);

手机端代码如下(XML就不提供了,很简单,大家看图就知识的):
/*
 * 通过  WIFI 网络进行 Socket 通讯成功, 手机的 IP: 172.25.103.4(随个人网络环境变化)
 * 测试使用 360 随身 WIFI, PC 机的 IP: 172.25.103.1
 * */

package com.jia.leozhengfirstapp;import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;import android.support.v7.app.ActionBarActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends ActionBarActivity {private Socket clientSocket = null;private ServerSocket mServerSocket = null;private Handler mHandler = null;private AcceptThread mAcceptThread = null;private ReceiveThread mReceiveThread = null;private boolean stop = true;private TextView ipText;private TextView rcvText;private TextView ConnectStatusText;@SuppressLint("HandlerLeak")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ipText = (TextView)findViewById(R.id.textView1);rcvText = (TextView)findViewById(R.id.textView3);ConnectStatusText = (TextView)findViewById(R.id.textView4);ConnectStatusText.setText("连接状态: 未连接");// 消息处理mHandler = new Handler(){@Overridepublic void handleMessage(Message msg){switch(msg.what){case 0:{String strAddress = (msg.obj).toString();ipText.setText("IP地址: " + strAddress);Log.v("Leo: IP: ", strAddress);ConnectStatusText.setText("连接状态: 已连接");// 显示客户端IP// ipTextView.setText((msg.obj).toString());// 使能发送按钮// sendButton.setEnabled(true);break;}case 1:{String strRcv = (msg.obj).toString();rcvText.setText("接收到数据: " + strRcv);Log.v("Leo: Rcv: ", strRcv);// 显示接收到的数据// mTextView.setText((msg.obj).toString());break;}                 }                                           }};mAcceptThread = new AcceptThread();// 开启监听线程mAcceptThread.start();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}// 显示Toast函数private void displayToast(String s){Toast.makeText(this, s, Toast.LENGTH_SHORT).show();}private class AcceptThread extends Thread{@Overridepublic void run(){try {// 实例化ServerSocket对象并设置端口号为 12589mServerSocket = new ServerSocket(12589);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {// 等待客户端的连接(阻塞)clientSocket = mServerSocket.accept();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}mReceiveThread = new ReceiveThread(clientSocket);stop = false;// 开启接收线程mReceiveThread.start();Message msg = new Message();msg.what = 0;// 获取客户端IPmsg.obj = clientSocket.getInetAddress().getHostAddress();// 发送消息mHandler.sendMessage(msg);}}private class ReceiveThread extends Thread{private InputStream mInputStream = null;private byte[] buf;  private String str = null;ReceiveThread(Socket s){try {// 获得输入流this.mInputStream = s.getInputStream();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void run(){while(!stop){this.buf = new byte[512];// 读取输入的数据(阻塞读)try {this.mInputStream.read(buf);} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}// 字符编码转换try {this.str = new String(this.buf, "GB2312").trim();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}Message msg = new Message();msg.what = 1;        msg.obj = this.str;// 发送消息mHandler.sendMessage(msg);}}}
}

1) 先通过 WIFI 进行 Socket 通讯
运行后,在手机上显示的未连接界面如下图:


在 PC 上运行类似于 SocketTool.exe 的工具,SocketTool.exe 的显示界面如下:

Socket 连接后,手机上显示的界面如下图:


2) 通过 USB 实现 PC 与手机的通讯
在 PC 上实现一个 Java 小应用,应用的主要代码如下:

try
{Runtime.getRuntime().exec("adb forward tcp:12581 tcp:12589");
}
catch (IOException e)
{e.printStackTrace();
}Socket socket = null;
try
{InetAddress serverAddr = null;OutputStream outStream = null;byte[] msgBuffer = null;serverAddr = InetAddress.getByName("127.0.0.1");System.out.println("TCP 1" + "C: Connecting...");socket = new Socket(serverAddr, 12581);   // 12581 是 PC 的端口,已重定向到 Device 的 12589 端口String message = "PC ADB,send message";msgBuffer = message.getBytes("GB2312");outStream = socket.getOutputStream();outStream.write(msgBuffer);Thread.sleep(10000);
}
catch (UnknownHostException e1)
{System.out.println("TCP 2" + "ERROR: " + e1.toString());
}
catch (IOException e2)
{System.out.println("TCP 3" + "ERROR: " + e2.toString());
} catch (InterruptedException e3)
{// Thread.sleep(1000); 增加的异常处理e3.printStackTrace();
}
finally
{try{if (socket != null){socket.close();       // 关闭时会导致接收到的数据被清空,所以延时 10 秒显示}}catch (IOException e){System.out.println("TCP 4" + "ERROR: " + e.toString());}
}

运行后,在手机上显示的界面如下图:

以下是学习中记录的一些个人认为需要掌握的知识点,由于偶是从零开始学习的,所以有经难的朋友们可以直接忽略此部分:
Intent 用法:

Uri myUri = Uri.parse ("http://www.flashwing.net");
Intent openBrowserIntent = new Intent(Intent.ACTION_VIEW ,myUri);
startActivity(openBrowserIntent);Intent openWelcomeActivityIntent= new Intent();
openWelcomeActivityIntent.setClass(AndroidStudy_TWO.this,Welcome.class);
startActivity(openWelcomeActivityIntent);

从源 Activity 中传递数据

// 数据写入 Intent
Intent openWelcomeActivityIntent= new Intent();
Bundle myBundelForName= new Bundle();
myBundelForName.putString("Key_Name",inName.getText().toString());
myBundelForName.putString("Key_Age",inAge.getText().toString());
openWelcomeActivityIntent.putExtras(myBundelForName);
openWelcomeActivityIntent.setClass(AndroidBundel.this,Welcome.class);
startActivity(openWelcomeActivityIntent);

// 从 Intent 中获取数据

Bundle myBundelForGetName= this.getIntent().getExtras();
String name=myBundelForGetName.getString("Key_Name");

从源请求 Activity 中通过一个 Intent 把一个服务请求传到目标 Activity 中

private Intent toNextIntent; //Intent 成员声明
toNextIntent = new Intent(); //Intent 定义
toNextIntent.setClass(TwoActivityME3.this,SecondActivity3.class);
// 设定开启的下一个 Activity
startActivityForResult(toNextIntent,REQUEST_ASK);
// 开启 Intent 时候 ,把请求码同时传递

在源请求 Activity 中等待 Intent 返回应答结果,通过重载 onActivityResult() 方法

@Override
protected void onActivityResult(int requestCode,int resultCode, Intent data)
{// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_ASK){if (resultCode == RESULT_CANCELED){setTitle( "Cancel****" );}else if (resultCode == RESULT_OK){showBundle = data.getExtras(); // 从返回的 Intent 中获得 BundleName = showBundle.getString("myName"); // 从 bundle 中获得相应数据text.setText("the name get from the second layout:\n" + Name);}}
}

* 第一个参数是你开启请求 Intent 时的对应请求码,可以自己定义。
* 第二个参数是目标 Activity 返回的验证结果码
* 第三个参数是目标 Activity 返回的 Intent

目标 Activity 中发送请求结果代码,连同源 Activity 请求的数据一同绑定到 Bundle 中通过 Intent 传回源请求 Activity 中

backIntent = new Intent();
stringBundle = new Bundle();
stringBundle.putString("myName",Name);
backIntent.putExtras(stringBundle);
setResult(RESULT_OK,backIntent); // 返回 Activity 结果码
finish();

使用服务进行音乐播放
Manifest.xml中的 Service 定义

<service android:name=".Music">
<intent-filter><action android:name="com.test.service.START_AUDIO_SERVICE"/><category android:name="android.intent.category.default"/>
</intent-filter>
</service>

Service 子类中的 Player

public void onStart(Intent intent, int startId) {super.onStart(intent, startId);player = MediaPlayer.create(this, R.raw.seven_days);player.start();
}
public void onDestroy() {super.onDestroy();player.stop();
}

Activity 中定义 的 Intent开启相应的

startService(new Intent("com.test.service.START_AUDIO_SERVICE"));
stopService(new Intent("com.test.service.START_AUDIO_SERVICE"));
DisplayMetrics displaysMetrics= new DisplayMetrics();
//DisplayMetrics 一个描述普通显示信息的结构,例如显示大小、密度、字体尺寸
getWindowManager().getDefaultDisplay().getMetrics(displaysMetrics);
//getManager() 获取显示定制窗口的管理器。
// 获取默认显示 Display 对象
// 通过 Display 对象的数据来初始化一个 DisplayMetrics 对象标题栏/状态栏隐藏 ( 全屏 )
// 隐藏标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 定义全屏参数
int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN ;
// 获得窗口对象
Window myWindow = this.getWindow();
// 设置 Flag 标识
myWindow.setFlags(flag,flag);

Button 按下的处理:

press =(Button)findViewById(R.id.Click_Button);

(1)

press.setOnClickListener(new Button.OnClickListener()
{@Overridepublic void onClick(View v){// TODO Auto-generated method stub}
});

(2)

press.setOnClickListener(this);
@Override
public void onClick(View v)
{switch(v.getId()) /* 根据 ID 判断按钮事件 */{case R.id.Click_Button:{}break;default:break;}
}

Toast--Android 专属浮动小提示
(1) 显示文本: Toast.makeText
(2) 显示图像:

/* 创建新 Toast 对象 */
Toast showImageToast= new Toast(this);
/* 创建新 ImageView 对象 */
ImageView imageView= new ImageView(this);
/* 从资源中获取图片 */
imageView.setImageResource(R.drawable. argon );
/* 设置 Toast 上的 View--(ImageView)*/
showImageToast.setView(imageView);
/* 设置 Toast 显示时间 */
showImageToast.setDuration(Toast. LENGTH_LONG );
/* 显示 Toast*/
showImageToast.show();

模拟器调试:

socket = new Socket("10.0.2.2", 12589);   // 如果用 localhost 不能成功连接

Android Socket 编程(WIFI 和 ADB)相关推荐

  1. Android socket 编程 实现消息推送(二)

    上篇文章Android socket 编程 实现消息推送(一)讲到socket编程的消息推送原理,现在我们来看看基于Android客户机socket编程实现消息推送的过程. 根据消息推送的原理图,我们 ...

  2. Android socket 编程 实现消息推送

    最近用socket写了一个消息推送的demo,在这里和大家分享一下. 主要实现了:一台手机向另外一台手机发送消息,这两台手机可以随时自由发送文本消息进行通信,类似我们常用的QQ. 效果图:    原理 ...

  3. Android Socket编程

    花了大概两天的时间,终于把Android的Socket编程给整明白了.抽空和大家分享一下:  Socket Programming on Android  Socket 编程基础知识:  主要分服务器 ...

  4. Android socket 编程 实现消息推送(一)

    最近用socket写了一个消息推送的demo,在这里和大家分享一下. 主要实现了:一台手机向另外一台手机发送消息,这两台手机可以随时自由发送文本消息进行通信,类似我们常用的QQ. 效果图        ...

  5. Android Socket编程android端服务器和客户端的实现

     Android Socket编程android端服务器和客户端的实现       其实和java实现的差不多,或本质是用java实现的,但由于android有自身的独特性,所以还是有一些要注意的点: ...

  6. Android Socket编程(多线程、双向通信)

    原帖地址:http://www.cnblogs.com/lknlfy/archive/2012/03/04/2379628.html 一.概述 关于Socket编程的基本方法在基础篇里已经讲过,今天把 ...

  7. Android手机用wifi连接adb调试的方法

    https://www.jianshu.com/p/dc6898380e38 0x0 前言 Android开发肯定要连接pc的adb进行调试,传统的方法是用usb与pc进行连接,操作简单即插即用,缺点 ...

  8. adb 最大连接_工具集 | Android Studio—使用 WI-FI 进行 ADB 调试

    前言 Android 开发离不开 ADB 调试,使用 WI-FI 进行 ADB 调试可以避免手机需要保持 USB连接主机.这篇文章记录了使用 WI-FI 进行 ADB 调试遇到的问题,希望能帮上忙. ...

  9. Android无线调试 Wifi连接ADB不用数据线

    为什么用Wifi连接ADB不用数据线?因为我的数据线不见了. 前提:你的手机ROOT过,做Android开发的,别跟人说你的手机不是ROOT的. 步骤:    1.在手机上把ADB服务进程的TCP端口 ...

  10. Android Studio 使用WIFI调试adb (2种方法)

    wifi无线调试App     (ADB WIFI插件) 最近数据线一直被boss借走,一旦借走就无法调试了,所以就打算不用数据线调试了,使用WIFI进行调试. 一.命令 1.首先配置adb环境变量 ...

最新文章

  1. 开源依旧:再次分享一个进销存系统
  2. ps怎么制作流体_ps相框制作教程:ps怎么制作相框效果
  3. SAP MM 创建退货类型的公司间STO,报错 -No delivery type for returns processing assigned to item 00010-
  4. Android工程师面试该怎么准备?终局之战
  5. java hive 查询语句,使用java连接hive,并执行hive语句详解
  6. 第 3 章 第 2 题 求级数问题 递归法实现
  7. react中实现异步请求的方法一,react-thunk
  8. maven各个属性参数详解
  9. JS跳转手机QQ的聊天页面
  10. ie8 不支持 position:fixed 的简单解决办法
  11. 2108. 找出数组中的第一个回文字符串
  12. 读jQuery源码 jQuery.data
  13. 分享几款PR常用插件
  14. 程序员应该阅读的非编程类书籍有哪些?
  15. [从零开始学习FPGA编程-16]:快速入门篇 - 操作步骤2-4- Verilog HDL语言描述语言基本语法(软件程序员和硬件工程师都能看懂)
  16. simplest tensor core gemm sample
  17. 输入法半角和全角的快捷转换_Windows 10—禁用Ctrl+Space输入法非输入法切换
  18. pc端js获取当前经纬度_js获取用户当前地理位置(省、市、经纬度)
  19. 游戏和股票的结构有一定的类似性
  20. 锁定计算机小键盘,笔记本电脑数字键盘已锁定!如何打开: 按什么键

热门文章

  1. python二元一次方程组用鸡兔同笼的思路来写编程_应用二元一次方程组——鸡兔同笼 教学设计...
  2. Word文档插入没有可用的联机内容
  3. 路由器实验之配置实验、直连路由验证、静态路由
  4. pkpm板按弹性计算还是塑性_PKPM楼板计算
  5. 位运算4 起床困难综合症
  6. oracle 终止imp,终止imp/exp和expdp/impdp进程运行的方法
  7. 真核有参转录组测序标准分析-2
  8. 给table表格表头添加斜线
  9. 卫生间里的上下铺,那滋味~
  10. C语言求余运算符的使用