Android 架构组件:使用 LifecycleOwner 时获取 Activity 方法

Android Architecture components : Get Activity methods when using LifecycleOwner

在实现架构组件时我遇到了这个问题

import android.arch.lifecycle.Lifecycle
import android.arch.lifecycle.LifecycleOwner
import android.os.Bundle
import com.reversebits.trendyvidz.R

class MainActivity : LifecycleOwner {

    override fun getLifecycle(): Lifecycle {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onCreate(savedInstanceState: Bundle?) {
        setTheme(R.style.AppTheme) //This shows error
        setContentView(R.layout.activity_main) //This shows error
        init()
    }

    private fun init() {
        when {
            isNetworkAvailable() -> toast("Yes Avail")
            else -> toast("No") 
        }
    }
}

我应该如何在这里获得 Activity 基于上下文的方法,例如 AppCompatActivity 的 setContentView()

好的,我明白了,
我只需要这样做:

class MainActivity : AppCompatActivity(), LifecycleOwner {

因为 LifecycleOwner 只是一个只有一个方法的接口

override fun getLifecycle(): Lifecycle {
        TODO("Not implemented") //To change body of created functions use File | Settings | File Templates.
    }

而且我可以在实现 LifecycleOwner 之后用这个注释来注释方法。

@OnLifecycleEvent(Lifecycle.Event.ON_START) etc.

正如已经指出的那样,如果你想创建一个 Activity,你需要扩展 Activity。


除此之外,您的代码中还有几个问题:

1)

如果您使用支持库 26.1.0+ 和生命周期 1.0.0-alpha9-1+ 生命周期已经包括在内,因为

AppCompatActivity extends FragmentActivity 
FragmentActivity extends SupportActivity 
SupportActivity extends Activity implements LifecycleOwner

2)

如果您使用旧的支持库或生命周期,您有两个选择。

2a)

如果您的 activity 扩展了 FragmentActivity,您将改为扩展 LifecycleActivity,仅此而已。

2b)

如果你不能这样做,你会实施 LifecycleRegistryOwner,例如:

class MyActivity extends AppCompatActivity implements LifecycleRegistryOwner {
    private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

    @Override
    public LifecycleRegistryOwner getLifecycle() {
        return mLifecycleRegistry;
    }
}

示例代码到此结束,但我没有看到任何实际调度事件的代码。在调查当前 SupportActivity 后发现它正在使用 ReportFragment 来调度所有事件。添加此以正确调度事件:

protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ReportFragment.injectIfNeededIn(this);
}

@CallSuper
protected void onSaveInstanceState(Bundle outState) {
    this.mLifecycleRegistry.markState(State.CREATED);
    super.onSaveInstanceState(outState);
}

还有一点,这是一个错误:

@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate(savedInstanceState: Bundle?) {

方法onCreate触发了ON_CREATE事件。不是相反。你会得到这样的堆栈溢出错误。

您在方法上使用了 @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) 注释,希望在 onCreate 被调用后自动触发,而不是 onCreate 方法本身。