为什么在活动启动时会调用onResume()方法?

8

我有一个应用程序,登录后会把你带到欢迎界面。我放了一个 Toast 来判断 onResume 何时触发,但是它在 onCreate 之后也会触发。

protected void onResume(){
    super.onResume();
    Database openHelper = new Database(this);//create new Database to take advantage of the SQLiteOpenHelper class
    myDB2 = openHelper.getReadableDatabase(); // or getWritableDatabase();
    myDB2=SQLiteDatabase.openDatabase("data/data/com.example.login2/databases/aeglea", null, SQLiteDatabase.OPEN_READONLY);//set myDB to aeglea
         cur = fetchOption("SELECT * FROM user_login");//use above to execute SQL query
         msg.setText("Username: "+cur.getString(cur.getColumnIndex("username"))
                     +"\nFull name: "+cur.getString(cur.getColumnIndex("name"))+" "+cur.getString(cur.getColumnIndex("last"))
                     +"\ne-mail: "+cur.getString(cur.getColumnIndex("email"))
                     +"\nAeglea id:"+cur.getString(cur.getColumnIndex("uid")));

         Toast.makeText(getApplicationContext(), "RESUMED", Toast.LENGTH_SHORT).show();
}

来源于:

 //create new intent
 Intent log = new Intent(getApplicationContext(), Welcome.class);
 // Close all views before launching logged
  log.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  startActivity(log);
   // Close Login Screen
   finish();

我感到困惑。请提供一些经验。

1
onPause还是onResume - zapl
@zapl 抱歉,我会编辑我的问题。 - MayTheSchwartzBeWithYou
4个回答

21

我不太理解你想问什么或者这个问题是什么。但是我推荐你阅读 "Android Activity LifeCycle" 这篇文章,它可以消除你很多疑虑。因为在 Android 中与其他语言或平台不同。

enter image description here

注意:每次活动“可见”时都会调用 OnResume 方法,所以只要你的活动变得可见的次数越多,该方法就会被调用相同数量的次数。如果你只想第一次调用该方法,那么 OnCreate 是你要找的。


7

是的,我也这么认为,但我以为onResume()会在onPause触发后被激活。 - MayTheSchwartzBeWithYou
1
完全没问题。在Android上有些东西确实不同,但是当你了解它们后,你会喜欢上它的。一开始我很震惊,当我知道如果你很快使用onActivityResult(..),它会在onResume(..)之前被调用。 - Ivo

2

onCreate之后的onResume是正常的活动生命周期

即使在第一次启动时,你也会得到onStartonResume的调用,原因是这样可以更容易地编写代码。

你可以假设在返回到onResume之前,你将会得到onPause的调用,因为没有其他方式可以退出“已恢复”状态而不调用onPause。 这种行为可以用于在onResume中初始化事物,并在onPause中反初始化它们而无需进一步检查。 如果不能确定起始点是否已调用,则整个方案将会出现问题。

另外:不要从任何onXYZ方法中访问数据库,因为那会阻止UI线程,而UI线程应该绘制UI并处理触摸事件。


0

只是为了添加一个解决方法。声明一个变量int intResume = 0;然后实现以下onResume:

@Override
    public void onResume()
    {
        super.onResume();
        intResume++;
        // here put codes for after onCreate & "true resume"

        if (intResume>1) {
            intResume = 10;
            // here put codes for "true resume"
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接