android - 从方向更改恢复时,DialogFragment onCreateDialog() 在 onServiceConnected() 之前被调用

标签 android android-fragments android-service android-dialog android-dialogfragment

我的 DialogFragments 有一个大问题。

我的 DialogFragments 依赖服务连接才能正常运行。当用户按下按钮弹出对话框时,这是可以的,因为 Activity 在 onServiceConnected() 中绘制按钮,确保服务始终对 DialogFragment 可用。

public class GameActivity extends Activity {

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Start the service.
    Intent gameServiceIntent = new Intent(this, GameService.class);
    startService(gameServiceIntent);
    bindService(gameServiceIntent, mConnection, Context.BIND_AUTO_CREATE);

    ... 

  private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {

      // Assign the gameService object to a member variable.
      GameActivity.this.gameService = ((GameService.LocalBinder)service).getService();

      // Create a button that pops up a dialog.  
      // The dialog uses MainActivity.getGameService().

      ...

  public GameService getGameService() {
    return gameService;
  }

  ...

然后 DialogFragment 使用游戏服务。

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

  this.gameActivity = (GameActivity) getActivity();
  gameActivity.getService();

然而,在方向改变时(当用户在对话框打开的情况下旋转手机时),当恢复应用程序状态时,Android 在调用 onServiceConnected() 之前调用 DialogFragment.onCreateDialog()。然后当对话框调用 MainActivity.getGameService() 时,出现空指针异常和崩溃。

对于在 onServiceConnected() 中构建的所有其他 UI 组件,这也是一个问题。例如,一个 ListView 和一个 TableLayout。 在创建对话框时它们为空,因为 onCreateDialog() 在 onServiceConnected() 之前被调用。

我该如何解决这个问题?!

最佳答案

解决了类似的问题如下:

private Parcelable data;

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Parcelable serviceData = myService.getSomeData();
    outState.putParcelable("data", serviceData)
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    if (savedInstanceState != null) {
       // create from bundle
       data = savedInstanceState.getParcelable("data");
    } else {
       // create from service
       data = myService.getSomeData();
    }
    ...
}

关于android - 从方向更改恢复时,DialogFragment onCreateDialog() 在 onServiceConnected() 之前被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19460543/

相关文章:

android - onserviceconnected 从未调用过 : android

android - 在 alpha 测试中删除 apk 以上传具有相同版本代码的不同的 apk

java - 如何将linux命令从一个设备发送到通过usb otg连接的另一台设备?

android - com.firebase :firebase-client-android: VS com. google.firebase:firebase-核心

android - 如何防止 fragment 在 Activity 娱乐中触发 onCreate onCreateView

android - 如何以编程方式在设备中运行已安装应用程序的服务

android - Android 可以在应用程序处于前台时停止服务吗?

android - 为什么在尝试访问 EditText 数据时出现空指针异常?

java - 从 fragment 访问 SQLite 数据库

java - 稍后调用时 fragment View 属性为 null