从通知实例化 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")){
// ...
}
}
我的应用程序有一个后台服务,即使应用程序被销毁也可以运行。
该应用程序有两个活动: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")){
// ...
}
}