位置: 编程技术 - 正文

2、BluetoothChat之扫描设备DeviceListActivity.java

编辑:rootadmin

推荐整理分享2、BluetoothChat之扫描设备DeviceListActivity.java,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

参考引用:  该类包含 UI 和操作的 Activity 类,作用是得到系统默认蓝牙设备的已配对设备列表,以及搜索出的未配对的新设备的列表。然后提供点击后发出连接设备请求的功能。

接着上一篇没有完成的任务,我们继续分析这个蓝牙聊天程序的实现,本文主要包括以下两个部分的内容:其一,分析扫描设备部分DeviceListActivity,其二,分析具体的聊天过程的完整通信方案,包括端口监听、链接配对、消息发送和接收等,如果有对上一篇文章不太熟悉的,可以返回去在过一次,这样会有利于本文的理解。

设备扫描(DeviceListActivity)

  在上一篇文章的介绍中,当用户点击了扫描按钮之后,则会执行如下代码:

// 启动DeviceListActivity查看设备并扫描   Intent serverIntent = new Intent(this, DeviceListActivity.class);   startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE); [java] view plaincopy// 启动DeviceListActivity查看设备并扫描   Intent serverIntent = new Intent(this, DeviceListActivity.class);   startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE);

  该代码将跳转到DeviceListActivity进行设备的扫描,并且通过REQUEST_CONNECT_DEVICE来请求链接扫描到的设备。从AndroidManifest.xml文件中我们知道DeviceListActivity将为定义为一个对话框的风&#;,下图是该应用程序中,扫描蓝牙设备的截图。

device_list.xml

  其中DeviceListActivity则为图中对话框部分,其界面的布局如下代码所示。

<LinearLayout xmlns:android="   android:orientation="vertical"   android:layout_width="match_parent"   android:layout_height="match_parent"   >   <!-- 已经配对的设备 -->   <TextView android:id="@&#;id/title_paired_devices"   android:layout_width="match_parent"   android:layout_height="wrap_content"   android:text="@string/title_paired_devices"   android:visibility="gone"   android:background="#"   android:textColor="#fff"   android:paddingLeft="5dp"   />   <!-- 已经配对的设备信息 -->   <ListView android:id="@&#;id/paired_devices"   android:layout_width="match_parent"   android:layout_height="wrap_content"   android:stackFromBottom="true"   android:layout_weight="1"   />   <!-- 扫描出来没有经过配对的设备 -->   <TextView android:id="@&#;id/title_new_devices"   android:layout_width="match_parent"   android:layout_height="wrap_content"   android:text="@string/title_other_devices"   android:visibility="gone"   android:background="#"   android:textColor="#fff"   android:paddingLeft="5dp"   />   <!-- 扫描出来没有经过配对的设备信息 -->   <ListView android:id="@&#;id/new_devices"   android:layout_width="match_parent"   android:layout_height="wrap_content"   android:stackFromBottom="true"   android:layout_weight="2"   />   <!-- 扫描按钮 -->   <Button android:id="@&#;id/button_scan"   android:layout_width="match_parent"   android:layout_height="wrap_content"   android:text="@string/button_scan"   />   </LinearLayout> [java] view plaincopy<LinearLayout xmlns:android="   android:orientation="vertical"   android:layout_width="match_parent"   android:layout_height="match_parent"   >   <!-- 已经配对的设备 -->   <TextView android:id="@&#;id/title_paired_devices"   android:layout_width="match_parent"   android:layout_height="wrap_content"   android:text="@string/title_paired_devices"   android:visibility="gone"   android:background="#"   android:textColor="#fff"   android:paddingLeft="5dp"   />   <!-- 已经配对的设备信息 -->   <ListView android:id="@&#;id/paired_devices"   android:layout_width="match_parent"   android:layout_height="wrap_content"   android:stackFromBottom="true"   android:layout_weight="1"   />   <!-- 扫描出来没有经过配对的设备 -->   <TextView android:id="@&#;id/title_new_devices"   android:layout_width="match_parent"   android:layout_height="wrap_content"   android:text="@string/title_other_devices"   android:visibility="gone"   android:background="#"   android:textColor="#fff"   android:paddingLeft="5dp"   />   <!-- 扫描出来没有经过配对的设备信息 -->   <ListView android:id="@&#;id/new_devices"   android:layout_width="match_parent"   android:layout_height="wrap_content"   android:stackFromBottom="true"   android:layout_weight="2"   />   <!-- 扫描按钮 -->   <Button android:id="@&#;id/button_scan"   android:layout_width="match_parent"   android:layout_height="wrap_content"   android:text="@string/button_scan"   />   </LinearLayout>

  该布局整体由一个线性布局LinearLayout组成,其中包含了两个textview中来显示已经配对的设备和信扫描出来的设备(还没有经过配对)和两个ListView分别用于显示已经配对和没有配对的设备的相关信息。按钮则用于执行扫描过程用,整个结构很简单,下面我们开始分析如何编码实现了。  同样开始之前,我们先确定该类中的变量的作用,定义如下:

