回到一个即使noHistory=true也没有历史记录的活动

3
我需要知道以下流程是否正常: 当Activity B获得焦点时,会调用Activity A的onPause方法,但在Activity A的onStop和onDestroy方法被调用之前,几秒钟后,Activity A(同一实例)的onResume方法被调用。 在清单文件中,我在activity A的定义中设置了noHistory=true。
我曾认为,在具有noHistory=true属性的Activity中,一旦Activity失去焦点,该实例将永远不会返回。

我猜你得让它死掉(完整的活动生命周期)。还有一件事,Activity A必须完全隐藏在屏幕上,才能触发事件。如果你不确定,只需在启动Activity B之前调用finish()。 - Samuel
3个回答

5
您描述的 ActivityA.onResume() 被调用的行为是不正确的。我怀疑您的 AndroidManifest.xml 文件中有一个打字错误。您能贴出来并给我们看一下吗? onStop()onDestroy() 的时机没有被很好地定义。以下是一个可行的示例,但是只有当用户按下返回按钮时才会调用 onStop()onDestroy() (但是 onResume() 从未被调用)。如果在启动 ActivityB 后调用 finish() ,则会更早地在 ActivityA 上调用它们。
输出结果不包括 finish()
D/HelloAndroidActivity(13013): [HelloAndroidActivity.java:19:onCreate()] onCreate()com.example.hello.HelloAndroidActivity@4055d2e8
D/HelloAndroidActivity(13013): [HelloAndroidActivity.java:45:onStart()] onStart()com.example.hello.HelloAndroidActivity@4055d2e8
D/HelloAndroidActivity(13013): [HelloAndroidActivity.java:39:onResume()] onResume()com.example.hello.HelloAndroidActivity@4055d2e8
NEXT!
D/HelloAndroidActivity(13013): [HelloAndroidActivity.java:51:onPause()] onPause()com.example.hello.HelloAndroidActivity@4055d2e8
D/GoodbyeAndroidActivity(13013): [GoodbyeAndroidActivity.java:16:onCreate()] onCreate()
D/GoodbyeAndroidActivity(13013): [GoodbyeAndroidActivity.java:32:onStart()] onStart()
D/GoodbyeAndroidActivity(13013): [GoodbyeAndroidActivity.java:26:onResume()] onResume()
[BACK]
D/GoodbyeAndroidActivity(13013): [GoodbyeAndroidActivity.java:38:onPause()] onPause()
D/HelloAndroidActivity(13013): [HelloAndroidActivity.java:57:onStop()] onStop()com.example.hello.HelloAndroidActivity@4055d2e8
D/HelloAndroidActivity(13013): [HelloAndroidActivity.java:63:onDestroy()] onDestroy()com.example.hello.HelloAndroidActivity@4055d2e8
D/GoodbyeAndroidActivity(13013): [GoodbyeAndroidActivity.java:44:onStop()] onStop()
D/GoodbyeAndroidActivity(13013): [GoodbyeAndroidActivity.java:50:onDestroy()] onDestroy()

带有finish的OUTPUT:

D/HelloAndroidActivity(13113): [HelloAndroidActivity.java:19:onCreate()] onCreate()com.example.hello.HelloAndroidActivity@4051b940
D/HelloAndroidActivity(13113): [HelloAndroidActivity.java:45:onStart()] onStart()com.example.hello.HelloAndroidActivity@4051b940
D/HelloAndroidActivity(13113): [HelloAndroidActivity.java:39:onResume()] onResume()com.example.hello.HelloAndroidActivity@4051b940
NEXT!
D/HelloAndroidActivity(13113): [HelloAndroidActivity.java:51:onPause()] onPause()com.example.hello.HelloAndroidActivity@4051b940
D/GoodbyeAndroidActivity(13113): [GoodbyeAndroidActivity.java:16:onCreate()] onCreate()
D/GoodbyeAndroidActivity(13113): [GoodbyeAndroidActivity.java:32:onStart()] onStart()
D/GoodbyeAndroidActivity(13113): [GoodbyeAndroidActivity.java:26:onResume()] onResume()
D/HelloAndroidActivity(13113): [HelloAndroidActivity.java:57:onStop()] onStop()com.example.hello.HelloAndroidActivity@4051b940
D/HelloAndroidActivity(13113): [HelloAndroidActivity.java:63:onDestroy()] onDestroy()com.example.hello.HelloAndroidActivity@4051b940
[BACK]
D/GoodbyeAndroidActivity(13113): [GoodbyeAndroidActivity.java:38:onPause()] onPause()
D/GoodbyeAndroidActivity(13113): [GoodbyeAndroidActivity.java:44:onStop()] onStop()
D/GoodbyeAndroidActivity(13113): [GoodbyeAndroidActivity.java:50:onDestroy()] onDestroy()

