2014-09-11 90 views
0

我在代碼中的某處,我只有非常有限的權限,但必須將數據外部傳送到Android應用程序。 (Android系統C代碼) 顯然我不能在那裏啓動一個活頁夾服務,但我可以連接到一個已經運行的服務。因此,我的實現每隔一秒檢查一次服務是否可用,如果可用,它將連接並開始發送數據。這工作正常。Android Binder IPC addService:有沒有辦法再次刪除服務?

我的問題如下。如果我殺死服務二進制/進程,客戶端不知道該服務不再可用。有沒有辦法刪除我使用addService(...)添加的服務?客戶做getService()

回答

0

我可以通過定期在客戶端再次執行getService()來解決問題。像這樣,他們不會立即看到它,如果服務不見了,但他們在某個時候得到它。像這樣,如果服務再次可用,他們可以重新連接。

我沒有找到任何「刪除」服務。但是這種解決方法很好。

0

沒有API可以刪除服務句柄,但是當服務死亡時,服務管理器將使用svcinfo_death()釋放句柄。本地服務管理器中唯一有效的傳入事務代碼是SVC_MGR_GET_SERVICE,SVC_MGR_CHECK_SERVICE,SVC_MGR_ADD_SERVICESVC_MGR_LIST_SERVICES(請參閱service_manager.c)。

也就是說,您可能會發現將this solution應用於您的問題可能更有效且可靠,以決定是否需要對getService()的另一個呼叫。

+0

我不能使用「這個解決方案」部分,因爲兩端都是C代碼,我甚至沒有在jni中。客戶端是一些沒有權限的正在運行的android系統代碼,而服務器是一個用C語言編寫的小型可執行文件,由java調用,並從命令行啓動。 但是你是對的,我應該每隔幾秒鐘看一下客戶端內的check_service,這可能比getservice便宜。 我研究過service_manager之前(http://stackoverflow.com/questions/22460097/c-binder-without-addservice/25768973#25768973) – user3387542 2014-09-11 15:00:55

+0

或者你有一個想法如何從非常不允許的未經授權的情況下傳遞連續數據系統內部的一個正常的非根java應用程序?我無法以root身份啓動它們。但是我可以以root身份啓動第三個進程,這是我目前的解決方案。一個甚至沒有能力訪問文件系統。因此,我甚至沒有爲套接字打擾。 – user3387542 2014-09-11 15:09:48

+0

我想現在使用check_service,但是我找不到實現示例或者有關如何使用它的參考。 add_service()和getService()正在工作,但如何檢查服務是否可用?我的代碼與此https://github.com/vecio/AndroidIPC類似。 – user3387542 2014-09-16 10:14:05

相關問題