Android笔记之adb命令应用实例1(手机端与PC端socket通讯上)
Android端的代码:
布局文件:activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.androidusbserver.MainActivity" > <EditText
android:id="@+id/etResult"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:inputType="textMultiLine"
>
</EditText> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" > <EditText
android:id="@+id/etInput"
android:layout_width="200dp"
android:layout_height="wrap_content">
</EditText> <Button
android:id="@+id/btnSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send" />
</LinearLayout> </LinearLayout>
定义广播接收者接收adb发送的命令:AdbBroadcastReceiver.java
public class AdbBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "AdbBroadcastReceiver";
private static final String START_ACTION = "NotifyServiceStart";
private static final String STOP_ACTION = "NotifyServiceStop";
@Override
public void onReceive(Context context, Intent intent) {
String threadName = Thread.currentThread().getName();
String action = intent.getAction();
Log.d(TAG, threadName + "-->>"
+ "AdbBroadcastReceiver onReceive START_ACTION:" + action);
if (START_ACTION.equalsIgnoreCase(action)) {
context.startService(new Intent(context, NetWorkService.class));
} else if (STOP_ACTION.equalsIgnoreCase(action)) {
context.stopService(new Intent(context, NetWorkService.class));
}
}
}
定义android socket服务端接收和发送socket:NetWorkService.java
public class NetWorkService extends Service {
private static final String TAG = "NetWorkService";
private static Boolean mainThreadFlag = true;
private static Boolean ioThreadFlag = true;
private ServerSocket serverSocket = null;
private final int SERVER_PORT = 10101;// 端口号
private List<Socket> sockets = new ArrayList<Socket>();
private Handler _hander = null;
@Override
public IBinder onBind(Intent intent) {
return new MsgSenderBinder();
}
@Override
public void onCreate() {
super.onCreate();
}
private void doListen() {
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
serverSocket = null;
}
try {
serverSocket = new ServerSocket(SERVER_PORT);
while (mainThreadFlag) {
Socket socket = serverSocket.accept();
sockets.add(socket);
new Thread(new ThreadReadWriterSocket(socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("tt", "ConnectService-->>onStartCommand()");
mainThreadFlag = true;
if (serverSocket == null || serverSocket.isClosed()) {
Thread t = new Thread() {
public void run() {
doListen();
};
};
t.start();
}
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
mainThreadFlag = false;
ioThreadFlag = false;
Log.v(TAG, Thread.currentThread().getName()
+ "-->> onDestroy serverSocket.close()");
try {
for (Socket socket : sockets) {
if (socket != null && !socket.isClosed()) {
socket.close();
}
}
sockets.clear();
if (serverSocket != null)
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
class MsgSenderBinder extends Binder implements IMessage {
@Override
public void sendMsg(String msg) {
if (sockets.size() > 0 && !TextUtils.isEmpty(msg)) {
for (Socket socket : sockets) {
if (!socket.isClosed()) {
try {
BufferedOutputStream out = new BufferedOutputStream(
socket.getOutputStream());
byte[] bytes = msg.trim().getBytes();
out.write(MyUtils.intToByte(bytes.length));
out.write(bytes);
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
@Override
public void receiveMsg(Handler hander) {
_hander = hander;
}
}
class ThreadReadWriterSocket implements Runnable {
private Socket client;
public ThreadReadWriterSocket(Socket client) {
this.client = client;
}
@Override
public void run() {
Log.d(TAG, "a client has connected to server!");
BufferedInputStream in;
try {
InputStream is = client.getInputStream();
in = new BufferedInputStream(is);
String currCMD = "";
ioThreadFlag = true;
while (ioThreadFlag) {
try {
if (client.isClosed()) {
break;
}
currCMD = readDataFromSocket(in);
if (_hander != null && !TextUtils.isEmpty(currCMD)) {
Message msg = new Message();
msg.what = 1;
msg.obj = currCMD.trim();
_hander.sendMessage(msg);
}
if (currCMD.trim().equalsIgnoreCase("exit")) {
ioThreadFlag = false;
}
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}
}
in.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
sockets.remove(client);
if (client != null) {
Log.v(TAG, Thread.currentThread().getName() + "-->>"
+ "client.close()");
client.close();
}
} catch (IOException e) {
Log.e(TAG, Thread.currentThread().getName() + "-->>"
+ "read write error");
e.printStackTrace();
}
}
}
public String readDataFromSocket(InputStream in) {
String msg = "";
byte[] tempbuffer = new byte[4];
try {
int numReadedBytes = in.read(tempbuffer, 0, tempbuffer.length);
if (numReadedBytes <= 0)
return msg;
int size = MyUtils.bytesToInt(tempbuffer);
if (size > 0 && size <= 10000) {
byte[] buffer = new byte[size];
int length = in.read(buffer, 0, buffer.length);
if (length > 0) {
msg = new String(buffer, 0, length, "utf-8");
Log.v(TAG, Thread.currentThread().getName() + "-->>"
+ "received data: " + msg);
buffer = null;
}
}
} catch (Exception e) {
Log.v(TAG, Thread.currentThread().getName() + "-->>"
+ "readFromSocket error");
e.printStackTrace();
}
return msg;
}
}
}
MainActivity.java
public class MainActivity extends Activity implements OnClickListener {
private EditText etResult;
private EditText etInput;
private Button btnSend;
private MyConn conn;
private IMessage iMsg = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etResult = (EditText) findViewById(R.id.etResult);
etInput = (EditText) findViewById(R.id.etInput);
btnSend = (Button) findViewById(R.id.btnSend);
btnSend.setOnClickListener(this);
Intent intent = new Intent(this, NetWorkService.class);
startService(intent);
conn = new MyConn();
bindService(intent, conn, BIND_AUTO_CREATE);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnSend:
sendMsg();
break;
}
}
@Override
protected void onDestroy() {
unbindService(conn);
super.onDestroy();
}
private void sendMsg() {
if (iMsg != null) {
iMsg.sendMsg(etInput.getText().toString());
etResult.setText(etResult.getText().toString() + "\r\n"
+ "Android: " + etInput.getText().toString() + "\r\n");
}
}
private static class MyHandler extends Handler {
WeakReference<MainActivity> mActivity;
MyHandler(MainActivity activity) {
mActivity = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1: {
mActivity.get().etResult.setText(mActivity.get().etResult
.getText().toString()
+ "\r\n"
+ "PC: "
+ msg.obj
+ "\r\n");
}
break;
default:
break;
}
}
}
private MyHandler updateHandler = new MyHandler(this);
private class MyConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iMsg = (IMessage) service;
iMsg.receiveMsg(updateHandler);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}
MyUtils.java
public class MyUtils {
public static int bytesToInt(byte[] bytes) {
int addr = bytes[0] & 0xFF;
addr |= ((bytes[1] << 8) & 0xFF00);
addr |= ((bytes[2] << 16) & 0xFF0000);
addr |= ((bytes[3] << 25) & 0xFF000000);
return addr;
}
public static byte[] intToByte(int i) {
byte[] abyte0 = new byte[4];
abyte0[0] = (byte) (0xff & i);
abyte0[1] = (byte) ((0xff00 & i) >> 8);
abyte0[2] = (byte) ((0xff0000 & i) >> 16);
abyte0[3] = (byte) ((0xff000000 & i) >> 24);
return abyte0;
}
}
IMessage.java
public interface IMessage {
void sendMsg(String msg);
void receiveMsg(Handler hander);
}
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.androidusbServer.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".AdbBroadcastReceiver" >
<intent-filter>
<action android:name="NotifyServiceStart" />
<action android:name="NotifyServiceStop" />
</intent-filter>
</receiver>
<service android:name=".NetWorkService" >
</service>
</application>
作者:sufish
出处:http://www.cnblogs.com/dotnetframework/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题,可以邮件:dotnetframework@sina.com联系我,非常感谢。
Android笔记之adb命令应用实例1(手机端与PC端socket通讯上)的更多相关文章
- Android笔记之adb命令应用实例1(手机端与PC端socket通讯下)
通过adb和Android通讯需要引用adb相关的组件到项目中,分别为:adb.exe,AdbWinApi.dll,AdbWinUsbApi.dll. 可以在XXX\sdk\platform-tool ...
- Android笔记之adb命令解析1
要在cmd命令中直接使用adb,需要配置环境变量:目录XXX\sdk\platform-tools 查看adb -help 帮助命令打印出以下内容: Android Debug Bridge vers ...
- Android笔记(adb命令--reboot loader)
Android 的机器通过adb进入升级模式的方法 # adb shell # reboot loader 通过上面两个命令就进入升级模式了,通过工具升级就好了 为什么会写这简单的一篇呢?因为今天干了 ...
- Android的常用adb命令
第一部分:1. ubuntu下配置环境anroid变量:在终端执行 sudo gedit /etc/profile 打开文本编辑器,在最后追加#setandroid environment2. 运行E ...
- android学习笔记31——ADB命令
使用Adb shell command直接送key event給Androidadb shell input keyevent 7 # for key '0'adb shell input keyev ...
- android studio 使用adb命令传递文件到android设备
一:文件传输 在android开发中,有时候需要将文件从pc端传递至android,或者将软件运行的日志,从android设备传递到pc进行分析,我们可以使用windows的cmd窗口,或者andro ...
- Android 里的adb命令
ADB的全称为Android Debug Bridge,就是起到调试桥的作用. adb调试手机需要把usb调试打开 Android studio模拟器有的也要把模拟器usb调试打开,工具要灵活运用, ...
- Android开发中adb命令的常用方法
Android的SDK中提供了很多有用的工具,在开发过程中如果能熟练使用这些工具,会让我们的开发事半功倍.adb是SDK提供的一个常用的命令行工具,全称为Android Debug Bridge,用于 ...
- 如何获得Android设备名称(ADB命令详细介绍)
豌豆荚.360手机管家等软件可以获取android设备名称,显示在界面上,如下图: 我们自己如何来获取设备名称 呢?答案如下: 在命令行中输入“adb shell”进入shell之后,再输入“cat ...
随机推荐
- lazyload 图片延迟加载
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- unity编辑器的搜索框好特么坑啊,居然不支持*号通配符
上图 t:Scene或者点搜索框旁边的 分类按钮 用*.unity是什么也搜索不出来的
- IEnumerable、IEnumerator与yield的学习
我们知道数组对象可以使用foreach迭代进行遍历,同时我们发现类ArrayList和List也可以使用foreach进行迭代.如果我们自己编写的类也需要使用foreach进行迭代时该怎么办呢? IE ...
- 基于jquery扩展漂亮的分页控件(ajax)
分页控件式大家在熟悉不过的控件,很多情况下都需要使用到分页控件来完成列表数据加载操作,在很多分页控件中有的编写麻烦,有的应用扩展比较复杂,有的分页控件样式比较丑陋,有的分页控件用户体验操作比较简单等等 ...
- Positioning(定位)
Positioning(定位) 定位属性允许你为一个元素定位.它也可以将一个元素放在另一个元素后面,并指定一个元素的内容太大时,应该发生什么. 元素可以使用的顶部,底部,左侧和右侧属性定位 ...
- ABAP ALV 颜色设置(行,列,单元格)
BCALV_EDIT_03 http://blog.sina.com.cn/s/blog_a87b19300102who3.html 关于ALV表格颜色,这种需求在项目中会经常用到. 列颜色 列的颜色 ...
- Ledongli
Ledongli.rar
- Vim文本编辑器 指令簿(二)
常常处理文本以及常常须要写代码的人,都会有自己比較常常使用的编辑器,本人喜欢用Vim.理由就是Vim编辑器灵活,而且能够达到纯键盘操作,使用纯熟情况下,根本不须要鼠标操作.听起来是不是非常酷的?只是别 ...
- [ZZ]良好的编码习惯
1.以简洁明了的方式编写C程序.通常把这种程序编写方法称为KIS(“保持简洁”).不要用古怪的方式编写程序. 2.阅读所有的C版本手册.经常参考所用的C版本的手册能了解该版本的丰富的特点,并正确地使用 ...
- [Effective C++ --024]若所有参数皆需类型转换,请为此采用non-member函数
引言 假设我们有这样的类: class A{ public: A(, ) {}; int num() const; int den() const; const A operator* (const ...