Android:当app被激活"时执行代码,而不是在方向更改时执行

时间:2016-07-20 14:23:01

标签: android android-orientation activity-lifecycle

在我的申请中(minSdkVersion 17,但我对此很灵活),我只有一项活动。它显示了某种时间表。我想让它显示当天并滚动到正确的时间。 此功能已经完美运行。

我想在应用程序启动时或每次应用程序再次激活时(例如,在按下主页按钮后再次单击应用程序图标而不会在其间删除应用程序时)执行此操作。

但是,当旋转设备时,我不想这样做。

例如,我有一个方法:

private void scrollToNow() {
    // do the calculation and scroll all views to the correct position
    // this is code I already have fully functional!
}

我想在每次活动再次激活时执行它,但不是在方向改变时执行它。

我尝试了很多组合(onStartonResumeonCreate),但没有一个能够解决这个问题。我尝试使用savedInstanceState构建解决方案但失败了。

有人为我提供了一些提示或有用的链接吗?

非常感谢,

奥利弗

2 个答案:

答案 0 :(得分:2)

在您决定手动检查配置更改之前,请三思。

  

如果您的应用程序在特定配置更改期间不需要更新资源,并且您有性能限制要求您避免重新启动活动,那么您可以声明您的活动本身处理配置更改,这可以防止系统重新启动您的活动。

     

注意:自行处理配置更改会使使用备用资源变得更加困难,因为系统不会自动为您应用这些资源。当您必须避免因配置更改而重新启动时,此技术应被视为最后的手段,并且不建议用于大多数应用程序。

尝试在onSaveInstanceState中保存一些标志,并在onCreate中检查是否存在savedInstanceState,然后将其另存为字段。这将为您提供有关活动是否已重新创建的信息。或不。然后在' onResume'检查是否设置了此标志。如果没有,那么你就不会被重新创造出来'您的活动,因此您可以调用scrollToNow()

答案 1 :(得分:1)

  

我不想在屏幕方向改变时重新创建布局

您是否曾尝试将此行添加到AndroidManifest.xml android:configChanges="screenLayout|screenSize|orientation"中:

<activity
        android:name="youractivity"
        android:configChanges="screenLayout|screenSize|orientation"
        android:label="@string/title_activity_create_note"
        android:theme="@style/AppTheme"
        android:windowSoftInputMode="stateAlwaysHidden" />

有关详细信息,请查看:该页面中的manifest/activity-element转到 android:configChanges 部分并阅读。

添加此内容时,您必须自己处理onConfigurationChanged()方法而不是Android系统。

请仔细阅读该页面的注释部分:

  

注意:应避免使用此属性,并仅将其用作最后的手段。有关如何正确处理因配置更改而导致重启的详细信息,请阅读Handling Runtime Changes

我也在我的应用程序中使用它也许您也可以尝试这个:android:screenOrientation="nosensor"在该页面中您也可以找到有关它的信息。