Android 从通知向上导航到父活动

Android 从通知向上导航到父活动,android,notifications,parse-platform,push-notification,Android,Notifications,Parse Platform,Push Notification,我的问题是我有两个活动,活动A和活动B。活动A是主要活动,活动B只能通过触摸通知来访问 我需要能够触摸一个通知,它将打开活动B。在用户完成活动B后,他们可以按后退按钮或完成活动B。当活动B关闭时,应显示活动a。目前,我关闭活动A(关闭整个应用程序)并收到推送通知。我选择打开活动B的推送通知。当我关闭活动B时,活动A不显示,整个应用程序关闭。我希望活动A在完成活动B后到达那里 我正在使用解析SDK通知。在我的自定义接收器中,我有以下代码 public class MyReceiver extend

我的问题是我有两个活动,活动A和活动B。活动A是主要活动,活动B只能通过触摸通知来访问

我需要能够触摸一个通知,它将打开活动B。在用户完成活动B后,他们可以按后退按钮或完成活动B。当活动B关闭时,应显示活动a。目前,我关闭活动A(关闭整个应用程序)并收到推送通知。我选择打开活动B的推送通知。当我关闭活动B时,活动A不显示,整个应用程序关闭。我希望活动A在完成活动B后到达那里

我正在使用解析SDK通知。在我的自定义接收器中,我有以下代码

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>

令人惊讶的是,在日志中它声明它不是NULL,但是如果在按下通知之前关闭了应用程序,它不会导航回活动A。相反,应用程序关闭。我希望活动A显示在按下通知时应用程序是否已关闭,或者应用程序是否已打开。谢谢

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

您可以尝试以下方法:在意图中添加一些布尔值,然后启动MainActivity。该额外值将作为通知活动开始的指示器

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);
  }
}
然后在
main活动的
onCreate()
方法中,执行以下操作:

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
    ...
...
}

然后你不需要在你的
通知活动中覆盖
反压

,这样每个遇到这个问题的人都会有一个有效的解决方案,我将发布我对这个偏头痛问题的解决方案。我解决这个问题的方法是使用片段

说明:在activityoncreate中,我检查用户是否由于选择了通知而在应用程序中。如果是,我可以转换到通知片段,如果不是,我可以转换到主片段。在用户完成通知片段后,用户将要么按手机上的back键,要么按ActionBar中的back箭头,因此开发人员必须处理这两种情况

要处理手机上的后退按钮,只需在活动中覆盖onbackpressed,并检查用户是否在通知片段中,如果是,则平稳过渡到主片段,而无需将通知片段保留在backbackback中

要处理actionbar中的back按钮,请覆盖片段中选择的OnOptions,当用户按下back按钮(android.R.id.home)时,您只需平滑地过渡到mainfragment

如果您也在处理重写活动onnewintent,只需将布尔值传递给您的片段,让您的通知片段知道它是从onnewintent打开的还是从您的活动oncreate打开的

如果您的通知片段是从onnewintent打开的,您就不想转换到mainfragment,因为mainfragment已经打开并处于后台。因此,您可以简单地将片段放回后台,或者让android系统自动处理正确的导航

这需要大量的工作,但这是一个解决方案,从理论上讲,只要用户使用片段,并且用户使用自定义动画在片段之间转换,这个解决方案就应该适用于姜饼-棒棒糖的所有Android API


关键是使用一个从通知片段到主片段的自定义片段转换(或者在onnewintent的情况下,在它之前出现的任何片段),以给人一种用户正在从通知片段倒退到主片段的印象。如果其他人有更好的解决方案。。。我洗耳恭听

在Android中使用TaskStackBuilder与您所需的相同。

这不会给您带来倒退的“感觉”。相反,看起来我正在深入(向前)应用程序。我可以从onBackPress()完成活动B并启动活动A,但这可能会导致用户认为,如果他们从活动A按后退按钮,他们将以某种方式返回到活动B!在Yahoo android应用程序上,如果有突发新闻,您将收到通知。在阅读了《新突破》之后,你可以按下操作栏上的后退按钮或主页按钮,它会将你带回到上一个活动,无论Yahoo!应用程序是否已打开。如果我这样做,我将能够导航回活动A,但在按下通知按钮后,它将清楚地显示两个背靠背开始的活动。这看起来很可怕。如果您将
if
语句移动到
setContentView
之前会怎么样?这不是一个可行的解决方案,因为这只会打开一个活动,而且我没有以前的活动可导航回。请看一下shouldUpRecreateTask,如果活动不在您的任务中,它可能有助于创建任务堆栈,(android.content.Intent)Mohammad-我会看看这个,但我看不出这对解决我的问题有什么帮助。我想要的是打开一个通知活动,当用户退出该活动时,主活动应该在通知活动之前出现。基本上有两个活动,活动A和B。A是主要活动,而B仅用于通知。按通知应显示用户活动B,而不显示用户活动a。当用户完成活动B时,它将关闭并导航回活动A。
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
    ...
...
}