HelloAndroidActivity.java:

public class HelloAndroidActivity extends Activity {
    private static final String TAG = "HelloAndroidActivity";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate()" + this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Intent i = new Intent(HelloAndroidActivity.this,
                        GoodbyeAndroidActivity.class);
                startActivity(i);
                // Uncomment this:
                 finish();
            }
        });
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d(TAG, "onResume()" + this);
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.d(TAG, "onStart()" + this);
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d(TAG, "onPause()" + this);
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop()" + this);
    }

    @Override
    public void onDestroy() {
        super.onStop();
        Log.d(TAG, "onDestroy()" + this);
    }

}

GoodbyeAndroidActivity.java:

public class GoodbyeAndroidActivity extends Activity {
    private static final String TAG = "GoodbyeAndroidActivity";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate()");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.goodbye);
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d(TAG, "onResume()");
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.d(TAG, "onStart()");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d(TAG, "onPause()");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop()");
    }

    @Override
    public void onDestroy() {
        super.onStop();
        Log.d(TAG, "onDestroy()");
    }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <TextView  
        android:id="@+id/hello_text"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello"
        />
        <Button  
        android:id="@+id/button"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="NEXT!"
        />
    </LinearLayout>

goodbye.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:id="@+id/hello_text"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Goodbye!!!"
    />
</LinearLayout>

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.hello"
          android:versionCode="1"
          android:versionName="1.0">
        <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10"/>

        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name="com.example.hello.HelloAndroidActivity"
                      android:label="@string/app_name"   android:noHistory="true">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name="com.example.hello.GoodbyeAndroidActivity">
            </activity>

        </application>
    </manifest>

感谢您的回复。这是活动的定义方式: <activity android:name=".main.LoginActivity" android:noHistory="true" android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden"/> - galbarm
我有一个类BaseActivity,它扩展了Activity,并从中派生了LoginActivity。在基类中,我像您的代码一样向日志发送打印,因此这是我看到的方式,即在另一个活动中后返回LoginActivity.onResume。 - galbarm
非常奇怪。我将你的属性复制粘贴到我的应用程序中,它正常工作。脑海中浮现出的问题是:您的minSdkVersion和targetSdkVersion是什么?您能否在多个设备上重现这个问题?您能否在您的环境中使我在这里发布的示例工作? - Jason
我正在使用minSdkVersion=8和这个sdk进行开发。有一件事我没有提到,就是这个问题并不是每次都会出现,只有大约10%的概率。为了解决这个问题,我现在从LoginActivity中调用finish()方法作为一种变通方法。自从做出这个改变后,这个问题就没有再出现过。 - galbarm
这是在模拟器上还是在实际设备上?如果是设备的话...是哪一款? - Jason

1

听起来@Sam Quest已经回答了你的问题。在启动新活动之前调用onFinish()。如果是由于用户导航而发生的,那么您的活动应该被结束,但我不知道什么时候会有保证。如果您的LoginActivity正在创建活动,则调用onFinish()似乎是正确的做法,而不是一种变通方法。


它说:“当用户导航离开并且屏幕上不再可见时,是否应该从活动堆栈中删除活动并完成其(调用其finish()方法)”。这不是我所看到的行为。在这种情况下,对我来说理解为什么它不能按照我尝试做的方式按预期工作非常重要,而不是寻找其他方法来实现它。 - galbarm

1

使用onActivityResult方法,然后你的问题就会解决。


请看我的评论给Edwin Evans。 - galbarm

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