我有一个活动,我通过调用SQLiteOpenHelper的构造函数来打开数据库。
dbHelper = new DBHelper(this); //DBHelper class extends SQLiteOpenHelper
然后点击一个按钮,我打开另一个活动并关闭dbHelper。
int cuisineId = HelperUtils.getCuisineIdByName(dbHelper,cuisine);
SingletonGlobalClass.getInstance().setCuisineId(cuisineId);
String restaurantNameSearchStr = restaurantName.getText().toString().trim();
Intent intent = new Intent();
intent.setComponent(new ComponentName("ctnxa.android", ctnxa.android.SearchResultActivity"));
intent.putExtra("searchStr", restaurantNameSearchStr);
intent.putExtra("option", R.string.restaurant);
startActivity(intent);
dbHelper.close();
现在,当我按下后退按钮时,它会回到此活动。当我试图再次单击搜索按钮时,它使用dbHelper并且通常没有任何错误。我的期望是它不应该工作,因为之前已经关闭了dbHelper并且它只能在调用活动onCreate()方法时重新实例化,在这种情况下没有被调用,因为我只是按下后退按钮(它应该调用的onResume())。我真的很困惑。任何机构都可以解释这里发生的事情。
编辑:这就是我实现dbHelper.close()
的方法@Override
public synchronized void close() {
super.close();
}
答案 0 :(得分:2)
当您开始新的Activity
时,第一个Activity
可能会或可能不会经历各种“退出”。阶段但不保证它会经历哪些阶段。它完全取决于单个设备上的可用资源和其他因素。
第一个Activity
可能会暂停,当您返回时,它会恢复。但是,第一个活动很可能会被停止甚至销毁。无法保证Android操作系统将对第一个Activity
做什么。
在你的情况下,当你从第二个Activity
返回时,似乎第一个IS实际上被销毁并重新创建。
验证这一点的唯一方法是覆盖所有方法,例如onPause
,onStop
和onDestroy
,并让每个方法都使用Log
来显示哪些阶段第一个Activity
经过。
答案 1 :(得分:1)
通过确保在整个应用程序的生命周期中只存在一个SQLiteOpenHelper,可以避免很多这种混淆。查看此answer了解详情。