0

私はAndroidアプリケーションを持っています。これは、AlarmManagerを使用してイベントをスケジュールします。AlarmManagerからインテントを受信すると、ドメインロジックは、DBへのアクセスやインテントのブロードキャストなどの作業を行う必要があります。現在、シングルトンを使用して、BroadcastReceiver(マニフェストに登録されている)からドメインロジックにアクセスします。

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Singleton.getInstance().onAlarmFired();
    }
}

このシングルトンは、同じようにアクティビティとサービスで使用されます。正常に動作しますが、シングルトンはアンチパターンと見なされており、コードをテストでカバーしたいので、別の解決策を探しています。

問題は、このシングルトンの代わりにサービスを使用する方が良いのではないかということです。このような:

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        startService(new Intent(intent.getAction());
    }
}

メリットとデメリットは何ですか?そして、アクティビティからサービスと通信するための最良の方法は何でしょうか?MyApplicationでサービスにバインドし、getApplication()メソッドを使用してアクティビティとサービスへの参照を提供することを考えています。

4

1 に答える 1

2

問題は、このシングルトンの代わりにサービスを使用する方が良いのではないかということです。

はい、とてもそうです。応答に関する主な指示は、実行がメインスレッドで実行されており、が10秒以上生きているBroadcastReceiver.onReceive()場合はすぐに死の候補になるため、メトッド内で費やす時間をできるだけ少なくすることです(のドキュメントを参照してください)。 more)。BroadcastReceiver

代わりにaを呼び出しServiceて作業を行うことは、完全な代替実装であり、onReceive()非常に迅速に戻ります。

何をしているかに応じて、メソッドを呼び出すServiceためにバインドするか、単にデータを送受信するためActivityに使用し続けることができます(後者の場合はサポートライブラリを確認することをお勧めします)。IntentsLocalBroadcastManager

MyApplicationでサービスにバインドし、getApplication()メソッドを使用してアクティビティとサービスへの参照を提供することを考えています。

私はこれに強く反対します。Application多くの場合、アンチパターンとしてもクラスを使用することを検討します。ライフサイクルは、作成されたシングルトンよりもタブを維持するのが簡単ではありません。代わりに、Serviceを使用するためにバインドする場合Activityは、現在フォアグラウンドにあるときにアクセスしたいものにバインドします。

編集:システムサービスについてのあなたの質問に

システムサービスとアプリケーションサービスは大きく異なります。システムサービスは、サービスではありません(SDKの定義では)。これらはプロセス内で実行されるシングルトンオブジェクトでsystem_serverあり、中断から保護され、AIDLおよびIPCを使用してアクセスできるマネージャーオブジェクトと通信します。

アプリケーションのシングルトンには、同じような贅沢はありません。アプリケーションがクラッシュした場合、Androidはオブジェクトの再起動を支援できません。ただし、さらに重要なのは、登録済みのシステムコンポーネントではないため、ここでバックグラウンドでコードを実行している場合、Androidはアプリケーションが有効なバックグラウンド作業を行っていると認識せず、アプリケーションがそうでない場合、低メモリキルのターゲットになる可能性が高くなります前景に。

したがって、技術的にはシングルトンを使用することはできますが、コードを従来のコードに移行することServiceはベストプラクティスと見なされ、プラットフォーム自体から最大のメリットが得られます。

于 2012-07-25T22:38:47.170 に答える