1

我有一个活动,我通过调用 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();
}
4

2 回答 2

2

当你开始一个新Activity的,第一个Activity可能会或可能不会经历各种“退出”阶段,但不能保证它会经历哪些。这完全取决于单个设备上的可用资源和其他因素。

第一个Activity可能只是暂停,当你返回时它会恢复。但是,第一个 Activity 很可能会被停止甚至销毁。无法保证 Android 操作系统会使用第一个Activity.

在您的情况下,当您从第二个返回时,似乎第一个 IS 实际上被销毁并重新创建Activity

验证这一点的唯一方法是覆盖所有方法,例如onPause,onStoponDestroy让它们中的每一个Log用于显示第一个Activity经历的阶段。

于 2011-12-25T20:38:14.170 回答
1

您可以通过确保在整个应用程序的生命周期中只存在一个 SQLiteOpenHelper 来避免很多这种混淆。查看此答案以获取更多信息。

于 2012-01-17T03:38:30.853 回答