2011-01-13 24 views
1

我試圖創建一個手錶服務註冊一個包,並根據嵌入在服務接口的API捆綁一定的元數據,執行一些其他任務。元數據主要由一個或多個屬性文件,所以我的想法是使用Bundle.findEntries()但由於元數據被嵌入在API包,我不能這樣做ServiceReference.getBundle().findEntries(),因爲這將試圖找到在服務實現屬性捆綁包,不在API捆綁包中。是否有一種方法讓一個bundle從ServiceReference獲取另一個bundle的Bundle實例?

我想過從ServiceReference對象類屬性得到服務API的類名,然後使用包管理服務或FrameworkUtil.getBundle(),但是這兩個要求Class - 但如何獲取服務接口的Class?執行此工作的軟件包可能尚未導入該類的軟件包,因此Class.forName()將不起作用。

我的另一種選擇是監視兩個包和服務事件:首先創建使用當服務註冊的第一個包含元數據包的註冊表,第二。在走下這條路之前,我期待看看是否有更簡單的方法。

回答

4

聲明:我沒有嘗試這樣做,但我有理由相信它應該做的工作。

您可以從ServiceReferenceObjectClass的包名獲得,現在我們有了,我們可以在框架中找到該包。給定一個,你可以這樣做

public Bundle getExporterOf(String package, ServiceReference ref) { 

    ExportedPackage[] packages = packageAdmin.getExportedPackages(packageName); 
    if (packages == null) { 
    return null; 
    } 
    for (ExportedPackage package : packages) { 
    Bundle[] importers = package.getImportingBundles()) { 
    if (importers == null) { 
     continue; 
    } 
    for (Bundle bundle : importers) { 
     if (bundle.getBundleId() == ref.getBundle().getBundleId()) { 
     return package.getExportingBundle 
     } 
    } 
    } 
} 

我們在這裏做什麼,就是找到具有給定軟件包名稱的包(可能有多個),找到一個註冊該服務進口包,並獲取導出該軟件包的軟件包。你或許可以使該方法更好一點。

+0

我從來沒有使用`PackageAdmin`得到ExportedPackages認爲,這適用於我需要什麼。謝謝! – 2011-01-13 18:59:26

相關問題