Android (2.1) で Apache Felix 4.0.3 を正常に実行しており、実行時にバンドルを展開/削除できます。OSGI バンドル間の依存関係管理には、Felix DependenyManager を使用します。
ここで、実行中の OSGI バンドルから Android GUI にデータを送信して表示したいと考えています。
このタスクをどのように達成できますか? 使用できる何らかのコールバックはありますか?
Android (2.1) で Apache Felix 4.0.3 を正常に実行しており、実行時にバンドルを展開/削除できます。OSGI バンドル間の依存関係管理には、Felix DependenyManager を使用します。
ここで、実行中の OSGI バンドルから Android GUI にデータを送信して表示したいと考えています。
このタスクをどのように達成できますか? 使用できる何らかのコールバックはありますか?
BundleContext
「データを送信する」とは、バンドルが提供するサービスと対話することを意味すると仮定すると、これについて特別なことは何もありません。インスタンスが提供するインスタンスを保持し、Felix
それを使用してサービスを要求するようにしてください。データをバインドする方法は、他の Java プロジェクトと同様に、完全にあなた次第です。
かなり不自然な例として、次のようなことができます
Map<String, Object> config = new HashMap<String, Object>();
/// make settings here, including providing the bundles to start
Felix felix = new Felix(config);
felix.start();
BundleContext context = felix.getBundleContext();
// now get some service! Remember to do nullchecks.
ServiceReference<PackageAdmin> ref = context.getServiceReference(PackageAdmin.class);
PackageAdmin admin = context.getService(ref);
ExportedPackage[] exportedPackages = admin.getExportedPackages(felix);
// use the result to update your UI
TextView field = (TextView) findViewById(R.id.textfield);
field.setText(exportedPackages[0].getName());
フレームワークをセットアップし、サービスを取得し、データを使用して UI を更新します。
使用できるデフォルトのコールバックはありませんが、私が特に気に入っているトリックの 1 つは、UI 要素に OSGi 環境を認識させることです。そのようにして、フレームワークの変更を「リッスン」させることができます。以下は私が使用するものを簡略化したものです。私は複雑なものをApache Felix Dependency Managerに委譲することを好みます。
たとえば、リスナー インターフェイスがあるとします。
public interface ClockListener {
public void timeChanged(String newTime);
}
そして、現在の時刻でこのインターフェースを実装するすべてのサービスを定期的に呼び出すサービスがあります。TextField
このメソッドが呼び出されるたびに自分自身を更新する を作成できるようになりました。何かのようなもの、
public class ClockTextField extends TextView implements ClockListener {
public ClockTextField(Context context) {
super(context);
}
public void timeChanged(String newTime) {
setText(newTime);
}
public void register(BundleContext bundleContext) {
// remember to hold on to the service registration, so you can pull the service later.
// Better yet, think about using a dependency management tool.
bundleContext.registerService(ClockListener.class, this, null);
}
}