ここで考慮する必要があるのは、入力と出力の 2 つの部分です。
ユーザー入力
ライブラリで処理する必要があるイベントが Android イベントにマップされる場合、メソッド名とシグネチャを複製しboolean
、呼び出しが既に処理されたかどうかを示す値を返す既存のライブラリの一部で使用されているものと同様のアプローチを使用します。
そのために、ライブラリとユーザー アクティビティの間のブリッジとして機能するクラスを作成し、次のメソッドを定義します。
public boolean onKeyDown (int keyCode, KeyEvent event) {
// Handle here the key event in the appropriate way
// if the pressed key was not to be handled by your library, simply return false
// else, handle it and return true
}
次に、呼び出し元のアクティビティで、同じメソッドをオーバーライドし、適切に呼び出します
// We assume your bridge class is already instantiated and called `bridge`
@Override
public boolean onKeyDown (int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);
if (bridge.onKeyDown(keyCode, event)) {
return true;
}
// User code for other keys here
}
onStart
必要に応じて、このパターンを他のメソッドに拡張します。これは、 のAction Bar Drawer Toggleなど、一部の Android サポート ユーティリティで既に使用されていますonOptionsItemSelected
。私は個人的にヘルパーでこのパターンを使用しており、非常にうまく機能しています。
データ出力
実行している処理の種類によっては、ブリッジ クラス メソッドを介して、またはリスナーを使用して、結果を直接公開することができます。
計算が高速で、常にget
ではないが頻繁に必要な場合は、メソッドを使用すると便利な場合があります。
public Object getResult () {
// Use an appropriate return type and method name
}
ただし、結果が遅いため、または処理時に 1 回しか使用されないために結果が別のスレッドで実行される場合は、 LoadersフレームワークCallbacks
に見られるものと同様のタイプのインターフェースを使用する方がよい場合があります。
ブリッジ クラス内で、次のようなインターフェイスを定義します。
public class Bridge {
interface Callbacks {
void onSomeResultComputed (Object result);
void onSomeOtherResultComputed (Object result);
// etc.
}
// Other methods and fields
}
次に、特定のメソッドを使用するか、onCreate
上記のパターンに従う を使用して、クライアントにこのコールバックを登録させます。クライアントコードは次のようになります
public class SomeActivity implements Bridge.Callbacks {
[...]
@Override
protected void onCreate () {
super.onCreate();
bridge.onCreate(this);
}
[...]
@Override
public void onSomeResultComputed (Object result) {
// Handle the result here
}
@Override
public void onSomeOtherResultComputed (Object result) {
// Handle the result here
}
}
繰り返しになりますが、Google はすでに、ローダーなどの一部の Android ユーティリティや一部の Google Play Services クラスでこのパターンを使用しており、非常にうまく機能しています。
リスナーの場合は、コストのかかる計算を並列スレッドで実行し (場合によっては を使用AsyncTask
)、メイン スレッドで常にCallbacks
メソッドを再度呼び出すことを忘れないでください。