安卓广播监听USB插拔
一、项目清单中注册广播监听USB插拔。有2个意图过滤器,一个是自定义的android:name="myaction"(传送数据到广播类时用的),另一个是只监听USB插拔的android:name="android.hardware.usb.action.USB_STATE"。
android:launchMode="singleTask">
二、广播类
public class DetactUSB extends BroadcastReceiver {
public static String MYACTION = "myaction"; //接收自定义action 传送的信息。
public static boolean USBconnected =false;
@Override
public void onReceive(Context context, Intent intent) {
//abortBroadcast();//当加上这条代码的时候,广播发送到此结束,即第其他广播不会再收到。
String action = intent.getAction();
if (action.equals(DetactUSB.MYACTION)) {
String name = intent.getStringExtra("name");
if(name .equals("ok")){
//获取数据做相应处理。
}
}else if (action.equals(DefaultView_Activity.ACTION)) {
USBconnected = intent.getExtras().getBoolean("connected");
if (USBconnected) { //USB is connected USB已经链接,跳转到Activity中
Intent myIntent = new Intent(context, XXXXXX.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(myIntent);
}else{ //USB no connected 提示USB未连接
USBconnected=false;
}
}
}
}
二、事件类中。 XXXXXX.class需要传送数据到广播中。
Intent receiveIntent=new Intent();
receiveIntent.putExtra("name", "ok");
MyApplication.getContext().sendOrderedBroadcast(receiveIntent, null);
例子:
USB链接后与PC端Socket数据交互线程中
public class MyServerTest implements Runnable {
public static Socket client = null;
public static ServerSocket serverSocket;
public static List
public Intent receiveIntent;
public MyServerTest() {
receiveIntent=new Intent();
receiveIntent.setAction(DetactUSB.MYACTION);
}
@Override
public void run() {
try {
serverSocket = new ServerSocket(8087);
//Log.e("TAG", "usb开启服务器启动等待客户端连接");
while (true) {//持续接收客户端
receiveIntent.putExtra("name", "ok");
MyApplication.getContext().sendOrderedBroadcast(receiveIntent, null);
Log.e("等待客户端", "等待客户端");
client = serverSocket.accept();//客户端对象
socketList.add(client);
Log.e("客户端", "已连接");
receiveIntent.putExtra("name", "accept");
MyApplication.getContext().sendOrderedBroadcast(receiveIntent, null);
doRead(serverSocket,client);
}
} catch (IOException e) {
e.printStackTrace();
// Log.e("IOException", e.toString());
}
}
}
public class DetactUSB extends BroadcastReceiver {
public static String MYACTION = "myaction"; //接收自定义action 传送的信息。
public static boolean USBconnected =false;
@Override
public void onReceive(Context context, Intent intent) {
//abortBroadcast();//当加上这条代码的时候,广播发送到此结束,即第其他广播不会再收到。
String action = intent.getAction();
if (action.equals(DetactUSB.MYACTION)) {
String name = intent.getStringExtra("name");
if(name .equals("ok")){
//获取数据做相应处理。
}
}else if (action.equals(DefaultView_Activity.ACTION)) {
USBconnected = intent.getExtras().getBoolean("connected");
if (USBconnected) { //USB is connected USB已经链接,跳转到Activity中
if (MyServerTest.socketList.size()>0){ //USB每链接一次,XXXXX.class中线程会打开一次8087端口,这个集合用来清空上次打开的端口,避免端口占用。
MyServerTest.socketList.clear();
}
Intent myIntent = new Intent(context, XXXXXX.class); //USB已经链接,跳转到Activity中
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(myIntent);
} else { //USB no connected 提示USB未连接
USBconnected=false;
if(DetactUSB.contextList.size()==0){
//DetactUSB.contextList.集合保存打开的xxxxx.class 当USB链接中断或USB链接失败时,关闭跳转成功时打开的xxxx.class 关闭上次链接打开的端口。
Utils.showToast("USB no connected");
}else{
Utils.showToast("USB no connected");
getFinish();
}
}
}
public void getFinish() {
try {
if(MyServerTest.socketList.size()>0 ) {
MyServerTest.client.close();
MyServerTest.serverSocket.close();
}else if(MyServerTest.socketList.size()==0 ) {
MyServerTest.serverSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if(DetactUSB.contextList.size()>0){
for(Activity context1:DetactUSB.contextList){
context1.finish();
}
}
}
}
更多相关文章
- Android仿人人客户端(v5.7.1)——网络模块时序图
- android 新闻系统客户端,服务器端采用JSP Servlet 实现
- 识别链接,可以点击TextView
- 淘宝(阿里百川)手机客户端开发日记第二篇 android首页之顶部轮播
- 通过超链接打开一些常见app(android:scheme运用)
- android蓝牙开发————实现服务端客户端通信
- android开发新浪微博客户端 完整攻略 [新手必读]
- 微信Android客户端后台保活经验分享