Android 如何在LifecycleObserver中获取LifecycleOwner?

Android 如何在LifecycleObserver中获取LifecycleOwner?,android,android-lifecycle,android-architecture-components,Android,Android Lifecycle,Android Architecture Components,我需要让LifecycleObserver中的LifecycleOwner将其传递给ViewModel observer 这是我的主要活动,我添加了LifecycleObserver public class MainActivity extends AppCompatActivity implements LifecycleOwner{ private LifecycleRegistry mLifecycleRegistry; @Override protecte

我需要让LifecycleObserver中的LifecycleOwner将其传递给ViewModel observer

这是我的主要活动,我添加了LifecycleObserver

public class MainActivity extends AppCompatActivity implements LifecycleOwner{

    private LifecycleRegistry mLifecycleRegistry;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.container, MainFragment.newInstance())
                    .commitNow();
        }

        mLifecycleRegistry=new LifecycleRegistry(this);
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
        getLifecycle().addObserver(new MyLifecycleObserver());
    }


    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }

}
这是我的观察者,我需要生命周期所有者

public class MyLifecycleObserver implements LifecycleObserver {


    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStartListener(){

        FirebaseMassage.startFirebase();

        MainFragment.massageViewModel.getMassage().observe(/*here I need the LifecycleOwner*/, textMassage -> {
            FirebaseMassage.updateFirebaseMassage(textMassage);
        });

    }
}

您不需要实现自己的LifecycleRegistry,只需使用AppCompativeActivity提供的LifecycleRegistry即可

public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      setContentView(R.layout.activity_main);

      if (savedInstanceState == null) {
          getSupportFragmentManager().beginTransaction()
                  .replace(R.id.container, MainFragment.newInstance())
                  .commitNow();
      }

      getLifecycle().addObserver(new MyLifecycleObserver());
  }
}
如果将startFirebase调用和viewmodel observer分开,则可以直接在片段中观察viewmodel的更改,即

MyLifecycleObserver在发出ON_START时启动firebase调用

public class MyLifecycleObserver implements LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStartListener(){
        FirebaseMassage.startFirebase();
    }
}
MainFragment直接观察ViewModel

public class MainFragment extends Fragment {

  @Override
  public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
      super.onViewCreated(view, savedInstanceState);
      massageViewModel.getMassage().observe(this, textMassage -> {
          FirebaseMassage.updateFirebaseMassage(textMassage);
      });
  }

您只需使用另一个签名即可获得
LifecycleOwner
,如:

public class MyLifecycleObserver implements LifecycleObserver {


    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStartListener(LifecycleOwner owner){
        ... 
    }
}

观察者方法可以接收零个或一个参数。如果使用(意味着您也可以使用零参数,但使用了IFF参数),则第一个参数必须是LifecycleOwner类型。使用Lifecycle.Event.ON注释的方法任何都可以接收第二个参数,该参数的类型必须为Lifecycle.Event

class TestObserver implements LifecycleObserver {
         @OnLifecycleEvent(ON_CREATE)
         void onCreated(LifecycleOwner source) {
               //one argument possible
              }
         @OnLifecycleEvent(ON_START)
         void onCreated() {
              //no argument possible
             }
         @OnLifecycleEvent(ON_ANY)
         void onAny(LifecycleOwner source, Event event) {
             //two argument possible only for ON_ANY event
             }
}

阿披舍克·库马尔回答的官方文件来源于此:

以下是文件本身:


观察者方法可以接收零个或一个参数。如果使用,第一个参数的类型必须为
LifecycleOwner

使用
Lifecycle.Event.ON注释的方法\u上的任何
都可以接收第二个参数,该参数的类型必须为Lifecycle.Event

类TestObserver实现LifecycleObserver{ @OnliFeCycleeEvent(在创建时) 已创建void(LifecycleOwner源){} @仅限iFeCycleeEvent(在任何情况下) void onAny(LifecycleOwner源,事件){} }
您能提供一个记录此内容的链接吗?@Pallguer谢谢。我特别寻找LifecycleOwner可以作为参数选择性地传递给OnLifecycleEvent注释的函数的文档。有文件记录吗?