为什么在关闭手机时输入OnCreate()?

时间:2012-08-09 21:00:34

标签: java android api android-activity

我编写了我的第一个Android应用程序并且是Android开发(以及Java)的新手。我有PreferenceActivity,并注意到当显示活动并关闭移动时,它的onCreate()再次被调用。更令人困惑的是静态成员MyFirstAppActivity.camera不再存在导致异常。我可以在那里检查null,但我想知道为什么会发生这种情况并且最好的方法是避免它?

public class SettingsActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

     // Root
        addPreferencesFromResource(R.xml.preferences);

        // get list of available resolutions

        Object[] previewSizes = MyFirstAppActivity.camera.getParameters()
                .getSupportedPreviewSizes().toArray();

        // split object properties into two arrays

        String[] ps=new String[previewSizes.length];

        for(int i=0;i<previewSizes.length;i++)
        {
            try
            {
                int width=((Size)previewSizes[i]).width;
                int height=((Size)previewSizes[i]).height;
                ps[i]=width+"x"+height;
            }
            catch(Exception ex)
            {}
        }

        // get list of available resolutions

        Object[] recordingSizes = MyFirstAppActivity.camera.getParameters()
                .getSupportedPictureSizes().toArray();

        // split object properties into two arrays

        String[] rs=new String[recordingSizes.length];

        for(int i=0;i<recordingSizes.length;i++)
        {
            try
            {
                int width=((Size)recordingSizes[i]).width;
                int height=((Size)recordingSizes[i]).height;
                rs[i]=width+"x"+height;
            }
            catch(Exception ex)
            {}
        }

        Preference prefPreviewSizes = getPreferenceManager().findPreference("previewSizes");
        Preference prefRecordingSizes = getPreferenceManager().findPreference("recordingSizes");

        ((ListPreference) prefPreviewSizes).setEntries(ps);
        ((ListPreference) prefRecordingSizes).setEntries(rs);

    }
}

2 个答案:

答案 0 :(得分:1)

您可能需要查看Android's lifecycle信息。

为了让事情变得更好,您应该实施onPauseonResume,因为每次更改“活动”或旋转手机时都会调用它们。我假设通过关闭你的手机,你的意思是锁定它而不是关闭它。在这种情况下,可能会调用onCreate,因为您的手机正在清理活动堆栈以节省电量。

在任何情况下,您都应该将所有事件侦听器添加到onCreate方法中,但是与显示的信息相关的任何内容都可以进入onResume(并且您应该在onPause期间保存任何信息或状态。 {1}})。这样,每次应用程序状态更改时,您的界面始终显示新数据。 (EditText和任何标准小部件默认存储其当前状态,但应该仔细考虑与此不同的任何内容)。你可以把那个相机放在那里。

PS:我不确定这会有什么帮助,但您可能希望将camera变量放在另一个类中,可能是Singleton。在Android环境中存储与活动中多个活动相关的信息可能看起来很奇怪。使用Singleton,您可以确保始终可以访问camera,无论您在何处调用它(您仍然需要首次初始化它)。您还可以扩展一个持有对摄像头的引用的基本活动,因此任何需要此变量的活动都可以直接访问它(但是,这会增加应用程序的处理一点点)。我再说一遍:这只是关于我如何面对这个变量的一些建议,它们不一定能帮助你解决问题。

答案 1 :(得分:0)

每当发生某种状态变化时(例如,关闭或旋转屏幕),都会调用onCreate方法。

我很确定你应该做的是覆盖onSaveInstanceState方法并将数据保存到它的outState Bundle,然后将其作为{{onCreate传递给savedInstanceState 1}}捆绑。

有关更多信息,请查看Android开发人员中心的“Handling Runtime Changes”。

您可以通过在创建例外之前检查相机是否存在来阻止相机,例如

if(MyFirstAppActivity.camera == null)
    MyFirstAppActivity.camera = new Camera(...);

或者只是在onCreate

中创建一个新实例