0

IntentService を介したアクティビティによって開始されたネットワーク操作を実現しています。

ただし、ダウンロード操作中に ProgressDialog を使用して UI をブロックしたいと考えています。

問題は、ProgressBar がアクティビティへのハンドルを持っていることです。これはアクティビティと強く結びついており、操作中に画面の向きが変更された場合に問題が発生する可能性があります。

Activity A が IntentService B を開始すると、すぐに ProgressDialog を導入できます。しかし、レシーバーが呼び出される前 (ネットワーク操作が完了する前) の場合、方向が変わります。ProgressDialog への孤立した参照になってしまうため、それを却下することはできません。

助言がありますか ?

4

2 に答える 2

2
  1. 「UIをブロックする」という意味ではないと思います。「無期限のアクティビティインジケーターを設置し、何かが完了するまで入力を無視する」という意味だと思います。
  2. その場合は、UI で ProgressBar ウィジェットを使用してください。ウィジェットの android:visibility="GONE" から始めます。バックグラウンド処理を開始するときは、android:visibility="VISIBLE" を設定し、ブロックしたい UI コントロールを無効にします。バックグラウンド作業が完了したら、すべてを逆にします。
  3. バックグラウンド作業が完了したらアクティビティに戻るには、2 つのオプションを実装します。コンテンツ インテントをアクティビティに送信する通知と、アクティビティのレシーバーを使用してインテントをブロードキャストすることです。アクティビティがバックグラウンドにある場合、通知が表示され、それをクリックすると、ユーザーはアクティビティに戻ります。アクティビティがフォアグラウンドにある場合は、onReceive() でブロードキャスト インテントを取得します。いずれにせよ、バックグラウンド作業が完了したことをユーザーに警告します (そして通知を無視します)。
  4. onPause() と onResume() を使用して、可視性と有効/無効の設定を保存または復元することにより、UI の状態を維持します。

このようにすれば、IntentService の実行中に Activity に何が起こってもかまいません。

また、 Android トレーニング クラスTransferring Data without Draining the Batteryも参照してください。効率的でユーザーフレンドリーなネットワーク操作を行うのに役立ちます。モバイル デバイスでネットワークを正しく使用するためのヒントは他にもたくさんあります。

于 2013-09-20T23:35:00.400 に答える