广播监听USB链接

一、项目清单中注册广播监听USB插拔。有2个意图过滤器,一个是自定义的android:name="myaction"(传送数据到广播类时用的),另一个是只监听USB插拔的android:name="android.hardware.usb.action.USB_STATE"。
     android:name=".DetactUSB"
     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 socketList = new ArrayList();
    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();
            }


        }
    }



}

更多相关文章

  1. Android仿人人客户端(v5.7.1)——网络模块时序图
  2. android 新闻系统客户端,服务器端采用JSP Servlet 实现
  3. 识别链接,可以点击TextView
  4. 淘宝(阿里百川)手机客户端开发日记第二篇 android首页之顶部轮播
  5. 通过超链接打开一些常见app(android:scheme运用)
  6. android蓝牙开发————实现服务端客户端通信
  7. android开发新浪微博客户端 完整攻略 [新手必读]
  8. 微信Android客户端后台保活经验分享

随机推荐

  1. Android(安卓)RecyclerView更新某条/一条
  2. Android4.4.2配置修改记录
  3. Android(安卓)Intent学习
  4. Android(安卓)代码混淆及遇到的问题
  5. [置顶] 我的博客索引
  6. Android(安卓)指纹识别(Touch ID)实例
  7. Android之获取画面大小
  8. Android(安卓)XRecyclerView实现多条目加
  9. android获取状态栏的高度。
  10. Android(安卓)Studio配置和安装(JAVA环境