【问题标题】:When starting a new Activity, the Home screen background is visible for a split second启动新 Activity 时,主屏幕背景会出现一瞬间
【发布时间】:2012-01-02 12:47:53
【问题描述】:

在三星 Galaxy Tab 10.1" (Android 3.1) 上运行下面的简单测试活动时,在 TestActivity2 启动之前,我看到主屏幕背景短暂闪烁。

没有看到这个闪光灯
- 在没有 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 的情况下运行时
- 在运行 Android 2.3 的 Galaxy Tab 7" 上运行时

知道是什么导致了这种闪光以及如何避免它吗?

public class TestActivity1 extends Activity
{
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    TextView t = new TextView(this);
    t.setText("TestActivity1");
    t.setOnClickListener(new View.OnClickListener()
    {

      @Override
      public void onClick(View v)
      {
        //start TestActivity2
        Intent intent = new Intent(getApplicationContext(), TestActivity2.class);           
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
        startActivity(intent);          
      }
    });
    setContentView(t);
  }

}

在比较使用和不使用 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 的测试运行的 LogCat 时,我注意到以下差异。

使用 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

... INFO/SurfaceFlinger(223): id=71 已删除 com.zappware.test/com.zappware.test.TestActivity1 idx=2 Map Size=3

没有 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

... INFO/SurfaceFlinger(223): id=75 已删除 com.zappware.test/com.zappware.test.TestActivity1 idx=3 Map Size=3

也许这有帮助?

【问题讨论】:

  • 使用 Intent.FLAG_ACTIVITY_CLEAR_TOP 重新启动 TestActivity1 时会发生同样的情况
  • 你为什么首先使用标志?您是否尝试过制作 XML 文件并将内容视图设置为该文件?
  • @sfratini :当我开始一项包含一些详细信息的活动时,我正在使用此标志。当用户按下主页时,我不想返回此详细信息页面,而是返回更一般的概览活动。
  • @sfratini 我一直在寻找清单中的 FLAG_ACTIVITY 常量和值之间的映射,但找不到(任何指针?):我假设 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 映射到 android:finishOnTaskLaunch (以及什么是 FLAG_ACTIVITY_CLEAR_TOP 的等价物吗?)。如果我使用清单中的 android:finishOnTaskLaunch 并且不在代码中设置它,则没有闪存!这很有趣,但我当然想了解为什么它们的行为不同。
  • 我还注意到,在调用 startActivity 之后添加对 overridePendingTransition(0,0) 的调用可以避免闪烁的背景图像。再次有趣,但知道为什么这会有所不同吗?

标签: android android-intent android-3.0-honeycomb android-3.1-honeycomb


【解决方案1】:

嗯,你正在清理堆栈,所以也许这就是它发生的原因。我可以建议覆盖后退按钮的行为吗?

http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html

编辑:

我在想这样的事情。从 2.0 开始,您可以这样做:

@Override
public void onBackPressed() {
Intent intent = new Intent(getApplicationContext(), MyActivity.class);
startActivity(intent);
}

【讨论】:

  • 它可能确实与堆栈有关。但是......当使用 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 时,堆栈不会被清理。当我从 Activity1 转到 Activity2 时,Activity1 仍然在堆栈上。只有在 Activity2 处于活动状态时按 HOME 时,该标志才有效。第二种情况也是如此:当我使用 FLAG_ACTIVITY_CLEAR_TOP 从 Activity1 导航到 Activity1 时:这里 Activity1 仍保留在堆栈中(仅移除其顶部的活动,因此堆栈永远不应为空)
  • 使用FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET的目的是:假设你启动活动A-B-C-D并且C和D是用FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET启动的。当您按 HOME 时,堆栈被修剪为 A-B。我很高兴您的建议(感谢您的帮助)覆盖后退按钮的行为,但您能否详细说明为什么这可能会有所帮助?
  • 嗯,你是说你想让用户回到一个特定的活动,而不是堆栈上的那个。 Overrring 后退按钮行为,您只能在该 Activity 上执行此操作,并保持所有 Activity 的正常行为。查看我的编辑。
  • 如果我有 ABCD 并按下返回以结束 C 对我来说没问题。我想要的是在 ABCD-HOME 之后,堆栈回到 AB 所以我认为 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 更好在这里选择
  • 哦,我明白了。我现在知道了。是的,我认为这样更好。
猜你喜欢
  • 2021-04-03
  • 2023-03-28
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多