2016-07-13 12 views
5

私はこの回答をhere、またこれをhereと読んでいます。私は自分のケースに最適なものを見つけようとしています。どのような種類の放送受信機を使用しますか?

onCreate()でサービスを開始します。ここでHTTPリクエストを行い、応答としてidを取得します。私はこのidを放送し、私の活動でそれを受け取る。

問題は、ドロワーを開いてオプションを選択するだけで、ユーザーが明らかに別のアクティビティーに移動できることです。ブロードキャストが欠落する可能性があります。

Activityのように拡張された抽象クラスを拡張することは明らかです。hereと言われていますが、私はその最高の解決策を100%確信していません。 IDを受け取る前にユーザーがアプリを終了することを決定したらどうなりますか?

編集:アプリアーキテクチャ

  • ユーザーは、カメラアプリを開いて、イメージファイルのパスを取得する意向を使って画像を取り込みます。
  • FormActivityここで、ユーザーが画像の詳細を追加できる場所を開始します。
  • ユーザーがアップロードをクリックし、ユーザーが入力したばかりのデータをQuizActivityに渡します。私は私Service開始QuizActivityonCreate()
    • がサーバに空のエントリを作成すると、私は、サーバー
  • への応答と
  • アップロード画像としてidを取得idそのIサーバーからの応答として取得し、ブロードキャストします。
  • QuizActivityユーザーがクリックすると、ユーザーが(彼は当然のクイズのためのデータを入力した場合)活性を残したり、クイズをアップロードするためにクリックするか決定するまで、民間分野でid格納それを受けて、登録entryIdReceiver
  • を持っていますアップロードをidとクイズのデータ​​で開始します。
  • ユーザーが引き出しを開いて別のActivityを選択するか、キャンセルをクリックしてクイズを作成する場合はIntentServiceを開始し、idを「空のクイズデータ」でアップロードし、ユーザーをMainActivityに移動します。

問題がある:私はまだidを受けていない、またはユーザーがクイズを追加することなく、引き出しを使用して別のActivityになったことを決定QuizActivity上としながら、UERは、アプリを閉じた場合どのような。私はまだサービスを開始し、idを「空のクイズデータ」でアップロードする必要があります。

+0

「アクティビティ」でネットワークコールをしていないのはなぜですか? –

+0

'Activity'がIDを受け取ることは絶対に必要ですか?一般的な放送は問題にならない。 –

+0

@ XaverKapellerだから、ユーザーが 'Activity'を残そうと思った場合にのみ、他のアクティビティを"聞く "ことができます – Mes

答えて

2

すべてのアクションを処理する抽象クラスを使用して、あなたのアクティビティにコールバックを送信するだけで、かなり良いことです。上記のあなたの質問の例を使って私はEventBusのように思えます。あなたがなど

使用FragmentActivity、AppCombatActivityを望む可能性があるため、特別なクラスとインタフェースの代わりに、抽象クラスを使用していても良く

そして

たとえば、あなたがあなたのサービスからの結果を受けて独自のクラスを、持っています登録されたすべての人を彼の活動に送ります。インターフェイスとネットの要求から結果を呼び出す:

public class NetRequestReceiver extends BroadcastReceiver { 

private List<Activities> registeredActivities; 

public static void getInstance() { 
    //Continue singleton initialing! 
    //.... 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    for (Activity act : registeredActivities) { 
     if (act instanceOf ReceivingCallback) { 
      act.onReceiveMessage(intent); 
     } else throw Exception("Activity missing ReceivingCallback"); 
    } 
}  

public void registerActivity (Activity, activity) { 
    if (!registeredActivities.contains(activity)) { 
     registeredActivities.add(activity); 
    } 
} 

public void unRegisterActivity (Activity, activity) { 
    if (registeredActivities.contains(activity)) { 
     registeredActivities.remove(activity); 
    } 
} 

public interface ReceivingCallback { 
    onReceiveMessage (Intent intent); 
} 

} 

をその後、すべてのあなたの活動には、次のリスナーを追加します。しかし、(!)あなたの上の登録レシーバーを忘れないでください!結果を受け取るためのサービス!

public class MainActivity extends Activity implements NetRequestReceiver.ReceivingCallback { 

public void onStop() { 
    super.onStop() 
    NetRequestReceiver.getInstance().unRegisterActivity(this); 
} 

public void onResume() { 
    super.onResume() 
    NetRequestReceiver.getInstance().registerActivity(this); 
} 

@Override 
public onReceiveMessage (Intent intent) { 
    //put here whaterver you want your activity 
    //to do with the intent received 
} 
} 

上記のデザインを使って、どう思いますか?私たちは今やインターフェイスとして単一のReceiverとCallbackを持っています。 Fragment、Activity、FragmentActivity、および他のクラスを使用して、同じ動作を貼り付けることなく、ブロードキャストと(!)によるサービスからの結果を受け取ることができます!

プレゼンテーション、ビュー、レシーバーなどの別のレイヤーを分割しているため、これも素晴らしいです。サービスでネットリクエストを呼び出します。このサービスはブロードキャストに結果を送信し、登録されたすべてのアクティビティにデータを送信します。

はい、EventBusのようですが、あなたの質問に基づいて、サービスからさまざまなアクティビティへのリスン接続に必要なものだけでなく、より優れた構造を持っています。

1

たぶん、スティッキーブロードキャストを送信することができます。システムはそれが破壊されたアクティビティさえも保持し、あなたの登録プロパティー 受信機がすぐにインテントを受け取ることができます。

しかしsendStickyBroadcastが廃止され、あなたがそれを使用することを決定した場合、あなたののAndroidManifest.xml

android.permission.BROADCAST_STICKY 

を宣言することを忘れないでください気づきます。

関連する問題