Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在关闭手机时输入OnCreate()?_Java_Android_Api_Android Activity - Fatal编程技术网

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

Java 为什么在关闭手机时输入OnCreate()?,java,android,api,android-activity,Java,Android,Api,Android Activity,我编写了我的第一个Android应用程序,对Android开发(以及Java)非常陌生。我有PreferenceActivity,注意到当显示activity并关闭mobile时,会再次调用它的onCreate()。更令人困惑的是,静态成员MyFirstAppActivity.camera已不存在,导致异常。我可以在那里检查null,但我想知道为什么会发生这种情况,以及避免这种情况的最佳方法是什么 public class SettingsActivity extends PreferenceA

我编写了我的第一个Android应用程序,对Android开发(以及Java)非常陌生。我有PreferenceActivity,注意到当显示activity并关闭mobile时,会再次调用它的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);

    }
}
公共类设置活动扩展了PreferenceActivity{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//根
addPreferencesFromResource(R.xml.preferences);
//获取可用解决方案的列表
对象[]previewSizes=MyFirstAppActivity.camera.getParameters()
.getSupportedPreviewSizes().toArray();
//将对象属性拆分为两个数组
String[]ps=新字符串[previewSizes.length];

对于(int i=0;i每当发生某种状态更改时(例如,关闭或旋转屏幕),将调用
onCreate
方法

我很确定您应该做的是重写该方法并将数据保存到它的
outState
Bundle,然后作为
savedInstanceState
Bundle传递到
onCreate

有关更多信息,请查看Android开发者中心中的“”

在创建相机之前,您可以检查它是否存在,这样可以防止相机出现异常,例如

if(MyFirstAppActivity.camera == null)
    MyFirstAppActivity.camera = new Camera(...);
或者只需在
onCreate

中创建它的新实例,您可能需要检查信息

为了让事情变得更好,你应该实施
onPause
onResume
,因为每次你改变活动或转动手机时都会调用它们。我假设关闭手机意味着锁定手机,而不关闭手机。在这种情况下,可能会调用
onCreate
,因为你的手机e正在清洁活动堆栈以节省电池

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


PS:我不确定这是否有帮助,但您可能希望将
camera
变量放在另一个类中,可能是a。在Android环境中,在活动中存储与多个活动相关的信息可能看起来很奇怪。使用单例,您可以确保无论您在何处调用
camera
都可以访问(您仍然需要第一次对其进行初始化)。您还可以扩展包含摄影机引用的基本活动,以便需要此变量的任何活动都可以直接访问它(不过,这会稍微增加应用程序的处理)。我重复这一点:这只是我如何面对这个变量的一些建议,它们不一定能帮助你解决问题。

谢谢你的回答。之所以将摄像头作为静态变量,是因为我在将其作为普通对象从一个活动传递到另一个活动时遇到了问题。静态似乎是最简单的解决方案。现在,你能解释一下吗gh为什么这个静态变量返回null?我相信有一个简单的解释会让我非常尴尬,但我很想知道。这只是一个假设(我从未见过这种情况),但请记住,应用程序在执行过程中会多次暂停、恢复、创建和销毁。可能是因为您的应用程序忘记了相机的首次创建时间(可能在
MyFirstAppActivity
中),因此,您最好的机会是先检查一下相机,确保相机准备就绪(就像@tanquilmarmot建议的那样)。这些线值得你避免例外。检查空值并分配新相机解决了我的问题,谢谢你的建议。