定义变量

public class DeviceListActivityextends Activity {

  // Debugging   private static final String TAG ="DeviceListActivity";   private staticfinalboolean D =true;   // Return Intent extra   public static String EXTRA_DEVICE_ADDRESS ="device_address";   // 蓝牙适配器   private BluetoothAdapter mBtAdapter;   //已经配对的蓝牙设备   private ArrayAdapter<String> mPairedDevicesArrayAdapter;   //新的蓝牙设备   private ArrayAdapter<String> mNewDevicesArrayAdapter; [java] view plaincopypublic class DeviceListActivity extends Activity {   // Debugging   private static final String TAG = "DeviceListActivity";   private static final boolean D = true;   // Return Intent extra   public static String EXTRA_DEVICE_ADDRESS = "device_address";   // 蓝牙适配器   private BluetoothAdapter mBtAdapter;   //已经配对的蓝牙设备   private ArrayAdapter<String> mPairedDevicesArrayAdapter;   //新的蓝牙设备   private ArrayAdapter<String> mNewDevicesArrayAdapter;

  其中Debugging部分,同样用于调试,这里定义了一个EXTRA_DEVICE_ADDRESS,用于在通过Intent传递数据时的附加信息,即设备的地址,当扫描出来之后,返回到BluetoothChat中的onActivityResult函数的REQUEST_CONNECT_DEVICE命令,这是我们就需要通过DeviceListActivity.EXTRA_DEVICE_ADDRESS来取得该设备的Mac地址,因此当我们扫描完成之后在反馈扫描结果时就需要绑定设备地址作为EXTRA_DEVICE_ADDRESS的附加&#;,这和我们上一篇介绍的并不矛盾。另外其他几个变量则分别是本地蓝牙适配器、已经配对的蓝牙列表和扫描出来还没有配对的蓝牙设备列表,稍后我们可以看到对他们的使用。  进入DeviceListActivity之后我们首先分析onCreate,首先通过如下代码对窗口进行了设置:

onCreate_窗口设置、初始化// 设置窗口   requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);   setContentView(R.layout.device_list);   setResult(Activity.RESULT_CANCELED); [java] view plaincopy// 设置窗口   requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);   setContentView(R.layout.device_list);   setResult(Activity.RESULT_CANCELED); 2、BluetoothChat之扫描设备DeviceListActivity.java

  这里我们设置了窗口需要带一个进度条,当我们在扫描时就看有很容易的高速用户扫描进度。具体布局则设置为device_list.xml也是我们文本第一段代码的内容,接下来首先初始化扫描按钮,代码如下:

// 初始化扫描按钮   Button scanButton = (Button) findViewById(R.id.button_scan);   scanButton.setOnClickListener(new OnClickListener() {   public void onClick(View v) {   doDiscovery();   v.setVisibility(View.GONE);   }   }); [java] view plaincopy// 初始化扫描按钮   Button scanButton = (Button) findViewById(R.id.button_scan);   scanButton.setOnClickListener(new OnClickListener() {   public void onClick(View v) {   doDiscovery();   v.setVisibility(View.GONE);   }   });

