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

时间:2018-11-24 14:22:07

标签: java android android-notifications android-pendingintent activity-stack

我的应用程序具有后台服务,即使该应用程序被销毁也可以运行。
该应用程序有两个活动: A (是主要活动)和 B (是一个设置活动)。
每当应用程序进入后台时,都会创建通知。
如果我在A中,请转到主屏幕并从通知中启动活动(意图是A),将创建一个新的(重复的)活动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从通知中启动活动:

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

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

编辑: FLAG_ACTIVITY_SINGLE_TOP完成了我想要的操作,但是仍然存在一个问题:使用此标志,仅当且仅当时,才会创建该活动它在堆栈的顶部。
因此,在当前堆栈为[MainActivity>设置]的情况下,由于设置位于堆栈顶部,因此新堆栈将为[MainActivity>设置> MainActivity],但我想要的应该是[MainActivity>设置]。 br /> 编辑2:基本上,点击通知应可将应用恢复为原来的状态。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

最后在MainActivity中,在Intent中进行onCreate处理(当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")){
        // ...
    }
}

答案 1 :(得分:1)

您可以打开RedirectActivity代替自己的活动:

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 launchActivity = PendingIntent.getActivity(this, 0, new Intent(this, RedirectActivity.class), 0);