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

时间:2017-09-19 10:54:07

标签: android android-architecture-components android-architecture-lifecycle

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

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

我如何在AppCompatActivity的setContentView()中获取基于Activity的基于上下文的方法?

2 个答案:

答案 0 :(得分:3)

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

除此之外,您的代码中存在一些问题:

1)

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

AppCompatActivity extends FragmentActivity 
FragmentActivity extends SupportActivity 
SupportActivity extends Activity implements LifecycleOwner

2)

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

2a)的

如果您的活动延长了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方法本身。

答案 1 :(得分:-1)

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

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.