activity A -> activity B 接下来, Activity B 启动 Acti-6ren">
gpt4 book ai didi

Android 任务历史堆栈 : can have "duplicate activities"?

转载 作者:行者123 更新时间:2023-11-29 22:11:04 25 4
gpt4 key购买 nike

我希望在任务历史堆栈中有此行为:

  • 第一个任务历史栈是:
    • 场景 1.1:activity Main -> activity A -> activity B
  • 接下来, Activity B 启动 Activity A,同一个实例
    • 场景 1.2:主要 -> A -> B -> A(重复)

这样,如果用户按下后退按钮,他会回到 B,再次按下后退按钮会回到 A(总是 A 的同一个实例)。

使用 Intent 标志“FLAG_ACTIVITY_REORDER_TO_FRONT”我已经实现了行为:

  • 首先:
    • 场景 2.1:主要 -> A -> B
  • B 启动 A
    • 场景 2.2:主要 -> B -> A

所以 A 的同一个实例实际上被带到了前面,但是在使用后退按钮离开 B 之后,A 不再位于 B 和 Main 之间,因此显示了 Main。

  1. 是否有任何标志/Activity 属性等可以简化实现此行为?
  2. 或者我是否需要处理 Activity A 上的“后退按钮按下”?
    • 如果是这样,假设我在场景 2.2 中,我如何重新排序 A(在检测到后退按钮之后)以将其放在 Main 和 B 之间?
  3. 如有任何其他意见/建议,我们将不胜感激。

谢谢!

最佳答案

我认为您想要的场景通常是不可能的。因为Tasks and Back Stack说:

When the user presses the Back button, the current activity is popped from the top of the stack (the activity is destroyed)

因此,如果您的任务是 A -> B -> A(重复)并且用户按下后退按钮,他将返回到 B 并且 A 被销毁并且他无法返回到 A。< br/>我编写了具有这种行为的树 Activity A、A1、A2:
主要 -> A -> A1 -> A2 -> A1(重复)
接下来当用户在 A2 中按 BACK 时:
A1 -> A2 -> A1(相同) -> A -> Main
这是他们的代码:
Activity A 是:

package t.t;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class TaskTestActivity extends Activity {
Button btn;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main0);
btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent(TaskTestActivity.this, TaskTestActivity1.class);
i.putExtra("loader", "A");
TaskTestActivity.this.startActivity(i);
}
});
}
}

Activity A1 是:

package t.t;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;

public class TaskTestActivity1 extends Activity {
Button btn;
String str = "";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent(TaskTestActivity1.this, TaskTestActivity2.class);
i.putExtra("loader", "A1");
TaskTestActivity1.this.startActivity(i);
}
});
}
@Override
public void onBackPressed() {
System.out.println(str);
if(str.equals("ali")){
Intent i = new Intent(this,TaskTestActivity2.class);
this.startActivity(i);
str = "";
System.out.println("BACK");
}else{
Intent i = new Intent(this,TaskTestActivity.class);
this.startActivity(i);
str = "";
System.out.println("BACK1");
}

}
@Override
protected void onNewIntent(Intent intent) {
// TODO Auto-generated method stub
super.onNewIntent(intent);
str = "ali";
}

}

Activity A2 是:

package t.t;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;

public class TaskTestActivity2 extends Activity {
Button btn;
int i = 0;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent(TaskTestActivity2.this,
TaskTestActivity1.class);
i.putExtra("loader", "A2");
TaskTestActivity2.this.startActivity(i);
}
});

}
}

请注意,我在 Activity A1 中覆盖了 onBackPressed() 并且您会检测到您想要返回 A2 或 A,因此我在 intent 中添加了一个额外的内容并在 A1 中覆盖了 onNewIntent(Intent intent) .我的项目 list 是:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="t.t"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="15" />

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" android:hardwareAccelerated="true">
<activity
android:label="A"
android:launchMode="standard"
android:name=".TaskTestActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:label="A2"
android:launchMode="singleInstance"
android:name=".TaskTestActivity2" >
</activity>
<activity android:name="TaskTestActivity1" android:launchMode="singleTask" android:label="A1"></activity>
</application>

</manifest>

注意 Activities 元素中的“singleInstance”和“singleTask”属性。最后,您可以将此布局用于您的 Activity 以确保重复 A1:

主.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />

<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />

<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="A2"
android:textAppearance="?android:attr/textAppearanceLarge" />

<RatingBar
android:id="@+id/ratingBar1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>

main1.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />

<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="A1"
android:textAppearance="?android:attr/textAppearanceLarge" />





<RatingBar
android:id="@+id/ratingBar1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>

main0.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >



<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="A"
android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />

<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />

</LinearLayout>

关于Android 任务历史堆栈 : can have "duplicate activities"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9641072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com