<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                > 編寫:[kesenhoo](https://github.com/kesenhoo) - 原文:[http://developer.android.com/training/run-background-service/report-status.html](http://developer.android.com/training/run-background-service/report-status.html) 這章節會演示如何回傳IntentService中執行的任務狀態與結果給發送方。 例如,回傳任務的狀態給[Activity](# "An activity represents a single screen with a user interface.")并進行更新UI。推薦的方式是使用[LocalBroadcastManager](http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html),這個組件可以限制broadcast Intent只在自己的App中進行傳遞。 ### 利用IntentService 發送任務狀態 為了在IntentService中向其他組件發送任務狀態,首先創建一個Intent并在data字段中包含需要傳遞的信息。作為一個可選項,還可以給這個Intent添加一個action與data URI。 下一步,通過執行[LocalBroadcastManager.sendBroadcast()](http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html#sendBroadcast(android.content.Intent)) )來發送Intent。Intent被發送到任何有注冊接受它的組件中。為了獲取到LocalBroadcastManager的實例,可以執行getInstance().代碼示例如下: ~~~ public final class Constants { ... // 定義一個自定義的Intent動作名 public static final String BROADCAST_ACTION = "com.example.android.threadsample.BROADCAST"; ... // 定義一個附加鍵名來表示狀態用于包裝在一個Intent中 public static final String EXTENDED_DATA_STATUS = "com.example.android.threadsample.STATUS"; ... } public class RSSPullService extends IntentService { ... /* * 創建一個新的包含名Uri的對象 * BROADCAST_ACTION是一個自定義的Intent動作 * */ Intent localIntent = new Intent(Constants.BROADCAST_ACTION) // 把status放到Intent中 .putExtra(Constants.EXTENDED_DATA_STATUS, status); // 廣播Intent給應用中的接收器 LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent); ... } ~~~ 下一步是在發送任務的組件中接收發送出來的broadcast數據。 ### 接收來自IntentService的狀態廣播 為了接受廣播的數據對象,需要使用BroadcastReceiver的子類并實現[BroadcastReceiver.onReceive()](http://developer.android.com/reference/android/content/BroadcastReceiver.html#onReceive(android.content.Context,android.content.Intent) )的方法,這里可以接收LocalBroadcastManager發出的廣播數據。 ~~~ // 廣播接收器,用于接受IntentService更新的狀態 private class ResponseReceiver extends BroadcastReceiver { // 防止實例化 private DownloadStateReceiver() { } // 它會被注冊來接收Intent,當廣播接收器獲得這個Intent時調用。 @Override public void onReceive(Context context, Intent intent) { ... /* * 在這里處理Intent. */ ... } } ~~~ 一旦定義了BroadcastReceiver,也應該定義actions,categories與data用來做廣播過濾。為了實現這些,需要使用[IntentFilter](http://developer.android.com/reference/android/content/IntentFilter.html).如下所示: ~~~ // 用于現實照片的類 public class DisplayActivity extends FragmentActivity { ... public void onCreate(Bundle stateBundle) { ... super.onCreate(stateBundle); ... // 過濾器的動作條件是自定義的BROADCAST_ACTION IntentFilter mStatusIntentFilter = new IntentFilter( Constants.BROADCAST_ACTION); // 為http協議添加一個數據過濾器 mStatusIntentFilter.addDataScheme("http"); ~~~ 為了給系統注冊這個BroadcastReceiver和IntentFilter,需要通過LocalBroadcastManager執行registerReceiver()的方法。如下所示: ~~~ // 實例化一個新的 DownloadStateReceiver DownloadStateReceiver mDownloadStateReceiver = new DownloadStateReceiver(); // 注冊DownloadStateReceiver和Intent過濾器 LocalBroadcastManager.getInstance(this).registerReceiver( mDownloadStateReceiver, mStatusIntentFilter); ... ~~~ 一個BroadcastReceiver可以處理多種類型的廣播數據。每個廣播數據都有自己的ACTION。這個功能使得不用定義多個不同的BroadcastReceiver來分別處理不同的ACTION數據。為BroadcastReceiver定義另外一個IntentFilter,只需要創建一個新的IntentFilter并重復執行registerReceiver()即可。例如: ~~~ /* * 實例化一個新的動作過濾器. * 不需要數據類型過濾器. */ statusIntentFilter = new IntentFilter(Constants.ACTION_ZOOM_IMAGE); ... // Registers the receiver with the new filter // 用新的意圖過濾器注冊廣播接收器 LocalBroadcastManager.getInstance(getActivity()).registerReceiver( mDownloadStateReceiver, mIntentFilter); ~~~ 發送一個廣播Intent并不會啟動或重啟一個[Activity](# "An activity represents a single screen with a user interface.")。即使是你的app在后臺運行,[Activity](# "An activity represents a single screen with a user interface.")的BroadcastReceiver也可以接收、處理Intent對象。但是這不會迫使你的app進入前臺。當你的app不可見時,如果想通知用戶一個發生在后臺的事件,建議使用[Notification](http://developer.android.com/reference/android/app/Notification.html)。永遠不要為了響應一個廣播Intent而去啟動[Activity](# "An activity represents a single screen with a user interface.")。 **筆者評論:**使用LocalBroadcastManager結合IntentService其實是一種很典型高效的做法,同時也更符合OO的思想,通過廣播注冊與反注冊的方式,對兩個組件進行解耦。如果使用Handler傳遞到后臺線程作為回調,容易帶來的內存泄漏。原因是:匿名內部類對外面的Actvitiy持有引用,如果在Acitivity被銷毀的時候,沒有對Handler進行顯式的解綁,會導致[Activity](# "An activity represents a single screen with a user interface.")無法正常銷毀,這樣自然就有了內存泄漏。當然,如果用文章中的方案,通常也要記得在[Activity](# "An activity represents a single screen with a user interface.")的onPause的時候進行unRegisterReceiver,除非你有充足的理由為解釋這里為何要繼續保留。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看