Java 弱引用活动
我想通过消息传递在我的Java 弱引用活动,java,android,android-service,weak-references,Java,Android,Android Service,Weak References,我想通过消息传递在我的活动和IntentService之间实现双向通信 在处理程序中类作为活动中的内部类实现: class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MessengerService.MSG_SET_VALUE: mC
活动
和IntentService
之间实现双向通信
在处理程序中
类作为活动中的内部类实现:
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MessengerService.MSG_SET_VALUE:
mCallbackText.setText("Received from service: " + msg.arg1);
break;
default:
super.handleMessage(msg);
}
}
}
以相同的方式实现my处理程序将导致以下警告:
此处理程序类应该是静态的,否则可能会发生泄漏
签出后,我将我的实现为一个静态嵌套类,如下所示:
private static class IncomingHandler extends Handler {
private final WeakReference<MainActivity> mainActivity;
IncomingHandler(MainActivity activity) {
mainActivity = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
MainActivity activity = mainActivity.get();
if(activity != null) {
activity.doStuff();
}
}
}
私有静态类IncomingHandler扩展了Handler{
私人最终WeakReference main活动;
收入管理员(主要活动){
mainActivity=新的WeakReference(活动);
}
@凌驾
公共无效handleMessage(消息消息消息){
MainActivity=MainActivity.get();
if(活动!=null){
activity.doStuff();
}
}
}
这是处理上述警告的安全方法吗
提前感谢。您完全可以忽略该警告:仅当消息以“延迟”方式发送时有效,而“延迟”对于Messenger
不适用,顺便说一句,如果您的活动和服务由同一进程托管,您只需使用“绑定本地服务”模式,无需Messenger
或such@pskink谢谢你的评论。是否可以使用绑定的本地服务模式实现双向通信?据我所知,我可以通过这种方式调用我的服务的方法,但我不能在不使用Messenger的情况下从我的服务调用我的活动的方法。让您的活动只调用“register”方法,并使用回调接口作为参数,然后,您的服务可以在回调Activity时使用该接口如果我的Activity实现了该接口,并且我将Activity实例传递给该服务,它不会在方向更改时导致内存泄漏,并使我的服务回调到“已销毁的”活动?所以过程如下:您在活动#onCreate
内部调用bindService
,在onServiceConnected
内部调用iface的“注册”方法,在活动#onestory
内部调用“取消注册”方法后跟取消绑定服务
您完全可以忽略该警告:仅当消息以“延迟”方式发送时才有效,而Messenger
则不是这种情况,顺便说一句,如果您的活动和服务由同一进程托管,您可以使用“绑定本地服务”模式,无需信使
或such@pskink谢谢你的评论。是否可以使用绑定的本地服务模式实现双向通信?据我所知,我可以通过这种方式调用我的服务的方法,但我不能在不使用Messenger的情况下从我的服务调用我的活动的方法。让您的活动只调用“register”方法,并使用回调接口作为参数,然后,您的服务可以在回调Activity时使用该接口如果我的Activity实现了该接口,并且我将Activity实例传递给该服务,它不会在方向更改时导致内存泄漏,并使我的服务回调到“已销毁的”活动?所以过程如下:您调用bindService
insideActivity\onCreate
,insideonServiceConnected
您用iface调用“register”方法,insideActivity\onDestroy
您首先调用“unregister”方法,然后调用unbindService