Android Service 通知Activity更新介面的方法

來源:互聯網
上載者:User

Android的最重要的組件式service和activity,那麼在使用的過程中,我們最常遇到的問題是他們之間的通訊問題。當然今天我們不研究底層的實現問題,我從上層的應用的如何使用的角度進行研究。

首先Activity調用Service

這個是比較基礎的,它有兩種常見的方法;

第一, 通過Intent,這個比較簡單了,可以指定package name和class name的方式來調用,Intent.setClassName這個成員即可。通過putString來裝載資料,startService(intent)即可例子如下:

Intent regIntent = new Intent(“com.service”);

regIntent.putExtra(“data”, "helloData");

startService(regIntent);

第二, 通過IPC,這個比較麻煩,一般用不著,這裡不談

但是,反過來,Service如何將一些狀態告訴Activity呢?方法有兩種

第 一、 service 通過廣播的形式發送broadcast,我們寫一個broadcastReceiver即可,通常的情況,將broadcastReceiver寫成 Activity的內部類,這個onReceiver可以直接調用activity的方法來更新介面。但是內部類只能採用代碼註冊的方法
registerReceiver(),不能再AndroidManifest.xml檔案中進行靜態聲明,因為內部類要依賴於外部類而存在的。如果你 一定要用AndroidManifest來註冊receiver,那麼只能把broadcastReceiver寫成單獨的檔案的public類。這時 候,你想更新介面就比較麻煩了,你只能自己把你要更新的activity運行起來,然後再向這個activity的內部類發廣播的訊息來更新介面

第 二、 service直接向activity發intent。在service裡面進行startActivity是屬於在Activity外 startActivity即在task外啟動activity,因此,必須在intent加入一個參數如下:

Intent intentSend = new Intent(Constants.ACTION_STATUS);

intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent1.putExtra(“statues“,“end“);

context.startActivity(intent1);

但 是此時會引發的一個問題是,多次startActivity會導致很多的activity實現被運行,這肯定不是我們要的,我只要一個Activity就 可,此時,我們要在androidManifest裡面對這個activity的launchMode設定為singleInstance

<activity android:name="com.demo.Activity"

android:label="@string/online" android:launchMode="singleInstance">

記住啦,有人設定為singleTask,也可以,但他們有一點區別。

同時記住要更新intent,這樣getInstent才可以得到每次的新執行個體

@Override

protected void onNewIntent (Intent intent){

setIntent(intent);

}

在後台啟動並執行Service,有時候也需要通知前台的Activity,向Activity發送一些資料。例如,當資料下載已經完成或者音樂播放結 束時,為了降低程式的耦合,使用Intent在Service和Activity之間通訊是一個不錯的方案。在Activity中註冊一個 BroadcastReceiver,當Service有資料發送給Activity時,構建一個Intent並調用sendBroadcast()方法 將資料發送給Activity。

在chapter8_1的基礎上做適當修改,使得音樂播放結束後,MainActivity可以收到來自MusicService的通知。首先,為 MediaPlayer註冊一個OnCompletionListener,當音樂播放結束後,向MainActivity發送Intent。

 
  1. MediaPlayer.OnCompletionListener listener = new MediaPlayer.OnCompletionListener() {  
  2.  
  3. public void onCompletion(MediaPlayer arg0) {  
  4.     //MusicService使用廣播方式向MainActivity發送資料  
  5.     Intent intent = new Intent(MUSIC_COMPLETED);  
  6.     intent.putExtra("msg", getText(R.string.music_completed));  
  7.     sendBroadcast(intent);  
  8.     }  
  9. }; 

接下來,要為MainActivity註冊一個BroadcastReceiver,來監聽來自MusicService的資訊。當 MusicReceiver接收到來自MusicService的廣播後,彈出一個Toast提示使用者。MainActivity增加的代碼如下所示:

 
  1. class MusicReceiver extends BroadcastReceiver {  
  2.     @Override  
  3.     public void onReceive(Context arg0, Intent arg1) {  
  4.         String action = arg1.getAction();  
  5.         if (action.equals(MusicService.MUSIC_COMPLETED)) {  
  6.             //從MusicService接收廣播訊息,彈出Toast  
  7.             String msg = arg1.getStringExtra("msg");  
  8.             Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT)  
  9.                     .show();  
  10.         }  
  11.     }  
  12. }  
  13. @Override  
  14. protected void onPause() {  
  15.     //登出BroadcastReceiver  
  16.     unregisterReceiver(receiver);  
  17.     super.onPause();  
  18. }  
  19.  
  20. @Override  
  21. protected void onResume() {  
  22.     IntentFilter filter = new IntentFilter(MusicService.MUSIC_COMPLETED);  
  23.     if (receiver == null)  
  24.         receiver = new MusicReceiver();  
  25.     //註冊BroadcastReceiver  
  26.     registerReceiver(receiver, filter);  
  27.     super.onResume();  

如 果有多個Activity需要註冊BroadcastReceiver來監聽來自Service的訊息該怎麼辦?一個一個註冊,顯然比較麻煩。可以通過定 義一個父Activity來註冊BroadcastReceiver,其他的Activity繼承這個父類,達到簡化程式的目的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.