Bil*_*uer 59 service android callback android-activity
从根本上说,我想从IntentService建立一个Activity的回调.我的问题与这里回答的问题非常相似:
但是,在答案代码中,活动代码被视为实现ResultReceiver.除非我遗漏了什么,否则ResultReceiver实际上是一个类,所以它无法执行此实现.
基本上,我问的是将ResultReceiver连接到该服务的正确方法是什么.我对Handler和ResultReceiver概念感到困惑.任何工作示例代码将不胜感激.
Soh*_*ziz 117
您需要从ResultReceiver扩展自定义resultreceiver类
然后在您的活动中实现resultreceiver接口
将自定义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);
        }
    }
}
在您的活动中实现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:将数据提供回Activity
编辑:你应该在onResume中调用setReceiver(this),在onPause()中调用setReceiver(null)以避免泄漏.
Eri*_*o - 23
您通过子类重写方法.它不一定是一个接口来做到这一点.
例如:
intent.putExtra(StockService.REQUEST_RECEIVER_EXTRA, new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        if (resultCode == StockService.RESULT_ID_QUOTE) {
            ...
        }
    }
});
use*_*121 10
我创建了一个演示如何使用的简单示例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;
    }
}
| 归档时间: | 
 | 
| 查看次数: | 52002 次 | 
| 最近记录: |