我在执行中的Android REST客户端。 我看到使用的示例Service
执行连接到服务器和ResultReceiver
通知操作完成的。 我打电话从一个片段的服务,如果我尝试在服务运行时旋转屏幕,在getActivity()方法ResultReceiver
因为可能是片段是不是在布局再返回null。
片段中的回调方法:
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
Response response = (Response) resultData
.getSerializable(RestService.RESULT);
if (resultCode == RestService.SUCCESS
&& response != null) {
if (getActivity() != null) {
recommendationResponse = response;
getLoaderManager().restartLoader(0, new Bundle(),
Fragment.this);
}
}
}
该getActivity()
返回null。 这是正常的吗? 有什么办法,我可以用甚至允许在屏幕上旋转的通知? 本地广播?
没有,
android:configChanges="orientation"
是不是一个解决方案。
要使用ResultReceiver我:
其保存在方位的变化:
@Override public void onSaveInstanceState(Bundle outState) { outState.putParcelable(Consts.RECEIVER, mReceiver); super.onSaveInstanceState(outState); }
复位接收器:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (savedInstanceState != null) { mReceiver = savedInstanceState.getParcelable(Consts.RECEIVER); } else { mReceiver = new MyResultReceiver(new Handler()); } mReceiver.setReceiver(this); }
这里是我ResultReceiver类:
import android.os.Bundle;
import android.os.Handler;
import android.os.ResultReceiver;
public class MyResultReceiver extends ResultReceiver {
private Receiver mReceiver;
public MyResultReceiver(Handler handler) {
super(handler);
}
public void setReceiver(Receiver receiver) {
mReceiver = receiver;
}
public interface Receiver {
public void onReceiveResult(int command, Bundle resultData);
}
@Override
protected void onReceiveResult(int command, Bundle resultData) {
if (mReceiver != null) {
mReceiver.onReceiveResult(command, resultData);
}
}
}
我使用的是BroadcastReceiver
使用注册LocalBroadcastManager
并能正常工作。 这不是那么简单。 做一个更好的解决方案存在吗?
我想,我偶然发现了同样的问题,在我的ResultReceiver的onReceivedResult方法验证为NULL解决它。 这里发布的代码工作在一个工人的片段(片段没有UI和的onCreate setRetainInstance(真))
protected void onReceiveResult(int resultCode, Bundle resultData) {
//Verify activity
if(getActivity() != null){
//Handle result
}else{
notificationPending = true;
}
}
该notificationPending标志有助于片段保持挂起的通知如果该活动没有被发现(活动不适用于片段断开)。
当片段重新附接至活动我执行此逻辑
public void onAttach(Activity activity){
super.onAttach(activity);
if(notificationPending){
//Handle notification
notificationPending = false;
}
}
希望能帮助到你。 你可以要求进一步的细节,如果你喜欢。 干杯
是的,这因为ResultReceiver正常可能是“无头”。
我试图挽救ResultReceiver
在onSaveInstanceState()
但它没有工作,因为更新,这种情况发生而接收Fragment
被破坏,丢失,以及回调太引用。
一种解释和一个可能的解决方案可以在这里找到: https://stanmots.blogspot.com/2016/10/androids-bad-company-intentservice.html
关于此问题的另一个好读: https://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
我的完整的解决方案如何使用ResultReceiver
可以在这里找到: https://stackoverflow.com/a/54334864/6747171
该getActivity()返回null。 这是正常的吗?
安卓的活动设备旋转后重建。
活动后重建它不拥有旧context.that的,为什么你越来越getActivity()
为空
有什么办法,我可以用甚至允许在屏幕上旋转的通知? 本地广播?
如果你不想活动,以重新在屏幕上rotation.mention在清单如下
<activity
android:name=".MyActivity"
android:configChanges="orientation" <<<<<<<<<
android:label="@string/app_name"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
而最后你将不得不覆盖活动如下。
@Override
public void onConfigurationChanged(Configuration newConfig)
{
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
}