我的问题是我有两个活动,活动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显示在按下通知时应用程序是否已关闭或应用程序是否已打开。谢谢!
答案 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所需的方法相同。