在Android中使用ResultReceiver
从根本上说,我想build立一个IntentService的Activity的callback。 我的问题和这里回答的非常相似:
Restful API服务
但是,在答案代码中,活动代码被视为实施ResultReceiver。 除非我失去了一些东西,ResultReceiver实际上是一个类,所以它不能执行这个实现。
所以基本上,我问什么是将ResultReceiver连接到该服务的正确方法。 在这方面,我对Handler和ResultReceiver的概念感到困惑。 任何工作示例代码将不胜感激。
-
您需要从ResultReceiver扩展自定义resultreceiver类
-
然后在您的活动中实现resultceceiver接口
-
将自定义的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; } }
我现在要用EventBus做
在Android中使用Resulteceiver
-
创buildSomeResultReceiver从resultReceiver扩展
-
用on方法创build接口someReceiver,例如onReceivResult(int resultCode,Bundle resultData);
3.在某些接收器中使用某个接收器
-
创buildsomeService扩展IntentService并使用someresultReceiver.send()方法将结果从服务发送到someOne类(例如:MyActivity)
-
在Activity上实现一些接收者
6.在MyActivity类和setreceiver中实现someResultReceiver
- 用Intent和putExtra someResultreceiver instanse启动服务
有关更多详细信息ResultReceiver类请参阅此处input链接描述