service receive keyevent

http://stackoverflow.com/questions/2986337/is-it-possible-to-create-an-android-service-that-listens-for-hardware-key-presse

1, 

As far as I know KeyEvents can only be handled by Activities as they are the interface to the user pressing the keys. Services run in the background and are not intended to react on user input. That's also the reason of your compiler warning "onKeyDown is undefined for the type Service". Service or any of it's Superclasses don't implement the KeyEvent.Callback interface. As a workaround you could register an Activity in your AndroidManifest.xml to react on certain system notifications such as android.intent.action.SCREEN_ON. When the power button is pressed to turn on the screen your activity could be started, initializing a service of some kind and go back to the background. If that's what you intend to do. See Intent docs for possible Actions.

Hope that helped...


创建不可见的Activity

  • Aandroid开发中有时候会用到一些后台的Activity,但又不适合使用service,比如直接点击程序图标时只是执行一段代码,不需要弹出程序界面。此时可以在项目的AndroidManifest.xml文件中相应的Activity标签中添加这样一行:

android:theme=”@android:style/Theme.NoDisplay”

这样一来,当这个Activity启动的时候,就不会显示出界面了。

P.S. Activity有个属性是“visible”,我尝试了在AndroidManifest.xml中添加 android:visible=”false”和在onCreate函数中添加setVisible(false)两种方法,都没有取得预期的效果,后 来在网上查到了Theme.NoDisplay,终于到达效果。


