【问题标题】:How to start an activity from not-activity class and wait until it is finished?如何从非活动类开始活动并等到它完成?
【发布时间】:2017-05-30 10:31:10
【问题描述】:

我正在开发一个启动它自己的 Activity 的 Android 库。我需要让库的方法同步工作,这意味着我想等到启动的 Activity 完成然后返回一个值。我该怎么做?我尝试了不同的方法,但似乎没有做我想做的事。

这是图书馆启动活动的方法:

    @Override
    public Response admin(TypeEnumeration type) {
        Intent i = new Intent(context, NewActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        i.putExtra("type", type.value());

        context.startActivity(i);

        Response response = NewActivity.getResponse();
        return response;
    }

活动启动许多不同的片段并等待用户的交互。

我不想使用主动等待NewActivity.getResponse() 不为空。我尝试添加一个额外的对象以在其上使用wait()/notyfy(),但随后活动根本没有开始。

任何提示将不胜感激! 谢谢

【问题讨论】:

  • 什么是响应?
  • onActivityResult() ?.. 问题有点混乱..
  • “我需要让库的方法同步工作”——你为什么认为你“需要”这样做?异步 API(回调、监听器、future、RxJava 风格的 observables 等)非常常见。
  • 这是一个客户的要求:他们想调用一个库的方法并阻止他们的应用程序直到结果出来。
  • 使用扩展 Application 类的“MyApplication”类,并在类中设置一个单例或字段。您可以在 MyApplication 类中设置状态值以检查状态和值。您可以从任何您希望的活动中获取活动的此值和状态。

标签: java android android-activity synchronized


【解决方案1】:

最常见的场景(听起来就是这样)是子 Activity 用于获取用户输入 - 例如从列表中选择联系人或在对话框中输入数据。在这种情况下,您应该使用 startActivityForResult 来启动您的子 Activity。

这提供了一个管道,用于使用 setResult 将数据发送回主 Activity。 setResult 方法接受一个 int 结果值和一个 Intent,该 Intent 被传回调用的 Activity。

Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data"); 
setResult(Activity.RESULT_OK, resultIntent);
finish();

在调用Activity覆盖onActivityResult访问返回的数据。 requestCode对应startActivityForResult调用中传入的整数,resultCode和data Intent是从子Activity返回的。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  switch(requestCode) {
    case (MY_CHILD_ACTIVITY) : {
      if (resultCode == Activity.RESULT_OK) {
        // TODO Extract the data returned from the child Activity.
        String returnValue = data.getStringExtra("some_key");
      }
      break;
    } 
  }
}

【讨论】:

  • 当我从一个库而不是另一个活动开始活动时,如何使用startActivityForResult
  • 你使用的是哪个库?
  • 我的图书馆,我正在研究的图书馆,以及开始活动并等待结果的图书馆 :)
  • 老大我在问库名。你用的是什么?那里可用的上下文变量是怎么来的
  • 我不明白你的问题。为什么需要我的图书馆的名称?
【解决方案2】:
Intent intent = new Intent(context, YourNewActivity.class);
    ((Activity) context).startActivityForResult(intent, ResponseCode);

【讨论】:

    【解决方案3】:

    几天前我实施了同样的事情。只需按照以下提供的步骤进行操作即可:

    1. 使用应用程序引用(可以使用 activity.getApplication() 获取)并使用以下方法注册活动生命周期回调: application.registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback)

    2. 现在像之前一样打开活动。 context.startActivity(i);

    3. 存储要从打开的活动中传递的数据;在活动被杀死后将保留的一些变量中。它可以是库中的一些静态引用,对象中的一些成员变量,其生命周期超过活动或持久性存储,如共享首选项。

    4. 现在使用 activity.finish() 关闭您的活动。

    5. 此时您之前的活动将获得恢复,您将在活动生命周期方法中获得调用,即onActivityResumed(Activity activity)

    6. 享受吧!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      相关资源
      最近更新 更多