我有一个上下文菜单,其中包含一个应该启动意图的菜单项:
@Override
public void onCreateContextMenu(ContextMenu menu, View view,
ContextMenuInfo menuInfo) {
MenuItem item = menu.add(menuItemText);
item.setIntent(intent);
这曾经有用,但在较新的Android版本中,它会引发异常:
从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗?
添加此标志将是简单的方法,但我不想创建新任务,因为这应该是应用程序的活动堆栈的一部分。问题是系统调用startActivity
这个项目的上下文,在这种情况下是DecorContext
,而不是Activity
。由于这都是由框架处理的,所以我无法控制它。
除了在onContextItemSelected
中设置标志或处理操作之外,还有一个很好的解决方案吗?
这是因为Android使用DecorContext
进行从Android 27开始的活动。
您可以通过查看line 319 in PhoneWindow内部在系统级别确认这一点。请注意,当PhoneWindow
从Activity构造时,mUseDecorContext
始终设置为true。这意味着您的菜单将每次都使用DecorContext构建。
我的理解是,有一个单独的DecorContext
为ContextMenu
是故意的。 ContextMenus
旨在“浮动”在内容之上,因此作为单独的菜单,与其呈现的内容相关。
根据你使用的ContextMenu
,你可能不得不考虑等到Intent
直到onContextItemSelected
,即使你提到你想避免这种情况。或者,您可能必须使用某种形式的IPC来包装并将您的意图发送回活动。我们使用RxBus模式来处理这种罕见的用例。其他选择是LocalBroadcastManager
和EventBus by GreenRobot。希望这有助于您开始使用替代解决方案。如果您有疑问,请告诉我。
例外是因为您可能没有覆盖onContextItemSelected方法。您必须覆盖onContextItemSelected(),如下所示:
@Override
public boolean onContextItemSelected(MenuItem item) {
startActivity(item.getIntent());
return true;
}
希望这会帮助你。
你可以试试
@Override
public void onCreateContextMenu(ContextMenu menu, View view,
ContextMenuInfo menuInfo) {
intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
MenuItem item = menu.add(menuItemText);
item.setIntent(intent);
}
我是android studio应用程序的新手,所以我不确定是否会有效。