0

Android (2.1) で Apache Felix 4.0.3 を正常に実行しており、実行時にバンドルを展開/削除できます。OSGI バンドル間の依存関係管理には、Felix DependenyManager を使用します。

ここで、実行中の OSGI バンドルから Android GUI にデータを送信して表示したいと考えています。

このタスクをどのように達成できますか? 使用できる何らかのコールバックはありますか?

4

1 に答える 1

2

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);
    }
}
于 2012-10-10T19:39:26.777 に答える