ResultReceiver不survire到屏幕旋转(ResultReceiver doesn&#

2019-06-25 06:39发布

我在执行中的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。 这是正常的吗? 有什么办法,我可以用甚至允许在屏幕上旋转的通知? 本地广播?

Answer 1:

没有,

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


Answer 2:

我使用的是BroadcastReceiver使用注册LocalBroadcastManager并能正常工作。 这不是那么简单。 做一个更好的解决方案存在吗?



Answer 3:

我想,我偶然发现了同样的问题,在我的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;
        }
}

希望能帮助到你。 你可以要求进一步的细节,如果你喜欢。 干杯



Answer 4:

是的,这因为ResultReceiver正常可能是“无头”。

我试图挽救ResultReceiveronSaveInstanceState()但它没有工作,因为更新,这种情况发生而接收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



Answer 5:

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


文章来源: ResultReceiver doesn't survire to screen rotation