从通知中导航到父活动

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从通知中导航到父活动相关的知识,希望对你有一定的参考价值。

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

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

我正在使用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 Manifest中。我在清单中的通知活动是

<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();
      } 
     }
...}

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

答案

您可以尝试以下方法:在意图中添加一些boolean extra,然后启动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);
  }
}

然后在你的MainActivity's 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
    ...
...
}

然后你不需要在你的onBackPressed中覆盖NotificationActivity

另一答案

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

另一答案

正因如此,遇到此问题的其他人都会有一个有效的解决方案,我会将解决方案发布到这个偏头痛问题上。我解决这个问题的方法是使用Fragments。

说明:在oncreate活动中,我检查Intent以查看用户是否因为选择通知而在应用程序中。如果是这样我可以转换到通知片段,如果不是,我可以转换到主片段。在用户完成通知片段后,用户将按下手机上的后退键,或按ActionBar中的后退箭头,因此开发人员必须处理这两种情况。

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

要处理操作栏中的后退按钮,请覆盖片段中选择的onoptions,当用户按下后退按钮(android.R.id.home)时,您只需平滑过渡到主片段。

如果您还在处理覆盖newintent上的活动,只需将一个布尔值传递给您的片段,让您的通知片段知道它是从onnewintent打开还是从您的活动中创建。

如果您的通知片段是从onnewintent打开的,那么您不希望转换到主片段,因为您的mainfragment已经打开并且在backstack中。因此,您只需将片段POP堆叠后退,或让android系统自动处理正确的导航。

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

关键是使用从通知片段到主片段的自定义片段转换(或者在onnewintent的情况下,无论它之前是什么片段),以给出用户从通知片段到主片段的BACKWARDS的印象。如果其他人有更好的解决方案......我全都耳朵。

另一答案

在Android中使用TaskStackBuilder就可以了。

以上是关于从通知中导航到父活动的主要内容,如果未能解决你的问题,请参考以下文章

Android 通知导航到现有活动

导航抽屉活动:在按钮单击时从片段移动到片段

在android中按下通知时如何打开片段页面

从活动向上导航到片段打开相同的片段 - Android 导航组件

从通知导航到带有 NavController 的片段

如何使用导航从其他片段隐藏主机活动中的视图