我编写了我的第一个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);
}
}
答案 0 :(得分:1)
您可能需要查看Android's lifecycle信息。
为了让事情变得更好,您应该实施onPause
和onResume
,因为每次更改“活动”或旋转手机时都会调用它们。我假设通过关闭你的手机,你的意思是锁定它而不是关闭它。在这种情况下,可能会调用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