【问题标题】:back button and up button don't work when parent activity is started from a broadcast receiver从广播接收器启动父活动时,后退按钮和向上按钮不起作用
【发布时间】:2015-01-15 10:22:08
【问题描述】:

我有一个使用以下代码启动活动 A 的广播接收器

            Intent appIntent = new Intent(context, A.class);
              appIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_FROM_BACKGROUND);
              context.startActivity(appIntent);     

A 活动启动正常,然后在里面按下一个按钮,使用此代码启动另一个活动 B

            TaskStackBuilder tsb = TaskStackBuilder.create(this);
            tsb.addParentStack(this);
            Intent intent=new Intent(this, B.class);
            tsb.addNextIntent(intent);
            tsb.startActivities();              

活动 B 开始正常,但是我按下后退按钮还是向上按钮活动 A 没有显示

这是清单字段中两个活动的定义

    <activity android:name=".A"  android:launchMode="singleTop"
        android:label="@string/app_name" >
    </activity>
    <activity android:name=".B" 
        android:label="@string/app_name" android:parentActivityName="myPackage.A">
        <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="myPackage.A" />
    </activity>

在活动 B 我有以下代码

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simplelistlayout);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

@Override
public void onBackPressed() {
   moveTaskToBack(true); 
   B.this.finish();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) 
{
    switch (item.getItemId()) 
    {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
            Intent upIntent = NavUtils.getParentActivityIntent(this);
            if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
                TaskStackBuilder.create(this)
                        .addNextIntentWithParentStack(upIntent)
                        .startActivities();
            } else {
                NavUtils.navigateUpTo(this, upIntent);
            }
            return true;
    }
    return super.onOptionsItemSelected(item);
};

我尝试调试,我认为问题是当我从广播接收器调用活动 A 时,FLAG_ACTIVITY_NEW_TASK 导致意图同时具有操作 (android.intent.action.MAIN) 和类别 (android.intent.category.LAUNCHER ) 并且活动 A 不是我的启动器活动,所以当活动 B 收到后退操作或按下向上按钮时,我看到打算正确地拥有活动 A,但使用启动器活动的操作和类别,我该如何解决这个问题?

【问题讨论】:

  • 你为什么要以这种复杂的方式从A开始B?为什么不直接使用 Intent intent=new Intent(this, B.class); startActivity(intent); 开始 B ?这也可能会给您带来问题。

标签: android android-intent android-activity


【解决方案1】:

如果您在B 中按 BACK,它会执行以下代码:

@Override
public void onBackPressed() {
   moveTaskToBack(true); 
   B.this.finish();
}

这会将任务移至后台,这就是您看不到活动 A 的原因。您为什么要这样做?

【讨论】:

  • 我现在把它改成了@Override public void onBackPressed() { finish(); } 但仍然是同样的问题。我认为主要问题是活动 A 没有 Action Main 或 Category Launcher,但是当我调试应用程序时,我发现 Up 操作中的 Intent 同时具有 Action 和 Category。
  • 如果您按后退按钮或向上按钮,则会出现相同的行为。
  • 嗨,我发现很多链接表明在 jellybeans 及以上版本中的 NavUtils.navigateUpTo 存在问题,因此我在代码中将其替换为 upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(upIntent);结束();它奏效了。
【解决方案2】:

我将广播接收器中对活动 A 的调用更改为

Intent appIntent=new Intent(context, A.class);
appIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP); 
context.startActivity(appIntent);

以及对 Activity B 的调用

Intent intent=new Intent(this, B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

现在它正在工作

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    相关资源
    最近更新 更多