从通知栏返回到父Activity

5
我的问题是,我有两个活动,Activity A和Activity B。Activity A是主要的活动,Activity B只能通过触摸通知来访问。
我需要能够触摸通知,打开Activity B。用户完成Activity B后,他们可以按返回按钮或完成Activity B。当Activity B关闭时,应显示Activity A。目前,我关闭Activity A(这会关闭整个应用程序)并收到推送通知。我选择推送通知,打开Activity B。当我关闭Activity B时,Activity A没有显示,整个应用程序关闭了。我希望在完成Activity B后仍然出现Activity A。
我正在使用Parse SDK通知。在我的自定义ParsePushBroadcastReceiver中,我有以下代码
public class MyReceiver extends ParsePushBroadcastReceiver 
{
  @Override
  public void onPushOpen(Context context, Intent intent) 
  {        

    Intent i = new Intent(context, NotificationActivity.class);
    i.putExtras(intent.getExtras());
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    context.startActivity(i);
  }
}

我已将其列入Android清单。我的通知活动在清单中为:

<activity
        android:name=".NotificationActivity"
        android:label="@string/app_name" 
        android:windowSoftInputMode="adjustPan"
        android:screenOrientation="portrait"
        android:parentActivityName=".MainActivity">

    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity"/>

</activity>

在我的通知活动中,我有以下代码在onBackPressed函数中:
public class NotificationActivity extends ActionBarActivity
{...
   @Override
   public void onBackPressed() 
   {
      if(NavUtils.getParentActivityName(this) != null)
      {
        Log.d(Constants.NAVIGATION_DEBUG, "Get Parent Activity NOT NULL"); 

        NavUtils.navigateUpFromSameTask(this); 
      }
      else
      {
        Log.d(Constants.NAVIGATION_DEBUG, "Get Parent Activity NULL"); 

        super.onBackPressed();
      } 
     }
...}

令人惊讶的是,在日志中它指出它不为空,但如果在按下通知之前应用程序被关闭,则它不会导航回Activity A。相反,应用程序会关闭。我希望Activity A能够显示应用程序在通知被按下时是否被关闭,或者应用程序是否已经打开。谢谢!


看一下 shouldUpRecreateTask,如果活动不在你的任务中,它可能会帮助创建任务堆栈。http://developer.android.com/reference/android/support/v4/app/NavUtils.html#shouldUpRecreateTask(android.app.Activity, android.content.Intent) - MohK
Mohammad - 我会看一下这个,但我不知道这怎么能帮助我解决我的问题。我想要的是打开一个通知活动,当用户退出该活动时,主页活动应该在通知活动之前出现。基本上有两个活动,活动A和B。 A是主要活动,而B仅用于通知。按通知应该显示用户活动B,而根本不显示用户活动A。当用户完成活动B后,它将关闭并导航回活动A。 - SavageKing
http://developer.android.com/training/implementing-navigation/temporal.html - John
4个回答

1
你可以尝试以下方法:在意图中添加一些布尔值额外信息,然后启动MainActivity。那个额外信息将是启动NotificationActivity的指示器。
public class MyReceiver extends ParsePushBroadcastReceiver 
{
  @Override
  public void onPushOpen(Context context, Intent intent) 
  {        

    Intent i = new Intent(context, MainActivity.class);
    i.putExtras(intent.getExtras());
    i.putExtra("IS_FROM_NOTIFICATION", true);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    context.startActivity(i);
  }
}

然后在你的MainActivityonCreate()方法中,做如下操作:

public class MainActivity extends ActionBarActivity {
...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (getIntent().getBooleanExtra("IS_FROM_NOTIFICATION", false)) {
            startActivity(MainActivity.this, NotificationActivity.class);
        }
    } 
    // other initialization code
    ...
...
}

那么你就不需要在你的NotificationActivity中重写onBackPressed了。

如果我这样做,我将能够导航回A活动,但在按下通知按钮后,它会清楚地显示两个活动连续启动。那看起来很糟糕。 - SavageKing
如果您将 if 语句放在 setContentView 之前会发生什么? - romtsn
那不是一个可行的解决方案,因为那只会打开一个Activity,而且我将没有前一个活动可以导航回去。 - SavageKing

0

为了让遇到这个问题的其他人能够找到解决方案,我将发布我的解决方案。我使用Fragment来解决这个问题。

解释:在Activity的onCreate方法中,我检查Intent以查看用户是否因选择通知而进入应用程序。如果是,则可以转换到通知Fragment;否则,可以转换到主Fragment。当用户完成通知Fragment后,用户将按下手机上的返回键或ActionBar中的返回箭头,因此开发人员必须处理这两种情况。

要处理手机上的返回按钮,只需在Activity中覆盖onBackPressed方法,并检查用户是否在通知Fragment中。如果是,则平稳地转换到您的主Fragment,而不保留通知Fragment在backstack中。

要处理ActionBar中的返回按钮,请在Fragment中覆盖onOptionsItemSelected方法,并在用户按下返回按钮(android.R.id.home)时平稳地转换到您的主Fragment。

如果您还要处理覆盖Activity的onNewIntent方法,请向Fragment传递一个布尔值,让您的通知Fragment知道它是从Activity的onCreate还是onNewIntent打开的。

如果您的通知片段是从onnewintent打开的,您不希望转换到您的mainfragment,因为您的mainfragment已经打开并且在后退堆栈中。所以您只需要弹出片段回退堆栈,或者让安卓系统自动处理适当的导航。

这是很多工作,但它是一个解决方案,理论上,这个解决方案应该适用于所有Android API,从GINGERBREAD到LOLLIPOP,只要用户使用片段,并且用户使用自定义动画来在片段之间转换。

关键是从通知片段返回到主片段(或在onnewintent的情况下,返回到它之前的任何片段)使用自定义片段转换,以给用户留下从通知片段向后返回主片段的印象。如果其他人有更好的解决方案... 我会眼睛耳朵张开听取建议。


0

对于临时解决方案,您必须在NotificationActivity的onBackPress()中启动MainActivity。


这并没有给出“返回”的“外观”。相反,它看起来像是我在更深入地(向前)进入应用程序。我可以从onBackPress()中完成Activity B并启动Activity A,但这可能会让用户认为如果他们从Activity A按下返回按钮,他们将以某种方式返回Activity B!在Yahoo安卓应用程序中,如果有突发新闻,您会收到通知。阅读突发新闻后,您可以按操作栏上的返回按钮或主页按钮,无论Yahoo!应用是否打开,都会将您带回先前的活动。 - SavageKing

-1
在Android中使用TaskStackBuilder,这是你所需要的。

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