  首先取得按钮对象,然后为其设置一个事件监听,当事件触发时就通过doDiscovery函数来执行扫描操作即可,具体扫描过程稍后分析。  然后需要初始化用来显示设备的列表和数据源,使用如下代码即可:

//初始化ArrayAdapter,一个是已经配对的设备,一个是新发现的设备   mPairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name);   mNewDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name);   // 检测并设置已配对的设备ListView   ListView pairedListView = (ListView) findViewById(R.id.paired_devices);   pairedListView.setAdapter(mPairedDevicesArrayAdapter);   pairedListView.setOnItemClickListener(mDeviceClickListener);   // 检查并设置行发现的蓝牙设备ListView   ListView newDevicesListView = (ListView) findViewById(R.id.new_devices);   newDevicesListView.setAdapter(mNewDevicesArrayAdapter);   newDevicesListView.setOnItemClickListener(mDeviceClickListener); [java] view plaincopy//初始化ArrayAdapter,一个是已经配对的设备,一个是新发现的设备   mPairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name);   mNewDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name);   // 检测并设置已配对的设备ListView   ListView pairedListView = (ListView) findViewById(R.id.paired_devices);   pairedListView.setAdapter(mPairedDevicesArrayAdapter);   pairedListView.setOnItemClickListener(mDeviceClickListener);   // 检查并设置行发现的蓝牙设备ListView   ListView newDevicesListView = (ListView) findViewById(R.id.new_devices);   newDevicesListView.setAdapter(mNewDevicesArrayAdapter);   newDevicesListView.setOnItemClickListener(mDeviceClickListener);

  并分别对这些列表中的选项设置了监听mDeviceClickListener,用来处理,当选择该选项时,就进行链接和配对操作。既然是扫描,我们就需要对扫描的结果进行监控,这里我们构建了一个广播BroadcastReceiver来对扫描的结果进行处理,代码如下:

 // 当一个设备被发现时,需要注册一个广播   IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);   this.registerReceiver(mReceiver, filter);   // 当显示检查完毕的时候,需要注册一个广播   filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);   this.registerReceiver(mReceiver, filter); [java] view plaincopy// 当一个设备被发现时,需要注册一个广播   IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);   this.registerReceiver(mReceiver, filter);   // 当显示检查完毕的时候,需要注册一个广播   filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);   this.registerReceiver(mReceiver, filter);

  这里我们注册到广播mReceiver的IntentFilter主要包括了发现蓝牙设备(BluetoothDevice.ACTION_FOUND)和扫描结束(BluetoothAdapter.ACTION_DISCOVERY_FINISHED),稍后我们分析如何在mReceiver中来处理这些事件。  最后我们需要取得本地蓝牙适配器和一些初始的蓝牙设备数据显示列表进行处理,代码如下:

getBondedDevices函数_取得本地蓝牙适配器// 得到本地的蓝牙适配器   mBtAdapter = BluetoothAdapter.getDefaultAdapter();   // 得到一个已经匹配到本地适配器的BluetoothDevice类的对象集合   Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();   // 如果有配对成功的设备则添加到ArrayAdapter   if (pairedDevices.size() > 0) {   findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);   for (BluetoothDevice device : pairedDevices) {   mPairedDevicesArrayAdapter.add(device.getName() &#; "n" &#; device.getAddress());   }   } else {    //否则添加一个没有被配对的字符串   String noDevices = getResources().getText(R.string.none_paired).toString();   mPairedDevicesArrayAdapter.add(noDevices);   } [java] view plaincopy// 得到本地的蓝牙适配器   mBtAdapter = BluetoothAdapter.getDefaultAdapter();   // 得到一个已经匹配到本地适配器的BluetoothDevice类的对象集合   Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();   // 如果有配对成功的设备则添加到ArrayAdapter   if (pairedDevices.size() > 0) {   findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);   for (BluetoothDevice device : pairedDevices) {   mPairedDevicesArrayAdapter.add(device.getName() &#; "n" &#; device.getAddress());   }   } else {    //否则添加一个没有被配对的字符串   String noDevices = getResources().getText(R.string.none_paired).toString();   mPairedDevicesArrayAdapter.add(noDevices);   }

