Android - 覆盖ActionBar后退和设备后退按钮

时间:2014-04-16 02:06:05

标签: android

在我的应用程序中,我有一个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的向上按钮。

3 个答案:

答案 0 :(得分:3)

  1. 要覆盖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);
        }
    }
    
  2. 要自动返回上一个活动,请在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的向上按钮。

“后退”按钮和“向上”按钮是两种不同的导航方式。

From the docs

<强>向上

  

“向上”按钮用于根据应用在应用内导航   屏幕之间的等级关系。

返回

  

系统后退按钮用于按时间顺序反向导航   订购,通过用户最近工作的屏幕历史   用。它通常基于时间关系   屏幕,而不是应用程序的层次结构。

因此,您所描述的问题实际上是推荐的方式来浏览您的应用。

尽管如此,如果您希望用户在按下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());

正如您所注意到的,“操作栏启动”操作无论您是否来自通知都没有区别(如果您已正确设置通知,则无法实现)。