从通知实例化 activity 启动 activity,即使已经存在

Launch activity from notification instantiating activity even if already there

我的应用程序有一个后台服务,即使应用程序被销毁也可以运行。
该应用程序有两个活动:A,这是主要的 activity,和 B,一个设置 activity。
每当应用进入后台时都会创建通知。
如果我在 A 中,转到主屏幕并从通知中启动 activity(意图是 A),将创建一个新的(重复的)activity A!
我想实现这个逻辑:

if (launched from notification with app destroyed) {
    // this is the case where the service is running in background with the app destroyed
    create A;
} else {
    // don't create a new instance since A is already there. If current activity is B, stay in B (as if you pressed the launcher icon)
}

我目前使用以下 PendingIntent 从通知启动 activity:

PendingIntent launchActivity = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0);

实现上述逻辑的正确方法是什么,最好以编程方式实现。谢谢。

编辑: FLAG_ACTIVITY_SINGLE_TOP 做了我想要的,但仍然有一个问题:使用此标志,将不会创建 activity 当且仅当它在栈顶。
因此,在当前堆栈为 [MainActivity > Settings] 的情况下,由于 Settings 位于堆栈顶部,因此新堆栈将为 [MainActivity > Settings > MainActivity],但我想要的应该是 [MainActivity > Settings]。
编辑 2: 基本上,单击通知应该会恢复应用程序的状态。

您可以打开 RedirectActivity 而不是您自己的 activity :

public class RedirectAcivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = new Intent(this, HomeActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(intent);
        finish();
    }
}

你的 pendingIntent 将是这样的:

PendingIntent launchActivity = PendingIntent.getActivity(this, 0, new Intent(this, RedirectActivity.class), 0);

首先,尝试将 PendingIntent 标志设置为 PendingIntent.FLAG_UPDATE_CURRENT 而不是 0:

PendingIntent launchActivity = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);

然后为 Activity A(即 MainActivity)设置 android:launchMode="singleTop" 以避免在打开时重新创建它:

<activity
    android:name=".MainActivity"
    ...
    android:launchMode="singleTop">
    ...
</activity>

最后在 MainActivity 中,在 onCreate 中执行 Intent 处理(当 Activity 被销毁,现在通过单击通知创建)和 onNewIntent 方法(当创建 Activity 并且我们要处理通知点击时)。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    handleIntent(getIntent());
}

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

private void handleIntent(Intent intent) {
    if(intent.hasExtra("KEY_TO_EXTRA")){
        // ...
    }
}