  首先通过蓝牙适配器的getBondedDevices函数取得已经配对的蓝牙设备,并将其添加到mPairedDevicesArrayAdapter数据源中,会显示到pairedListView列表视图中,如果没有已经配对的蓝牙设备,则显示一个R.string.none_paired字符串表示目前没有配对成功的设备。

onDestroy函数

  onDestroy函数中会制定销毁操作,主要包括蓝牙适配器和广播的注销操作,代码如下:

@Override   protected void onDestroy() {   super.onDestroy();   // 确保我们没有发现,检测设备   if (mBtAdapter !=null) {   mBtAdapter.cancelDiscovery();   }   // 卸载所注册的广播   this.unregisterReceiver(mReceiver);   } [java] view plaincopy@Override   protected void onDestroy() {   super.onDestroy();   // 确保我们没有发现,检测设备   if (mBtAdapter != null) {   mBtAdapter.cancelDiscovery();   }   // 卸载所注册的广播   this.unregisterReceiver(mReceiver);   }

  对于蓝牙适配器的取消方式则调用cancelDiscovery()函数即可,卸载mReceiver则需要调用unregisterReceiver即可。  做好初始化工作之后,下面我们开始分析扫描函数doDiscovery(),其扫描过程的实现很就简单,代码如下:

doDiscovery()_扫描函数&#;&#;/**  * 请求能被发现的设备  */   private void doDiscovery() {   if (D) Log.d(TAG,"doDiscovery()");   // 设置显示进度条   setProgressBarIndeterminateVisibility(true);   // 设置title为扫描状态   setTitle(R.string.scanning);   // 显示新设备的子标题   findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE);   // 如果已经在请求现实了,那么就先停止   if (mBtAdapter.isDiscovering()) {   mBtAdapter.cancelDiscovery();   }   // 请求从蓝牙适配器得到能够被发现的设备   mBtAdapter.startDiscovery();   } [java] view plaincopy/**   * 请求能被发现的设备   */   private void doDiscovery() {   if (D) Log.d(TAG, "doDiscovery()");   // 设置显示进度条   setProgressBarIndeterminateVisibility(true);   // 设置title为扫描状态   setTitle(R.string.scanning);   // 显示新设备的子标题   findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE);   // 如果已经在请求现实了,那么就先停止   if (mBtAdapter.isDiscovering()) {   mBtAdapter.cancelDiscovery();   }   // 请求从蓝牙适配器得到能够被发现的设备   mBtAdapter.startDiscovery();   }

  首先通过setProgressBarIndeterminateVisibility将进度条设置为显示状态,设置标题title为R.string.scanning字符串,表示正在扫描中,代码中所说的新设备的子标题,其实就是上面我们所说的扫描到的没有经过配对的设备的title,对应于R.id.title_new_devices。扫描之前我们首先通过isDiscovering函数检测当前是否正在扫描,如果正在扫描则调用cancelDiscovery函数来取消当前的扫描,最后调用startDiscovery函数开始执行扫描操作。  现在已经开始扫描了,下面我们就需要对扫描过程进行监控和对扫描的结果进行处理。即我们所定义的广播mReceiver,其实现如下所示。

广播mReceiver//监听扫描蓝牙设备   private final BroadcastReceiver mReceiver =new BroadcastReceiver() {   @Override   public void onReceive(Context context, Intent intent) {   String action = intent.getAction();   // 当发现一个设备时   if (BluetoothDevice.ACTION_FOUND.equals(action)) {   // 从Intent得到蓝牙设备对象   BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);   // 如果已经配对,则跳过,因为他已经在设备列表中了   if (device.getBondState() != BluetoothDevice.BOND_BONDED) {    //否则添加到设备列表   mNewDevicesArrayAdapter.add(device.getName() &#; "n" &#; device.getAddress());   }   // 当扫描完成之后改变Activity的title   } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {    //设置进度条不显示   setProgressBarIndeterminateVisibility(false);   //设置title   setTitle(R.string.select_device);   //如果计数为0,则表示没有发现蓝牙   if (mNewDevicesArrayAdapter.getCount() ==0) {   String noDevices = getResources().getText(R.string.none_found).toString();   mNewDevicesArrayAdapter.add(noDevices);   }   }   }   }; [java] view plaincopy//监听扫描蓝牙设备   private final BroadcastReceiver mReceiver = new BroadcastReceiver() {   @Override   public void onReceive(Context context, Intent intent) {   String action = intent.getAction();   // 当发现一个设备时   if (BluetoothDevice.ACTION_FOUND.equals(action)) {   // 从Intent得到蓝牙设备对象   BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);   // 如果已经配对,则跳过,因为他已经在设备列表中了   if (device.getBondState() != BluetoothDevice.BOND_BONDED) {    //否则添加到设备列表   mNewDevicesArrayAdapter.add(device.getName() &#; "n" &#; device.getAddress());   }   // 当扫描完成之后改变Activity的title   } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {    //设置进度条不显示   setProgressBarIndeterminateVisibility(false);   //设置title   setTitle(R.string.select_device);   //如果计数为0,则表示没有发现蓝牙   if (mNewDevicesArrayAdapter.getCount() == 0) {   String noDevices = getResources().getText(R.string.none_found).toString();   mNewDevicesArrayAdapter.add(noDevices);   }   }   }   };

  其中我们通过intent.getAction()可以取得一个动作,然后判断如果动作为BluetoothDevice.ACTION_FOUND,则表示发现一个蓝牙设备,然后通过BluetoothDevice.EXTRA_DEVICE常量可以取得Intent中的蓝牙设备对象(BluetoothDevice),然后通过条件"device.getBondState() != BluetoothDevice.BOND_BONDED"来判断设备是否配对,如果没有配对则添加到行设备列表数据源mNewDevicesArrayAdapter中,另外,当我们取得的动作为BluetoothAdapter.ACTION_DISCOVERY_FINISHED,则表示扫描过程完毕,这时首先需要设置进度条不现实,并且设置窗口的标题为选择一个设备(R.string.select_device)。当然如果扫描完成之后没有发现新的设备,则添加一个没有发现新的设备字符串(R.string.none_found)到mNewDevicesArrayAdapter中。  最后,扫描界面上还有一个按钮,其监听mDeviceClickListener的实现如下:

监听mDeviceClickListener// ListViews中所有设备的点击事件监听   private OnItemClickListener mDeviceClickListener =new OnItemClickListener() {   public void onItemClick(AdapterView<?> av, View v,int arg2,long arg3) {   // 取消检测扫描发现设备的过程,因为内非常耗费资源   mBtAdapter.cancelDiscovery();   // 得到mac地址   String info = ((TextView) v).getText().toString();   String address = info.substring(info.length() - );   // 创建一个包括Mac地址的Intent请求   Intent intent = new Intent();   intent.putExtra(EXTRA_DEVICE_ADDRESS, address);   // 设置result并结束Activity   setResult(Activity.RESULT_OK, intent);   finish();   }   }; [java] view plaincopy// ListViews中所有设备的点击事件监听   private OnItemClickListener mDeviceClickListener = new OnItemClickListener() {   public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) {   // 取消检测扫描发现设备的过程,因为内非常耗费资源   mBtAdapter.cancelDiscovery();   // 得到mac地址   String info = ((TextView) v).getText().toString();   String address = info.substring(info.length() - );   // 创建一个包括Mac地址的Intent请求   Intent intent = new Intent();   intent.putExtra(EXTRA_DEVICE_ADDRESS, address);   // 设置result并结束Activity   setResult(Activity.RESULT_OK, intent);   finish();   }   };

  当用户点击该按钮时,首先取消扫描进程,因为扫描过程是一个非常耗费资源的过程,然后去的设备的mac地址,构建一个Intent 对象,通过附加数据EXTRA_DEVICE_ADDRESS将mac地址传递到BluetoothChat中,然后调用finish来结束该界面。这时就会回到上一篇文章我们介绍的BluetoothChat中的

onActivityResult函数

onActivityResult函数中去执行请求代码为REQUEST_CONNECT_DEVICE的片段,用来连接一个设备。

3、BluetoothChat之BluetoothChatService.java 参考:

关于 update ADT plug-in 的错误 关于updateADTplug-in的错误0EclipsereportsrenderinglibrarymorerecentthanADTplug-in.PleaseupdateADTplug-inOnanewAndroidSDKinstallation,theEclipseGraphicalLayoutisblank,ratherthanshowingtherendering

狂刷Android范例之2:剪贴板范例 狂刷Android范例之2:剪贴板范例ClipboardSample说明狂刷Android范例系列文章开张了。每篇学习一个Android范例,将一个范例单独生成一个可运行的app,并对重

标签: 2、BluetoothChat之扫描设备DeviceListActivity.java

本文链接地址:https://www.jiuchutong.com/biancheng/385111.html 转载请保留说明!

上一篇:1、BluetoothChat之BluetoothChat.java

下一篇:3、BluetoothChat之BluetoothChatService.java

  • 计提企业所得税会计分录怎么做
  • 税收的自动稳定性主要表现在什么制度
  • 计提工会经费的基数是什么
  • 资本金利息收入算业务收入吗
  • 增值税即征即退收入要交企业所得税吗
  • 业务招待费怎么做会计分录
  • 买体育彩票收银配比是多少
  • 企业用现金支付业务招待费1000元
  • 公司获得奖金计入什么科目
  • 税号里的字母要大写还是小写
  • 股票内在价值计算公式中级财务管理
  • 收到运费发票是进项还是销项
  • 非公司员工缴纳社保有什么影响
  • 增值税发票系统升级版
  • 外购已税化妆品生产的护肤护发品
  • 企业所得税中的资产总额怎么填
  • 软件开发过程中必须伴有质量保证活动
  • 收到个人所得税退税手续费分录
  • 为什么申报个人所得税还要补税
  • scm wms
  • PHP:curl_multi_remove_handle()的用法_cURL函数
  • 外贸出口退税企业差旅费可以抵扣吗
  • 期货保证金的计算公式当日盈亏怎么算
  • php array_chunk
  • 华沙的教堂
  • php抽奖程序源码
  • 手续费在银行系统哪里查
  • 开票收款人在哪里设置
  • 记账凭证和收付账簿区别
  • 治疗孩子咳嗽小秘方,超实用
  • Vue中 Vue-Baidu-Map基本使用
  • 其他权益工具投资公允价值变动计入什么科目
  • vue3.0中的ref
  • ech命令
  • 普通发票收款人填管理员可以吗
  • 升级到miui14感觉耗电快了
  • 出售无形资产损益怎么算
  • python中socket怎么用
  • 怎么向银行申请贷款
  • python命令行进度条
  • 小微企业短小频急
  • 税务异常怎么处理要多长时间
  • 一般纳税人如何交增值税
  • 资源税类的税种是
  • 收到生育津贴会计分离
  • 建筑行业未取得收入如何结转成本
  • 承兑汇票到期取现手续费
  • 销售退货成本如何计算
  • 公交公司财政补贴
  • 土地的入账科目
  • 私人银行卡给公司走账有影响吗
  • mysql不同数据库不同数据表导入数据
  • windowsserver2008r2密码重置
  • linux系统中的用户分为哪几类
  • wdcp的/www目录大小调整或增加分区/硬盘的方法
  • 怎么看solaris版本
  • linux删除大量文件方法
  • win8.1怎么打开设置
  • Ubuntu安装VMware tools
  • mac os x 10.9.5
  • 怎么彻底关闭windows更新
  • linux 如何查看
  • win8系统自带应用都打不开了怎么办
  • grep的结果 再次查找
  • nodejs入门教程
  • android消息队列使用
  • shell发送报文
  • 恶意软件清理
  • 无缝广告植入
  • node.js和go
  • 脚本控制三行三列怎么写
  • python作业题目
  • Android 使用的字体
  • 查找第一个字符
  • 怎么配置nodejs的环境
  • js截取数组方法
  • js判断ua
  • 北京市国家税务局电子税务局
  • 江苏发票真伪查询系统官网
  • 贵州税务发票流向查询
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设