如何从非活动类开始活动并等待它完成?

时间:2017-05-30 10:31:11

标签: java android android-activity synchronized

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

这是开始活动的librairy方法:

    @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(),但之后活动根本没有开始。

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

3 个答案:

答案 0 :(得分:1)

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

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

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和数据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;
    } 
  }
}

答案 1 :(得分:0)

Intent intent = new Intent(context, YourNewActivity.class);
    ((Activity) context).startActivityForResult(intent, ResponseCode);

答案 2 :(得分:0)

几天前我就实现了同样的事情。只需遵循以下提供的步骤:

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

  2. 现在按照您之前的操作打开活动。 context.startActivity(i);

  3. 存储您要从已打开的活动传递的数据;在一些变量将在活动被杀死后留下来。它可以是库中的一些静态引用,对象中的某个成员变量的生命周期比活动或持久性存储(如共享首选项)更多。

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

  5. 此时您之前的活动将恢复正常,您将接到一个活动生命周期方法的电话,即onActivityResumed(Activity activity)

  6. 享受!