【问题标题】:Propagating result back to original activity from set of chained library activities将结果从一组链式库活动传播回原始活动
【发布时间】:2015-10-26 18:54:45
【问题描述】:

一些背景知识,我目前正在开发一个包含一些活动组件和“入口点”的库。简单来说,目标是让库控制 UI,根据一系列 UI 交互做一些工作,并最终将结果传播回原始的非库活动。我试图在下图中总结流程:

如您所见,可以通过开始活动 B1 或 B2 进入图书馆,最终到达活动 D。

问:从设计的角度来看,将结果传播回 A 的最佳(或首选)方式是什么?

我已经尝试使用FLAG_ACTIVITY_NEW_TASK 启动 B1/B2 并使用 FLAG_ACTIVITY_FORWARD_RESULT 进行库内活动,直到最后 D 以 FLAG_ACTIVITY_CLEAR_TASK 启动,因此它成为任务中的“顶部”和唯一的活动。但是,这似乎无法正常工作,我还需要它与 API 级别 10 兼容。

另一个问题是,活动 A 可能是任何东西,并且事先不知道,传递 A.class 感觉非常难看。

似乎这可能是一个最好通过使用服务来解决的问题?

编辑: 为了进一步简化问题的概念,这里处理的主要问题非常类似于将回调传递给原始活动的“回调”机制。当然,带有类似“监听器”接口的回调将无法工作,因为原始活动已暂停,并且如果当前未运行,广播也不会被传递。

另外,澄清一下,只有库应该考虑作为解决方案,因为活动 A 可能来自任何使用该库的第三方项目。

【问题讨论】:

  • 我通常会尽量避免这些复杂的情况,只需将所需的数据写入SharedPreferences 或您喜欢的任何格式,这样任何需要数据的Activity 都会从那里获取他们的份额。
  • SharedPreferences 的问题是状态/结果不应在库调用之间保持不变。并且不能保证活动 A(或应将结果传播到的任何其他活动)将清除存储的偏好值。

标签: android android-library


【解决方案1】:

考虑使用Application 类,而不是使用Service。它允许您存储可以从多个活动中访问的全局变量。

【讨论】:

  • Application 类在库项目中毫无意义,因为清单中的任何此类定义都会被有效地忽略。并且它对强制使用该库的第三方使用提供的Application 子类构成了不必要的限制。
【解决方案2】:

从库类中调用应用程序的新活动 B。 使用您的重定向网址

String redirecturl = "com.example.ThankYouScreen";
    Intent returnIntent = new Intent();
    returnIntent.putExtra("data", "DONE");
    returnIntent.setClassName(getApplicationContext().getPackageName(), redirecturl);
    startActivity(returnIntent);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    相关资源
    最近更新 更多