4

我有一个从通知启动的活动。我使用 TaskStackBuilder 包含一个后退堆栈,以便当用户点击主页按钮(操作栏标题按钮)或使用后退键时,它将返回到应用程序。但是,它不是以这种方式工作的,而是回击或操作栏标题按钮总是导致应用程序关闭。

值得一提的是,我的项目结构是这样组织的,所有 UI 组件都位于 Android 库 (com.be.commotion) 中,而外部“包装器”项目使用该库。

这是我构建通知的方式:

// This is the activity that will be launched when tapping the notification
Intent intentNotification = new Intent(this, NowPlaying.class);
intentNotification.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

// Create the back stack so the user can get back to the main activity when pressing the back button
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(NowPlaying.class);
stackBuilder.addNextIntent(intentNotification);
PendingIntent pendingNowPlayingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

// Setup the custom notification view
RemoteViews notificationContent = new RemoteViews(getPackageName(), R.layout.notification_now_playing);
....

// Setup the intent that will play/stop music when the stop button is tapped
Intent musicControlIntent = new Intent(this, CommotionMediaPlayer.class);

PendingIntent musicPendingIntent = PendingIntent.getService(this, 0, musicControlIntent, PendingIntent.FLAG_UPDATE_CURRENT);

notificationContent.setOnClickPendingIntent(R.id.ibMediaControl, musicPendingIntent);

// Update the notification with this info
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setContentTitle(song.text)
                    .setContentText(song.artist)
                    .setContentIntent(pendingNowPlayingIntent)
                    .setLargeIcon(artwork)
                    .setContent(notificationContent)
                    .setOngoing(true);

NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

// Using the nowPlayingNotificationId allows the notification to be updated with later calls instead of causing a new notification to show up
mNotificationManager.notify(nowPlayingNotificationId, builder.build());

这是我的 AndroidManifest.xml (用于包装器项目)中的适用定义:

    <activity android:name="com.be.commotion.ui.StartupActivity"
            android:label="@string/app_name"
            android:noHistory="true"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Holo.NoActionBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

    <activity android:name="com.be.commotion.ui.NowPlaying"
              android:label="Now Playing"
              android:parentActivityName="com.be.commotion.ui.StartupActivity"
              android:screenOrientation="portrait">

        <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.be.commotion.ui.StartupActivity" />

    </activity>
4

3 回答 3

3

您可以分两步完成,而无需TaskStackBuilder
为您的 Intent 使用 1/ set Flag

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);

2/为您的 PendingIntent 设置标志

pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);

它对我有用,祝你好运

于 2013-12-18T19:23:12.043 回答
1

在添加所需的活动之前将主要活动添加到堆栈中(单击通知时直接调用的活动)。例如:

stackBuilder.addNextIntent(new Intent(this,MainActivity.class));
stackBuilder.addNextIntent(new Intent(this,DesiredActivity.class));
于 2016-12-25T07:51:50.853 回答
0

也许我们正在解决一个稍微不同的问题,但归结为同一个问题。对我们来说,解决方案是使用:

startActivityForResult(intent, 0);

我们想要做的是有一个通知到活动 B,当点击后退按钮时,把我们带到活动 A

有两种方法可以做到这一点:

从 B 开始 A:如果所有活动都在您的应用程序中,则有效

  1. 在通知包中发送参数以定义活动是从通知启动的
  2. 覆盖活动 B 的 OnBack 并使其以 CLEAR_TOP 标志启动活动 A(这样后面就不会带回 B)

从 A 开始 B:适用于不同应用程序中的活动(例如打开电子邮件客户端)

  1. 将通知发送到活动 A(传递必要的参数以了解活动是从通知开始的)
  2. 使用 startActivityForResult 启动活动 B(例如电子邮件客户端)。如果您使用正常的 startActivity,“返回”按钮将不起作用。
于 2021-01-07T16:00:47.277 回答