在Android中使用ResultReceiver

从根本上说,我想build立一个IntentService的Activity的callback。 我的问题和这里回答的非常相似:

Restful API服务

但是,在答案代码中,活动代码被视为实施ResultReceiver。 除非我失去了一些东西,ResultReceiver实际上是一个类,所以它不能执行这个实现。

所以基本上,我问什么是将ResultReceiver连接到该服务的正确方法。 在这方面,我对Handler和ResultReceiver的概念感到困惑。 任何工作示例代码将不胜感激。

  1. 您需要从ResultReceiver扩展自定义resultreceiver类

  2. 然后在您的活动中实现resultceceiver接口

  3. 将自定义的resultreceiver对象传递给intentService,并在intentservice中获取接收者对象,并调用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); } } } 

在你的activity中实现Myresultreceiver.receiver接口,创build一个类variables

 Public MyResultReceiver mReceiver; 

在onCreate中初始化这个variables:

 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:将数据提供给Activity

编辑:你应该在onResume和setReceiver(null)onPause()中调用setReceiver(this)以避免泄漏。

你通过子类重写一个方法。 它不一定是一个接口来做到这一点。

例如:

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

我创build了一个演示如何使用ResultReceiver的简单示例。

主要活动

 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); } } 

我的服务

 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; } } 

在Android中使用Resulteceiver

  1. 创buildSomeResultReceiver从resultReceiver扩展

  2. 用on方法创build接口someReceiver,例如onReceivResult(int resultCode,Bundle resultData);

3.在某些接收器中使用某个接收器

  1. 创buildsomeService扩展IntentService并使用someresultReceiver.send()方法将结果从服务发送到someOne类(例如:MyActivity)

  2. 在Activity上实现一些接收者

6.在MyActivity类和setreceiver中实现someResultReceiver

  1. 用Intent和putExtra someResultreceiver instanse启动服务

有关更多详细信息ResultReceiver类请参阅此处input链接描述