我的应用程序具有后台服务,即使该应用程序被销毁也可以运行。
该应用程序有两个活动: 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:基本上,点击通知应可将应用恢复为原来的状态。
答案 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);