gpt4 book ai didi

android - 从通知打开应用程序时如何应用正常 Activity 顺序

转载 作者:行者123 更新时间:2023-11-29 17:26:20 25 4
gpt4 key购买 nike

这是我的场景:我有一个播放流媒体音乐并创建(和更新)通知的服务。当按下通知时,用户将被带到 B Activity 。

我的应用程序的结构是 A -> B。

当用户按照以下流程进入主屏幕:B -> A -> 主屏幕(服务继续播放音乐),按下通知会将用户带到 Activity B,但现在他无法返回到 Activity A。他被带到主屏幕。

我需要针对每种情况执行 B -> A 顺序。

这是我的代码 fragment :

AndroidManifest.xml:

<activity
android:name=".ChannelListActivity"
android:configChanges="locale|keyboard|keyboardHidden|screenLayout|fontScale|uiMode|orientation|screenSize"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity
android:name=".NowPlayingActivity"
android:parentActivityName=".ChannelListActivity"
android:launchMode="singleTop" >
</activity>

以及创建通知的代码:

Intent intentGoToApp = new Intent(this, NowPlayingActivity.class);
intentGoToApp.putExtra(NowPlayingFragment.EXTRA_CHANNEL_ID, mUserData.getPlayingChannelId());
intentGoToApp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent piGoToApp = PendingIntent.getActivity(getApplicationContext(), 0, intentGoToApp, PendingIntent.FLAG_CANCEL_CURRENT);

那么,我需要更改或添加什么才能实现该行为?提前致谢...


编辑:我尝试添加以下代码,但仍然没有得到想要的结果...

Intent intentGoToApp = new Intent(this, NowPlayingActivity.class);
intentGoToApp.putExtra(NowPlayingFragment.EXTRA_CHANNEL_ID, mUserData.getPlayingChannelId());
intentGoToApp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//PendingIntent piGoToApp = PendingIntent.getActivity(getApplicationContext(), 0, intentGoToApp, PendingIntent.FLAG_CANCEL_CURRENT);

Intent intentMainActivity = new Intent(this, ChannelListActivity.class);

PendingIntent piGoToApp = TaskStackBuilder.create(this)
// add all of DetailsActivity's parents to the stack,
// followed by DetailsActivity itself
.addNextIntentWithParentStack(intentMainActivity)
.addNextIntentWithParentStack(intentGoToApp)
.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);*/

最佳答案

您可以使用一些技巧:

  1. 如果 Activity B 已通过通知启动(并完成 Activity B),则在 Activity B 的 public void onBackPressed() {} 中启动 Activity A;

    public class ActivityB extends Activity {
    static final String ACTION_NOTIFICATION = "ACTION_NOTIFICATION";
    boolean isStartedWithNotification;

    @Override
    protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    ....
    }

    // OR onResume() if you don't use fragments
    @Override
    protected void onResumeFragments() {
    super.onResumeFragments();
    handleIntent();
    }

    void handleIntent() {
    Intent intent = getIntent();
    if (intent != null && ACTION_NOTIFICATION.equals(intent.getAction())) {
    // handle intent, populate UI based on it's information;
    isStartedWithNotification = true;
    setIntent(null);
    }
    }

    @Override
    public void onBackPressed() {
    if (isStartedWithNotification) {
    startActivity(new Intent(this, ActivityA.class)
    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    finish();
    } else {
    super.onBackPressed();
    }
    }
    }
  2. 不是通过通知启动 Activity B - 启动 Activity A 来处理 Intent 并立即启动 Activity B;

    public class ActivityA extends Activity {
    static final String ACTION_NOTIFICATION = "ACTION_NOTIFICATION";

    @Override
    protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
    }

    // OR onResume() if you don't use fragments
    @Override
    protected void onResumeFragments() {
    super.onResumeFragments();
    handleIntent();
    }

    void handleIntent() {
    Intent intent = getIntent();
    if (intent != null && ACTION_NOTIFICATION.equals(intent.getAction())) {
    setIntent(null);
    //START ACTIVITY B
    }
    }
    }

第一种方法更 hacky,但对于第一种方法,在低端设备上您可能会看到“Activity ”开关“闪烁”。所以我将从第一个开始。

希望对你有帮助

关于android - 从通知打开应用程序时如何应用正常 Activity 顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34436632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com