从通知中导航到父活动

时间:2014-11-29 04:52:06

标签: android notifications parse-platform push-notification

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

我需要能够触摸通知,这将打开活动B.用户完成活动B后,他们可以按后退按钮或完成活动B.当活动B关闭时,应显示活动A.目前,我关闭活动A(关闭整个应用程序)并收到推送通知。我选择了打开活动B的推送通知。当我关闭活动B时,未显示活动A,整个应用程序关闭。在完成活动B之后,我希望活动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 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显示在按下通知时应用程序是否已关闭或应用程序是否已打开。谢谢!

4 个答案:

答案 0 :(得分: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);
  }
}

然后在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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

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

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

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

这是一项很多工作,但它是一个解决方案,理论上,只要用户使用Fragments和用户,此解决方案就可以在GINGERBREAD - LOLLIPOP 的所有Android API中运行正在使用自定义动画在片段之间进行转换。

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

答案 3 :(得分:-1)

在Android中使用TaskStackBuilder所需的方法相同。