我的问题是我有两个活动,活动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就可以了。