在我的应用程序中,我有一个MainActivity和一个TimerActivity。 在TimerActivity的正常情况下,设备后退按钮和ActionBar的up按钮可以正常工作 - 它们从TimerActivity引导到MainActivity。但是当我通过点击我的应用程序的通知打开TimerActivity时,后退按钮会导致主屏幕而不是MainActivity。 我希望两个后退按钮(设备和ActionBar的向上按钮)始终打开MainActivity - 除非用户在MainActivity中,在这种情况下后退按钮应关闭MainActivity。这是Gmail和Google云端硬盘应用在您通过通知打开活动时的工作方式,而且最有意义。
以下是我的通知如何打开活动:
Notification timerNotification;
mBuilder = new NotificationCompat.Builder(getApplicationContext())
.setSmallIcon(ongoingNotificationIcon)
.setContentTitle(ongoingNotificationContentTitle)
.setContentText(ongoingNotificationContentText)
.setTicker(ongoingNotificationTicker)
.setPriority(99)
.setOngoing(true);
Intent resultIntent = new Intent(this, TimerActivity.class);
PendingIntent resultPendingIntent = PendingIntent.getActivity(
this, 0, resultIntent, PendingIntent.FLAG_CANCEL_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
timerNotification = mBuilder.build();
startForeground(MyApplication.NOTIFICATION_ID, timerNotification);
我尝试覆盖TimerActivity中的后退按钮,如下所示:
public void onBackPressed() {
Intent intent_main = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent_main);
}
但是再次按下MainActivity上的后退按钮会将用户返回到TimerActivity(因此用户处于循环中),而不是退出应用程序,这是所需的行为。此外,onBackPressed()
不会影响ActionBar的向上按钮。
答案 0 :(得分:3)
要覆盖Actionbar Up按钮,请使用:
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId()) {
case android.R.id.home:
//User clicked home, do whatever you want
return true;
default:
return super.onOptionsItemSelected(item);
}
}
要自动返回上一个活动,请在AndroidManifest.xml中指定以前的活动:
<activity
android:name=".SecondActivity"
android:label="@string/label_myLabel"
android:parentActivityName=".FirstActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.yourpackage.FirstActivity"/>
</activity>
答案 1 :(得分:2)
onBackPressed()不会影响ActionBar的向上按钮。
“后退”按钮和“向上”按钮是两种不同的导航方式。
<强>向上强>
“向上”按钮用于根据应用在应用内导航 屏幕之间的等级关系。
返回强>
系统后退按钮用于按时间顺序反向导航 订购,通过用户最近工作的屏幕历史 用。它通常基于时间关系 屏幕,而不是应用程序的层次结构。
因此,您所描述的问题实际上是推荐的方式来浏览您的应用。
尽管如此,如果您希望用户在按下MainActivity
后从TimerActivity
转到Notification
,最简单的方法就是包含Intent
当您从Activity
启动Notification
时,需要额外检查。
以下是一个例子:
Intent resultIntent = new Intent(this, TimerActivity.class);
resultIntent.putExtra("fromNotification", true);
在TimerActivity
private boolean mFromNotification;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Bundle args = getIntent().getExtras();
if (args != null) {
mFromNotification = args.getBoolean("fromNotification");
}
}
@Override
public void onBackPressed() {
if (mFromNotification) {
startActivity(new Intent(this, MainActivity.class));
finish();
} else {
super.onBackPressed();
}
}
答案 2 :(得分:0)
正如Notifications Setting up a regular activity PendingIntent中所述,您应该使用TaskStackBuilder来构建合成后备堆栈,以便后退按钮的功能就像用户已正常导航一样:
...
Intent resultIntent = new Intent(this, ResultActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack
stackBuilder.addParentStack(ResultActivity.class);
// Adds the Intent to the top of the stack
stackBuilder.addNextIntent(resultIntent);
// Gets a PendingIntent containing the entire back stack
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
...
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(id, builder.build());
正如您所注意到的,“操作栏启动”操作无论您是否来自通知都没有区别(如果您已正确设置通知,则无法实现)。