我花了好几天试图让Android ADK连接在服务中运行而不是活动.....任何人都知道它是否可能?
我想让服务处理inputStream和outputStream,这样我就可以在后台长时间阅读我的Arduino。
当活动返回焦点时,我将与服务绑定并更新GUI。如果可能的话,我最终希望使用服务中的实时数据更新网站以进行远程监控。
任何帮助,如果感激。我是编程新手,似乎无法找到有关此主题的更多信息。
谢谢你的帮助。
答案 0 :(得分:2)
答案 1 :(得分:2)
我能够以下列方式运行ADK连接(不是完整代码。只有基本构建块):
首先,我有一个接收adk意图广播的活动(android系统服务基于adk元数据和清单)。
private static final String USB_ACCESSORY_ATTACHED = "android.hardware.usb.action.USB_ACCESSORY_ATTACHED";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getIntent().getAction() != null && getIntent().getAction().equals(USB_ACCESSORY_ATTACHED)) {
Intent service = new Intent(this, ADKservice.class);
service.putExtras(getIntent());
startService(service);
Intent launch = new Intent(this, MainActivity.class);
launch.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(launch);
}
this.finish();
}
如果意图与adk字符串匹配,它将启动adk服务并将意图信息传递给服务,启动用户界面活动并完成自身。
用户界面(MainActivity)现在就像任何其他服务一样绑定到服务,因此它可以通过服务回调调用公共方法和/或接收数据(也可以使用本地广播)。
ADKservice扩展了Runnable以监控usb连接。它还为adk断开连接注册接收器,以便在设备断开连接时停止:
@Override
public void onCreate() {
IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
registerReceiver(mUsbReceiver, filter);
mNotificationManager =(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("ADK Service")
.setContentText("Started");
startForeground(notifyID, mBuilder.build());
super.onCreate();
}
onCreate完成后,服务将调用onStartCommand,adk初始化开始。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartup " + mAccessory );
mAccessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
if (mAccessory != null) {
openAccessory(mAccessory);
}
return super.onStartCommand(intent, flags, startId);
}
private void openAccessory(UsbAccessory accessory) {
Log.d(TAG, "openAccessory: " + accessory);
UsbManager mUsbManager = (UsbManager) getApplicationContext().getSystemService(Context.USB_SERVICE);
mFileDescriptor = mUsbManager.openAccessory(accessory);
if (mFileDescriptor != null) {
FileDescriptor fd = mFileDescriptor.getFileDescriptor();
mInputStream = new FileInputStream(fd);
mOutputStream = new FileOutputStream(fd);
thread = new Thread(null, this, "ADKserviceThread");
thread.start(); // start runnable
}
public void run() {
// handle adk "usb" messages here
}
@Override
public void onDestroy() {
closeAccessory();
stopForeground(true);
super.onDestroy();
}
private void closeAccessory() {
try {
if (mFileDescriptor != null) {
mFileDescriptor.close();
}
} catch (IOException e) {
} finally {
mFileDescriptor = null;
mAccessory = null;
}
}
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
closeAccessory();
stopSelf();
}
}
};
连接的处理可能需要一些调整,但整体概念似乎有效。我希望能帮到大家!现在看起来很容易但是我花了很长时间才到这里(我重复编程新手)
答案 2 :(得分:0)
您应该在主要活动中处理附件的加载,例如here,然后将附件对象的引用传递给服务。
您现在可以从任何活动绑定服务并访问输入/输出流。
您也可以关闭活动,当您断开附件时,活动应该捕获意图广播并重新启动以执行closeAccessory例程。