我花了好幾天的時間試圖讓服務中運行的android ADK連接,而不是活動.....任何人都知道,如果它甚至可能?長時間運行ADK附件(服務?)
我想要服務處理inputStream和outputStream,這樣我可以在後臺讀取我的Arduino長時間。
當活動返回焦點時,我將與服務綁定並更新GUI。如果這是可能的,我最終希望用服務中的實時數據更新網站以進行遠程監控。
任何幫助,如果讚賞。我是編程新手,似乎無法找到有關此主題的更多信息。
謝謝advace尋求幫助。
我花了好幾天的時間試圖讓服務中運行的android ADK連接,而不是活動.....任何人都知道,如果它甚至可能?長時間運行ADK附件(服務?)
我想要服務處理inputStream和outputStream,這樣我可以在後臺讀取我的Arduino長時間。
當活動返回焦點時,我將與服務綁定並更新GUI。如果這是可能的,我最終希望用服務中的實時數據更新網站以進行遠程監控。
任何幫助,如果讚賞。我是編程新手,似乎無法找到有關此主題的更多信息。
謝謝advace尋求幫助。
您應該在主要活動(如here)中處理附件的加載,然後將對附件對象的引用傳遞給服務。
您現在可以綁定來自任何活動的服務並訪問輸入/輸出流。
您也可以關閉活動,並且當您斷開附件時,活動應該捕獲意向廣播並重新啓動以執行closeAccessory例程。
我不認爲有可能只傳遞一個對服務的引用。我試過並收到一個空指針問題。我還嘗試使用「put」將UsbAccessory包裝到啓動服務意圖中,因爲它不可分析,所以這不是一個選項。 – 2012-05-15 21:10:11
我能得到通過以下方式運行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斷開的接收器,因此它可以,如果設備斷開連接停止:的onCreate完成服務將調用onStartCommand的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();
}
。
@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();
}
}
};
連接的處理可能需要一些調整,但整體概念似乎工作。我希望這能幫助每個人!現在看起來很容易,但是我花了很長時間纔到這裏(我重複編程)
感謝您的鏈接。我試圖讓服務在不使用「應用程序」對象的情況下運行。經過數週的努力,我現在被迫使用了robotgrrl的技術。好消息是它的工作!我仍在研究細節,但計劃很快發佈我的代碼。讓adk的東西在後臺運行會增加處理配件連接/斷開的複雜性。用戶界面也必須以不同的方式處理。 – 2012-04-09 03:55:27
好!以下鏈接是我自己的項目,它在github上使用長時間運行的ADK服務。該程序定期將傳感器數據上傳到維基頁面,該程序還會讀取wiki頁面上的命令,並通過命令定期操作執行器。 https://github.com/takashiyamanoue/AdkWikiConnectorService。我們將有一個關於這個系統正在會議上發言,IIAI ESKM 2012,http://aai2012.iaiai.org/eskm2012/。希望這些信息能幫助你。 – 2012-07-19 00:33:56