すべてが同じデータベースへのアクセスを必要とするさまざまなアクティビティを含むアプリケーションを作成しています。
すべてのアクティビティに共通する要素 (特に、アプリ固有のタイトル バーとその動作の一部、繰り返されるコードと変数) を持つ抽象クラスを設定しました。
サービスを介してデータベースへのアクセスを設定しました。このサービスはインスタンスを 1 つだけ持つべきだと思います。
サーバーとやり取りして通信するための推奨される方法は、バインディングを使用することです。
ただし、Binder と ServiceConnection の 2 つの追加クラスを指定する必要があるため、少し面倒に思えますが、確かに、すべてうまく機能します。
ただし、ここで問題が発生します。バインディングはアクティビティ固有です。共有抽象クラス コードからデータベースにクエリを実行できますが、サブクラス コードからは同じことができないようです。
私の抽象クラスに表示されるコード:
protected static DatabaseService autoservice;
protected static boolean serviceBound = false;
protected static ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
AutoBinder binder = (AutoBinder) service;
autoservice = binder.getService();
serviceBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
serviceBound = false;
}
};
サブクラスから serviceBound をチェックすると、常に false と返されます。私はそれを静的および非静的にしようとしました。
サービスの静的インスタンスを取得するシングルトン パターンは、DB をクエリする (より良い) 方法かもしれないと思いますが、Google がバインディングを思いついたのにはおそらく理由があります。
抽象スーパークラスとそのさまざまなサブクラスからデータベースにアクセスするための最良の (そして最もクリーンな) 方法は何でしょうか?