0

非同期操作のプロセスを UI に通知するデリゲート パターンを実装しようとしています。だから私はそのようなインターフェースを持っています:

public interface UpdateLibraryDelegate {
    public void startDownloadingLibrary();
    public void endDownloadingLibrary();
    public void processingLibrary(int progress);
    public void endProcessingLibrary();
}

アクティビティがあります:

public class HomeActivity implements UpdateLibraryDelegate{

   protected void onCreate(Bundle savedInstanceState) {
         ...
          Intent libraryIntent = new Intent(this, MyService.class);
          /*Here is where the problem is*/
          libraryIntent.putExtra(UPDATE_LIBRARY_DELEGATE, this);
         ...
   }

  /*Methods of the interface*/
  ...
  /**/
}

問題は明らかに、アクティビティがシリアライズ可能でもパーセル可能でもないため、インテントでアクティビティを送信できないことです。インテントでアクティビティを送信する方法はありますか? 私がやろうとしていることはばかげていますが、それを行うためのより合理的な方法はありますか? 私はAndroidで完全に新しいです...

ありがとう!

4

2 に答える 2

2

インテントでアクティビティを送信する方法はありますか?

いいえ。

私がやろうとしていることはばかげていますが、それを行うためのより合理的な方法はありますか?

コントラクト パターンはまったく問題ありませんが、コマンド パターンを使用したアクティビティ <-> サービス通信には適していません。これは疎結合パターンであり、コントラクト (デリゲートと呼んでいるもの) パターンに反します。

さらに、サービスでコマンド パターンを使用している場合、そもそもサービスを使用する理由は、サービスが少しの作業を終了している間にアクティビティがなくなる可能性があるためです。そのため、ここでは疎結合が使用されます。

サービスのより一般的なアプローチは、メッセージ パッシングを使用することです。

  • LocalBroadcastManager
  • SquareのOttoのようなサードパーティのイベントバス
  • aMessenger

アクティビティが存在する場合、アクティビティがサブスクライブできるイベントをサービスに発生させます。

アクティビティが行われている間のみサービスが提供される場合は、そもそもサービスを利用する理由を再考することをお勧めします。サービスに正当なニーズがある場合は、バインディング パターン ( bindService()) を使用できます。その場合、コントラクト/デリゲート パターンを慎重に使用できます。

于 2013-09-20T15:34:37.347 に答える