Java 为什么在关闭手机时输入OnCreate()?
我编写了我的第一个Android应用程序,对Android开发(以及Java)非常陌生。我有PreferenceActivity,注意到当显示activity并关闭mobile时,会再次调用它的onCreate()。更令人困惑的是,静态成员MyFirstAppActivity.camera已不存在,导致异常。我可以在那里检查null,但我想知道为什么会发生这种情况,以及避免这种情况的最佳方法是什么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
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建议的那样)。这些线值得你避免例外。检查空值并分配新相机解决了我的问题,谢谢你的建议。