Receive Input KeyEvent of Powerkey up, interactive=true 2025-07-30 09:13:55.701 910-1088 WindowManager system_process V bruce cancelPendingPowerKeyAction mPowerKeyHandled false 2025-07-30 09:13:56.002 910-988 WindowManager system_process D bruce PolicyHandler handleMessage{ when=-1ms what=13 arg1=1 arg2=1 obj=905728 target=com.android.server.policy.PhoneWindowManager$PolicyHandler } 2025-07-30 09:13:56.002 910-988 PowerManagerService system_process D releaseWakeLockInternal: lock=28547447 [PhoneWindowManager.mPowerKeyWakeLock], flags=0x0 2025-07-30 09:13:56.275 910-910 WindowManager system_process I Finished waking up... 2025-07-30 09:14:03.356 910-1088 WindowManager system_process D interceptKeyTq keycode=26 interactive=true keyguardActive=false down=true isInjected=false policyFlags=22000000 2025-07-30 09:14:03.364 910-1088 WindowManager system_process I inFindWatch = false 2025-07-30 09:14:03.365 910-1088 WindowManager system_process D isTopVoiceInCommingCall 2025-07-30 09:14:03.366 910-1088 WindowManager system_process D isTopVideoInCommingCall 2025-07-30 09:14:03.367 910-1088 WindowManager system_process D Receive Input KeyEvent of Powerkey down, interactive=true 2025-07-30 09:14:03.367 910-1088 PowerManagerService system_process D acquireWakeLockInternal: lock=28547447, flags=0x1, tag="PhoneWindowManager.mPowerKeyWakeLock", ws=null, uid=1000, pid=910 packageName=android 2025-07-30 09:14:03.373 910-988 WindowManager system_process D bruce PolicyHandler handleMessage{ when=-1ms what=25 arg1=26 target=com.android.server.policy.PhoneWindowManager$PolicyHandler } 2025-07-30 09:14:03.374 910-1088 WindowManager system_process V mPowerKeyHandled=false,interactive=true 2025-07-30 09:14:03.561 910-1088 WindowManager system_process D interceptKeyTq keycode=26 interactive=true keyguardActive=false down=false isInjected=false policyFlags=22000000 2025-07-30 09:14:03.567 910-1088 WindowManager system_process I inFindWatch = false 2025-07-30 09:14:03.569 910-1088 WindowManager system_process D isTopVoiceInCommingCall 2025-07-30 09:14:03.570 910-1088 WindowManager system_process D isTopVideoInCommingCall 2025-07-30 09:14:03.570 910-1088 WindowManager system_process D Receive Input KeyEvent of Powerkey up, interactive=true 2025-07-30 09:14:03.571 910-1088 WindowManager system_process V bruce cancelPendingPowerKeyAction mPowerKeyHandled false 2025-07-30 09:14:03.872 910-988 WindowManager system_process D bruce PolicyHandler handleMessage{ when=0 what=13 arg1=1 arg2=1 obj=913560 target=com.android.server.policy.PhoneWindowManager$PolicyHandler } 2025-07-30 09:14:03.874 910-988 WindowManager system_process D bruce inVideoOrCall: inVideofalse, inCall = false 2025-07-30 09:14:03.877 910-988 WindowManager system_process D bruce inwhite topapp= com.xxun.xunlauncher,topActivity=com.xxun.xunlauncher.ui.activity.MainActivity 2025-07-30 09:14:03.877 910-988 WindowManager system_process D bruce powerPressGoHomeOrHideDrag pageIndex=1 2025-07-30 09:14:03.878 910-988 ContextImpl system_process W Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:966 com.android.server.policy.PhoneWindowManager.powerPressGoHomeOrHideDrag:1683 com.android.server.policy.PhoneWindowManager.powerPress:1646 com.android.server.policy.PhoneWindowManager.-wrap20:0 com.android.server.policy.PhoneWindowManager$PolicyHandler.handleMessage:966 2025-07-30 09:14:03.882 910-988 ActivityManager system_process E Sending non-protected broadcast action_clear_wifi_input from system 910:system/1000 pkg android java.lang.Throwable at com.android.server.am.ActivityManagerService.checkBroadcastFromSystem(ActivityManagerService.java:19461) at com.android.server.am.ActivityManagerService.broadcastIntentLocked(ActivityManagerService.java:20168) at com.android.server.am.ActivityManagerService.broadcastIntent(ActivityManagerService.java:20311) at android.app.ContextImpl.sendBroadcast(ContextImpl.java:970) at com.android.server.policy.PhoneWindowManager.powerPressGoHomeOrHideDrag(PhoneWindowManager.java:1683) at com.android.server.policy.PhoneWindowManager.powerPress(PhoneWindowManager.java:1646) at com.android.server.policy.PhoneWindowManager.-wrap20(Unknown Source:0) at com.android.server.policy.PhoneWindowManager$PolicyHandler.handleMessage(PhoneWindowManager.java:966) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.os.HandlerThread.run(HandlerThread.java:65) at com.android.server.ServiceThread.run(ServiceThread.java:46) at com.android.server.UiThread.run(UiThread.java:42) 2025-07-30 09:14:03.918 910-988 WindowManager system_process D bruce powerPressGoHomeOrHideDrag drag = 0, inSilence = false 2025-07-30 09:14:03.920 910-988 WindowManager system_process D bruce powerPressGoHomeOrHideDrag pageIndex=1 2025-07-30 09:14:03.920 910-988 ContextImpl system_process W Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:966 com.android.server.policy.PhoneWindowManager.powerPressGoHomeOrHideDrag:1683 com.android.server.policy.PhoneWindowManager.powerPress:1649 com.android.server.policy.PhoneWindowManager.-wrap20:0 com.android.server.policy.PhoneWindowManager$PolicyHandler.handleMessage:966 2025-07-30 09:14:03.922 910-998 WindowManager system_process I Screen turned off... 2025-07-30 09:14:03.943 910-910 WindowManager system_process I Started going to sleep... (why=2)分析日志,出现息屏无法唤醒的原因是什么
07-31
package com.intl.SmartWeather; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.StrictMode; import android.widget.Toast; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Service_Socket extends Service { private static final String strIPAddr = "127.0.0.1"; private static final int iPort = 8899; private static final int INTERVAL4TESTSOCKET = 7000; public static Socket socket; public static DataInputStream in; public static DataOutputStream out; public static boolean bSocketflag; public static String strMessageFor; public byte[] recvbuffer = new byte[1024]; private boolean IsRun = true; private byte[] dataSend; private ExecutorService mThreadPool; private Handler mHandler; private Timer mTimer; private final IBinder mBinder = new LocalBinder(); public class LocalBinder extends Binder { public Service_Socket getService() { return Service_Socket.this; } } @Override public IBinder onBind(Intent intent) { return mBinder; } @Override public void onCreate() { //Android 4.0+ the socket communication must be added StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath().build()); bSocketflag = false; strMessageFor = "MainActivity"; //create threadpool mThreadPool = Executors.newCachedThreadPool(); socketConnect(); socketRecv(); mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: socketTest(); break; case 2: Toast.makeText(getApplicationContext(), "Connected Succeed", Toast.LENGTH_SHORT).show(); break; case 3: Toast.makeText(getApplicationContext(), "Connected Failed", Toast.LENGTH_SHORT).show(); break; } } }; mTimer = new Timer(); mTimer.schedule(new TimerTask() { @Override public void run() { Message msg = mHandler.obtainMessage(); msg.what = 1; mHandler.sendMessage(msg); } }, 500, INTERVAL4TESTSOCKET); } @Override public void onDestroy() { super.onDestroy(); socketDisconnect(); if (mTimer != null) { mTimer.cancel(); mTimer = null; } IsRun = false; bSocketflag = false; } //Broadcast the socket data public void sendMsgtoActivty(String msg) { // TODO: 实现广播发送功能*************************补全***************************** // 提示:需要创建Intent、设置Action、添加数据、发送广播 } // Thread for disconnect socket public void socketDisconnect() { mThreadPool.execute(new Runnable() { @Override public void run() { if (bSocketflag) { try { in.close(); out.close(); socket.close(); } catch (Exception e) { } } } }); } // Thread for connect socket public void socketConnect() { socketDisconnect(); mThreadPool.execute(new Runnable() { @Override public void run() { try { //*********************补全************************************* // 提示:需要创建Socket、设置超时、连接服务器、获取输入输出流 } catch (Exception e) { bSocketflag = false; Message msg = mHandler.obtainMessage(); msg.what = 3; mHandler.sendMessage(msg); } } }); } public void socketReconnect() { socketDisconnect(); mThreadPool.execute(new Runnable() { @Override public void run() { try { Thread.sleep(100); // TODO: 实现Socket连接逻辑***************补全********************* // 提示:需要创建Socket、设置超时、连接服务器、获取输入输出流 bSocketflag = true; Message msg = mHandler.obtainMessage(); msg.what = 2; mHandler.sendMessage(msg); } catch (Exception e) { bSocketflag = false; Message msg = mHandler.obtainMessage(); msg.what = 3; mHandler.sendMessage(msg); } } }); } // Thread for test socket public void socketTest() { mThreadPool.execute(new Runnable() { @Override public void run() { if (bSocketflag) { try { socket.sendUrgentData(0xFF);// connected test } catch (Exception e) { socketReconnect(); } } } }); } // Thread for send socket public void socketSend(byte[] data) { dataSend = data; socketTest(); mThreadPool.execute(new Runnable() { @Override public void run() { if (bSocketflag) { try { // TODO: 实现数据发送逻辑**************补全***************************** // 提示:将字节数组写入输出流 } catch (Exception e) { } } } }); } // Thread for receive socket public void socketRecv() { mThreadPool.execute(new Runnable() { @Override public void run() { while (IsRun) { try { if (bSocketflag) { int iCount = in.read(recvbuffer); if (iCount != -1) { // TODO: 实现数据接收逻辑*******************补全********************** // 提示:从输入流读取数据,处理接收到的字节数组 } } Thread.sleep(100); } catch (Exception e) { } } } }); } } 以上是service部分,以下是mainactivity部分:package com.intl.SmartWeather; import android.app.Activity; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.TextView; import java.text.DecimalFormat; import java.util.Timer; import java.util.TimerTask; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private static final int MAXBUFFLEN = 1024; private static final int INTERVAL4PROCESSINGBUFFDATA = 100; private Timer mTimer; private Handler mHandler; private boolean bDataLock = false; private int iDataIn = 0; private int iDataOut = 0; private byte[] bytesDataRecBuff = new byte[MAXBUFFLEN]; private byte bFanIndex = (byte) 0x01; private CheckBox cb_temp_fan; private EditText edit_temp_fan; private boolean fanStatus = false; private Service_Socket mService; private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = ((Service_Socket.LocalBinder) service).getService(); Service_Socket.strMessageFor = TAG; //切换串口 new Timer().schedule(new TimerTask() { public void run() { switchSerial(1, 115200); } }, 100); //切换模块 new Timer().schedule(new TimerTask() { public void run() { switchModule(1); } }, 200); } @Override public void onServiceDisconnected(ComponentName name) { mService = null; } }; private ServiceMsgReceiver mServiceMsgRecv; public class ServiceMsgReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ********************补全*********************** } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initEnv(); bindService(new Intent(this, Service_Socket.class), mConnection, Context.BIND_AUTO_CREATE); cb_temp_fan = (CheckBox) findViewById(R.id.cb_link_temp_fan); edit_temp_fan = (EditText) findViewById(R.id.edit_link_temp_fan); Button btnFanOn = (Button) findViewById(R.id.btn_fan_on); Button btnFanOff = (Button) findViewById(R.id.btn_fan_off); btnFanOn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { FanOn(); } }); btnFanOff.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { FanOff(); } }); } @Override public void onResume() { Service_Socket.strMessageFor = TAG; super.onResume(); } @Override public void onDestroy() { if (mTimer != null) { mTimer.cancel(); mTimer = null; } super.onDestroy(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { new AlertDialog.Builder(MainActivity.this).setIcon(R.mipmap.ic_launcher).setTitle("退出").setMessage("确认退出吗?") .setPositiveButton("确认", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialoginterface, int i) { finish(); } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialoginterface, int i) { } }).show(); return true; } return super.onKeyDown(keyCode, event); } //初始化 private void initEnv() { //初始化数据缓冲标志 bDataLock = false; iDataIn = 0; iDataOut = 0; // 注册广播接收器******************补全************************ mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: processingData(); break; } super.handleMessage(msg); } }; mTimer = new Timer(); mTimer.schedule(new TimerTask() { @Override public void run() { Message msg = mHandler.obtainMessage(); msg.what = 1; mHandler.sendMessage(msg); } }, 500, INTERVAL4PROCESSINGBUFFDATA); } //接收数据到数据缓冲区内 private void receiveData(byte[] bRecData) { //Luo Test //Log.i(TAG + ":Data", bytes2HexString(bRecData)); int i; int iDataLen = bRecData.length; if (bDataLock == false) { bDataLock = true; if (iDataIn + iDataLen <= MAXBUFFLEN) { for (i = 0; i < iDataLen; i++) { bytesDataRecBuff[iDataIn + i] = bRecData[i]; } iDataIn += iDataLen; } else { for (i = iDataIn; i < MAXBUFFLEN; i++) { bytesDataRecBuff[i] = bRecData[i - iDataIn]; } for (i = 0; i < iDataLen - MAXBUFFLEN + iDataIn; i++) { bytesDataRecBuff[i] = bRecData[i + MAXBUFFLEN - iDataIn]; } iDataIn = iDataLen - MAXBUFFLEN + iDataIn; } bDataLock = false; } } //读取当前缓冲区中的数据 private int validReceiveLen() { if (iDataOut < iDataIn) { return (iDataIn - iDataOut); } else if (iDataOut > iDataIn) { return (MAXBUFFLEN - iDataOut + iDataIn); } return 0; } //返回后面第iNum有效数据的位置 private int dataOutAdd(int iNum) { int ret = 0; if (iDataOut + iNum < MAXBUFFLEN) { ret = iDataOut + iNum; } else if (iDataOut + iNum > MAXBUFFLEN) { ret = iDataOut + iNum - MAXBUFFLEN; } return ret; } //从缓冲区内读出有效数据 private void processingData() { if (bDataLock == false) { bDataLock = true; int iPacketLen = 0; int i, iValidLen, iReadPos; while (iDataIn != iDataOut) { if (bytesDataRecBuff[iDataOut] == (byte) 0xAA) {// 判断是否为包头 iValidLen = validReceiveLen();// 包含有效数据长度 if (iValidLen < 8) { // 有效长度太短 bDataLock = false; return; } if (iDataOut + 1 >= MAXBUFFLEN) { iPacketLen = bytesDataRecBuff[iDataOut + 1 - MAXBUFFLEN] & 0xFF; } else { iPacketLen = bytesDataRecBuff[iDataOut + 1] & 0xFF; } if (iValidLen < iPacketLen) { // 包不完整 bDataLock = false; return; } if (iPacketLen > 7 && iPacketLen < 40) { // 数据长度正常 iReadPos = iDataOut; byte[] buf = new byte[iPacketLen]; for (i = 0; i < iPacketLen; i++) {// 读出包并进行校验和计算 buf[i] = bytesDataRecBuff[iReadPos++]; if (iReadPos >= MAXBUFFLEN) iReadPos = 0; } if (checkSummationVerify(buf)) { iDataOut = iReadPos; processingPacket(buf); bDataLock = false; return; } } } iDataOut++; if (iDataOut >= MAXBUFFLEN) { iDataOut = 0; } } bDataLock = false; } } //处理接收的数据包 private void processingPacket(byte[] Packet) { ***************************补全********************************************* } private void ShowAp(byte[] bytes) { TextView txt_ap = (TextView) findViewById(R.id.txt_ap); int iValue1 = ((bytes[1] & 0xFF) * 256 + (bytes[2] & 0xFF)) * 256 * 256 + (bytes[3] & 0xFF) * 256 + (bytes[4] & 0xFF); String str_ap = "大气压力:" + String.valueOf(iValue1) + " Pa"; txt_ap.setText(str_ap); } private void ShowRain(byte[] bytes) { TextView txt_rain = (TextView) findViewById(R.id.txt_rain); int iValue = bytes[1] & 0xFF; if (iValue == 0) { txt_rain.setText("无雨雪"); } else if (iValue == 1) { txt_rain.setText("有雨雪"); } } private void ShowRain2(byte[] bytes) { TextView txt_rain = (TextView) findViewById(R.id.txt_rain); int iValue = bytes[5] & 0xFF; if (iValue == 0) { txt_rain.setText("无雨雪"); } else if (iValue == 1) { txt_rain.setText("有雨雪"); } } private void ShowIllumination(byte[] bytes) { TextView txt_illu = (TextView) findViewById(R.id.txt_illu); int iValue = (bytes[1] & 0xFF) * 256 + (bytes[2] & 0xFF); String str = "光照强度:" + String.valueOf(iValue) + " Lux"; txt_illu.setText(str); } private void ShowTempHumi(byte[] bytes) { //*******************补全对温度数据的解析************************************* if (cb_temp_fan.isChecked()) { String strEditTemp = edit_temp_fan.getText().toString().trim(); if (!strEditTemp.equals("")) { int iEdittemp = Integer.parseInt(strEditTemp); if (iTemp / 100.0 > iEdittemp) { if (fanStatus == false) { FanOn(); } } else { if (fanStatus == true) { FanOff(); } } } } } private void FanOn() { sendControlCmd();//*************补全要传递的参数************************************* fanStatus = true; } private void FanOff() { sendControlCmd();//*************补全要传递的参数************************************* fanStatus = false; } //获取校验结果******************补全********************** private boolean checkSummationVerify(byte[] bytes) { } //设置校验位********************补全**************************** private void setSummationVerify(byte[] bytes) { } //二进制数组转字符串 private String bytes2HexString(byte[] bytes) { String ret = ""; for (int i = 0; i < bytes.length; i++) { String hex = Integer.toHexString(bytes[i] & 0xFF); if (hex.length() == 1) { hex = '0' + hex; } ret += hex.toUpperCase(); } return ret; } //切换串口设置 public void switchSerial(int iWhich, int iBaudrate) { byte[] bytes = new byte[4]; bytes[0] = (byte) 0x4C; bytes[1] = (byte) 0x4B; bytes[2] = (byte) iWhich; switch (iBaudrate) { case 4800: bytes[3] = (byte) 0x00; break; case 9600: bytes[3] = (byte) 0x01; break; case 38400: bytes[3] = (byte) 0x02; break; case 57600: bytes[3] = (byte) 0x03; break; case 115200: bytes[3] = (byte) 0x04; break; } mService.socketSend(bytes); } //切换模块连接 public void switchModule(int iWhich) { byte[] bytes = new byte[7]; bytes[0] = (byte) 0xAA; bytes[1] = (byte) bytes.length; bytes[2] = (byte) 0x01; bytes[3] = (byte) 0x00; bytes[4] = (byte) 0x01; bytes[5] = (byte) iWhich; setSummationVerify(bytes); mService.socketSend(bytes); } //发送控制命令(带一个参数) private void sendControlCmd(byte bWsnType, byte bCtrlerType, byte bIndex, byte bValue) { byte[] bytes = new byte[16]; bytes[0] = (byte) 0xAA; bytes[1] = (byte) bytes.length; bytes[2] = (byte) 0x02; bytes[3] = (byte) 0x00; bytes[4] = (byte) 0x0F; bytes[5] = bWsnType; bytes[6] = (byte) 0x00; bytes[7] = bCtrlerType; bytes[8] = bIndex; bytes[9] = (byte) 0x01; bytes[10] = bValue; setSummationVerify(bytes); mService.socketSend(bytes); } //发送控制命令(带两个参数) private void sendControlCmd(byte bWsnType, byte bCtrlerType, byte bIndex, byte bValue1, byte bValue2) { byte[] bytes = new byte[13]; bytes[0] = (byte) 0xAA; bytes[1] = (byte) bytes.length; bytes[2] = (byte) 0x02; bytes[3] = (byte) 0x00; bytes[4] = (byte) 0x0F; bytes[5] = bWsnType; bytes[6] = (byte) 0x00; bytes[7] = bCtrlerType; bytes[8] = bIndex; bytes[9] = (byte) 0x02; bytes[10] = bValue1; bytes[11] = bValue2; setSummationVerify(bytes); mService.socketSend(bytes); } //发送控制命令(带三个参数) private void sendControlCmd(byte bWsnType, byte bCtrlerType, byte bIndex, byte bValue1, byte bValue2, byte bValue3) { byte[] bytes = new byte[14]; bytes[0] = (byte) 0xAA; bytes[1] = (byte) bytes.length; bytes[2] = (byte) 0x02; bytes[3] = (byte) 0x00; bytes[4] = (byte) 0x0F; bytes[5] = bWsnType; bytes[6] = (byte) 0x00; bytes[7] = bCtrlerType; bytes[8] = bIndex; bytes[9] = (byte) 0x03; bytes[10] = bValue1; bytes[11] = bValue2; bytes[12] = bValue3; setSummationVerify(bytes); mService.socketSend(bytes); } } 补全以上代码中需要补全的地方,并输出完整代码
最新发布
09-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值