2013-03-22 59 views
5

我一直在努力使鏈接​​中指定的USB連接成功實施。它的工作良好接受它經常斷開。我從​​鏈接和this鏈接知道有一個Android操作系統的錯誤,沒有USB連接事件的廣播事件。我已經實現了一個用於獲取USB斷開連接事件的接收器,這並不太重要。另外,我指的是this鏈接,以便與USB建立穩定的連接,即在USB連接後啓動數據通信而不會丟失。當應用程序中存在單個活動或單個屏幕時,這整個事情工作正常。AOA USB連接問題

對於多屏幕此連接的是有問題的,即連接不穩定,我必須在應用程序的多個畫面中,我可以通過USB的任何活動在任何時間接收數據。所以,我有2個問題,我努力尋找的答案與一些代碼,如果可能的

  1. 我怎樣才能通過串行USB android系統連接在多個屏幕
  2. 如何擺脫這種頻繁斷線的設備連接穩定在應用程序在多個屏幕

問題的任何幫助將不勝感激

編輯:

我加入我的服務,這是負責通信與USB和啓動一個線程連續接收數據

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Arrays; 

import android.app.AlertDialog; 
import android.app.Service; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.content.Intent; 
import android.hardware.usb.UsbManager; 
import android.os.IBinder; 
import arya.omnitalk.com.usb.R; 
import arya.omnitalk.com.usb.constants.FileReadingWritingConstants; 
import arya.omnitalk.com.usb.constants.GeneralConstant; 
import arya.omnitalk.com.usb.constants.UsbDataWriterConstants; 

import com.hoho.android.usbserial.driver.UsbSerialProber; 

public class UsbCommunicationService extends Service{ 

    public static ArrayList<String> _dataArray = new ArrayList<String>(); 
    private Thread mCommunicationThread = null; 

    private class ReadThread implements Runnable { 
     @Override 
     public void run() { 

      while (mCommunicationThread!= null && !mCommunicationThread.isInterrupted()) { 

       // Here I write code to parse data received via USB 

       }   
     } 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); // Creating object of usb manager 
     UsbDataWriterConstants.driver = UsbSerialProber.acquire(manager); // Acquiring usb channel 

     if (UsbDataWriterConstants.driver != null) { 
      try { 
       UsbDataWriterConstants.driver.open(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 

      try { 
       ReadThread mReadThread = new ReadThread(); 
       mCommunicationThread = new Thread(mReadThread); 
       mCommunicationThread.start(); 
      } catch (SecurityException e) { 
       DisplayError(R.string.error_security); 
       DisplayError(R.string.error_security); 
      } 
     } 

    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 

    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
     if (mCommunicationThread != null) 
      mCommunicationThread.interrupt(); 
     super.onDestroy(); 
    } 


} 
+0

你可以通過幾種不同的方式來解決這個問題。我建議您創建一個服務來處理USB連接,並讓您的活動通過您的服務與USB進行通信。 – Luis 2013-04-06 05:36:11

+0

@Leco我目前正在做這件事,但一旦USB連接再次它再次創建實例,我沒有獲取數據,因爲我拿着舊實例 – 2013-04-06 09:46:52

+0

沒有看到你的代碼來理解你的應用程序邏輯,有一件事想起來您可以製作不想在清單文件(activity:標籤下的android:launchMode =「singleTask」)中重新實例化「singleTask」的activity的launchMode。請參閱https://developer.android.com/guide/topics/manifest/activity-element.html#lmode – Luis 2013-04-06 14:55:37

回答

0

你可能有deconnections因爲你的服務只有綁定的服務。 首先啓動活動,綁定到服務,然後啓動。 當您切換到另一個活動,第一個被停止,所以解除綁定。此時,該服務不再受約束,因此它被殺死。 綁定的服務在這裏解釋:http://developer.android.com/guide/components/bound-services.html

你需要的可能是保持服務運行,只要USB連接。要做到這一點,你需要一個「老大難」服務,啓動一個,如下所述:

public class HomeActivity extends Activity { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      // ... 
      Intent intent = new Intent(this, UsbCommunicationService.class); 
      startService(intent); 
      // ... 
     } 
    } 

的: http://developer.android.com/guide/components/services.html 可以在接到相關事件,使用活動的onCreate開始爲您服務UsbCommunicationService將通過這種方法來啓動(在onStart()不推薦使用):

public class UsbCommunicationService extends Service { 
     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 

      // TODO : connect to USB... 

      // We want this service to continue running until it is explicitly 
      // stopped, so return sticky.  
      return START_STICKY; 
     } 
    } 

接下來,所有的活動可以「綁定」,「解除綁定」和「重新綁定」這一服務,將生存。 不要忘了停下來拔下事件,使用:

 stopSelf(); // Will actually stop AFTER all clients unbind... 

如果它幫助,請接受我的anwser /投上一票:)

+0

請檢查我的服務代碼。我正在做你正在這裏展示的東西。它沒有幫助 – 2013-04-09 05:16:19

+0

你使用onStart(Intent intent,int startId)而不是onStartCommand(...)。所以你不能返回START_STICKY,你的服務可能不是一個「已啓動」+「綁定」服務......同樣爲了確保不會被殺死,你的服務必須向狀態欄添加一個通知來請求前臺。 – Bonrry 2013-04-09 07:58:09

+0

在那個筆記上我可以說我的服務一直在運行。其次,我停止和啓動服務時曾經有必要,我的服務得到啓動,並在提供的事件,所以沒有相關的服務問題未啓動或殺死 – 2013-04-09 08:26:54

0

這裏是我的活動beeing註冊了我的代碼USB配件。

public class UsbAccessoryAttachedWorkaroundActivity extends Activity { 

    /** 
    * Used only to catch the USB_ACCESSORY_ATTACHED event, has it is not broadcasted to 
    * anything else than the activity with the right accessory_filter (no Service, nor Receiver...) 
    * DETACHED event is broadcasted as other events. 
    */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      Intent intent = new Intent(this, UsbService.class); 
      startService(intent); 
      finish(); // <- die ASAP, without displaying anything. 
    } 
    } 

這樣你就可以獲得所有CONNECT事件,因爲活動還沒有活動=> Android每次發現附件時都會重新啓動它...... 只有當沒有人綁定它時,我的服務纔會啓動我的HomeActivity。如果有人被綁定,這意味着UI已經存在,因此我只是通知我的聽衆USB連接回來了......

+0

感謝代碼Bonrry,但還有一個限制我不能重新啓動相同的活動,我必須做這種東西在背景上的一些不同的活動:)。這就是我在我提出的問題中要說的話 – 2013-04-09 11:15:48