【发布时间】:2013-03-12 02:15:47
【问题描述】:
我一直在努力建立链接here中指定的USB连接并成功实现它。它的工作正常接受它经常断开连接。我从this 链接和this 链接了解到,android 操作系统中存在一个错误,即没有 USB 连接事件的广播事件。我已经实现了一个接收器,用于获取不太重要的 USB 断开事件。我还参考了this 链接以创建与 USB 的稳定连接,即在 USB 连接后开始数据通信而不会丢失任何数据。当应用程序中有单个活动或单个屏幕时,整个事情都可以正常工作。
对于多屏幕,此连接存在问题,即连接不稳定,我在应用程序中有多个屏幕,我可以随时在任何活动中通过 USB 接收数据。所以我有 2 个问题,如果可能的话,我正在寻找一些代码的答案
- 如何在多个屏幕上通过 android 中的串行 USB 连接的设备建立稳定的连接
- 如何摆脱多屏应用中频繁断线的问题
任何帮助都会很棒
编辑:
我正在添加我的服务,该服务负责与 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();
}
}
【问题讨论】:
-
您可以通过几种不同的方式进行操作。我建议您创建一个处理 USB 连接的服务,并让您的活动通过您的服务与 USB 通信。
-
@Leco 我目前正在做那件事,但是一旦 USB 再次连接,它就会再次创建实例,我没有获取数据,因为我持有旧实例
-
没有看到你的代码来理解你的应用程序逻辑,想到的一件事是你可以让你不想在清单文件中重新实例化“singleTask”的活动的launchMode(android:活动标签下的launchMode="singleTask")。见developer.android.com/guide/topics/manifest/…
-
@Leco 我已经这样做了。检查我的编辑我添加了通过usb通信的服务代码
-
你读过developer docs吗?不确定他们是否可以帮助任何人。另外,当我在多个屏幕上使用 AOA 时,我使用的片段是我的
AOA_Activity extends Activity,然后是我的mainActivity extends AOA_Activity,然后我的不同片段通过mainActivity进行通信。不确定这是否有帮助。