如何在 Android 服务中启动没有标志 FLAG_ACTIVITY_NEW_TASK 的意图?

How do I start an intent without the flag FLAG_ACTIVITY_NEW_TASK in an Android service?

我正在尝试从自定义软键盘连接到不同的活动。我需要键盘下方的 activity 以允许在不创建自身新实例的情况下发送数据。例如:如果键盘在消息传递应用程序上方,我想发送该应用程序数据而不丢失用户正在输入的当前对话。我目前有以下代码将数据发送到 activity.

  Intent sendIntent = new Intent(Intent.ACTION_SEND); 
  sendIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
  //sendIntent.putExtra("thread_id", (long) 1);
  sendIntent.setType("image/*"); 
  startActivity(sendIntent);

当我尝试 运行 时出现以下明显错误...

E/AndroidRuntime(6129): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

当从键盘服务发送 Intent 时,如何防止键盘下方的当前 activity 自行重置?或者更简单地说,如何在不设置 FLAG_ACTIVITY_NEW_TASK 标志的情况下从服务发送意图?

您可以通过多种方式完成此操作,但您必须设置标志才能完成任务。

如果要创建新实例并关闭当前实例需要设置Intent.FLAG_ACTIVITY_CLEAR_TOP

如果你想在这种情况下重复使用 activity 的同一个实例,你需要同时设置 Intent.FLAG_ACTIVITY_CLEAR_TOPIntent.FLAG_ACTIVITY_SINGLE_TOP 之后它不会创建另一个 activity 但调用 activity 的 onNewIntent() 到 运行 新 Intent。

你真的不能那样做。 Service 无法将数据传递给没有 "starting it" 的 Activity。你不想那样做。您想要将数据传递给 "already started" Activity。有两种方法可以做到这一点:

  1. 使用绑定 Service。将 Activity 绑定到 Service。然后 Activity 可以调用 Service 上的方法(使用 AIDL)并接收返回的数据。

  2. 使用一个BroadcastReceiver。让 Activity 创建并注册一个 BroadcastReceiver 来监听返回的数据。在你的Service中,当你想向Activity发送数据时发送一个广播Intent