2010-12-22 37 views
52

基本上,我想從IntentService建立對Activity的回調。我的問題是非常相似的人回答在這裏:在Android中使用ResultReceiver

Restful API service

然而,在回答代碼,活動代碼被視爲實現ResultReceiver。除非我失去了一些東西,否則ResultReceiver實際上是一個類,所以它不能執行這個實現。

所以,本質上,我問什麼是將ResultReceiver連接到該服務的正確方法。在這方面,我對Handler和ResultReceiver的概念感到困惑。任何工作示例代碼將不勝感激。

回答

98
  1. 您需要進行自定義resultreceiver類從 ResultReceiver

  2. 進而擴展實現resultreceiver接口在活動

  3. 傳遞自定義resultreceiver對象intentService和 intentservice只是fe tch接收方對象並調用 receiver.send()函數向 Bundle對象中的調用活動發送任何內容。

    這裏是customResultReceiver類:

    public class MyResultReceiver extends ResultReceiver { 
    
        private Receiver mReceiver; 
    
        public MyResultReceiver(Handler handler) { 
         super(handler); 
         // TODO Auto-generated constructor stub 
        } 
    
        public interface Receiver { 
         public void onReceiveResult(int resultCode, Bundle resultData); 
    
        } 
    
        public void setReceiver(Receiver receiver) { 
         mReceiver = receiver; 
        } 
    
        @Override 
        protected void onReceiveResult(int resultCode, Bundle resultData) { 
    
         if (mReceiver != null) { 
          mReceiver.onReceiveResult(resultCode, resultData); 
         } 
        } 
    
    } 
    

實現Myresultreceiver.receiver接口在你的活動中,創建一個類變量

Public MyResultReceiver mReceiver; 

初始化的onCreate這個變量:

mReceiver = new MyResultReceiver(new Handler()); 

mReceiver.setReceiver(this); 

通過這個mReceiver到intentService通過:

intent.putExtra("receiverTag", mReceiver); 

和IntentService取象:

ResultReceiver rec = intent.getParcelableExtra("receiverTag"); 

,並使用REC爲送什麼東西給活動:

Bundle b=new Bundle(); 
rec.send(0, b); 

這將在收到onReceiveResult的活動。您可以在以下位置查看完整的代碼:IntentService: Providing data back to Activity

編輯:您應該在onResume和onPause()中的setReceiver(null)中調用setReceiver(this)以避免泄漏。

22

您可以通過子類重寫一個方法。它不一定是一個接口來做到這一點。

例如:

intent.putExtra(StockService.REQUEST_RECEIVER_EXTRA, new ResultReceiver(null) { 
    @Override 
    protected void onReceiveResult(int resultCode, Bundle resultData) { 
     if (resultCode == StockService.RESULT_ID_QUOTE) { 
      ... 
     } 
    } 
}); 
+1

至於我可以告訴大家,這只是答案 - 您能否顯示相應的IntentService端代碼,用於爲send()方法解組ResultReceiver?這是我的問題。 – mobibob 2011-01-09 15:15:18

+0

...一半(原文如此)...我回過頭去研究Google IO的示例代碼,發現我正在讓我的「detattachable-resultreceiver」過於複雜。事實證明,在服務器端,額外的操作只需要像intent.getExtra(「receiver-key」)一樣進行檢索。沒有特別的魔法。 – mobibob 2011-01-09 16:29:19

+1

它非常簡單和方便。 – 2011-01-09 17:50:13

-4

在機器人

  1. 創建SomeResultReceiver使用Resulteceiver從resultReceiver

  2. 與例如方法創建接口someReceiver onReceivResult(INT發送resultCode,捆綁resultData)延伸;在someResultreceiver

3.使用someReceiver

  • 創建someService延伸IntentService並使用someresultReceiver.send()方法用於發送結果從服務到有人類(例如: MyActivity)

  • 上的活動

  • 6.instantiation someResultR實現somereceiver eceiver在MyActivity類和setreceiver

  • startService意圖和putExtra someResultreceiver instanse
  • 更多細節ResultReceiver類看到enter link description here

    3

    我已經創建了一個簡單的例子,演示如何使用ResultReceiver

    MainActivity

    public class MainActivity extends AppCompatActivity { 
    
        private final static String TAG = MainActivity.class.getSimpleName(); 
    
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main); 
    
         Intent serviceIntent = new Intent(this, MyService.class); 
         serviceIntent.putExtra("logName", "MAIN_ACTIVITY"); 
         serviceIntent.putExtra(MyService.BUNDLED_LISTENER, new ResultReceiver(new Handler()) { 
          @Override 
          protected void onReceiveResult(int resultCode, Bundle resultData) { 
           super.onReceiveResult(resultCode, resultData); 
    
           if (resultCode == Activity.RESULT_OK) { 
            String val = resultData.getString("value"); 
            Log.i(TAG, "++++++++++++RESULT_OK+++++++++++ [" + val + "]"); 
           } else { 
            Log.i(TAG, "+++++++++++++RESULT_NOT_OK++++++++++++"); 
           } 
          } 
         }); 
         startService(serviceIntent); 
        } 
    } 
    

    爲MyService

    public class MyService extends Service { 
    
        private final static String TAG = MyService.class.getSimpleName(); 
        public final static String BUNDLED_LISTENER = "listener"; 
    
        @Override 
        public void onCreate() { 
         super.onCreate(); 
    
        } 
    
        @Override 
        public int onStartCommand(Intent intent, int flags, int startId) { 
    
         String logName = intent.getStringExtra("logName"); 
         ResultReceiver receiver = intent.getParcelableExtra(MyService.BUNDLED_LISTENER); 
    
         Bundle bundle = new Bundle(); 
         bundle.putString("value", "30"); 
         receiver.send(Activity.RESULT_OK, bundle); 
         return Service.START_NOT_STICKY; 
        } 
    
        @Nullable 
        @Override 
        public IBinder onBind(Intent intent) { 
         return null; 
        } 
    
    }