java - 从应用程序上下文启动 Activity 时的风险?

标签 java android android-activity android-context

单例非 Activity 类管理整个应用程序的服务器 API 调用。如果通信失败,管理器类应启动登录 Activity (launchMode="singleTask")。

管理器类不包含上下文,因此登录 Activity 是从应用程序上下文启动的:

Intent intent = new Intent(App.getInstance().getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
App.getInstance().getApplicationContext().startActivity(intent);

App.getInstance() 为此返回 MultiDexApplication 实例的单例。

这似乎有效。

现在,关于this topic的SO文章数不胜数。和 android contexts ,但看了很多之后,我仍然不确定这是否会带来任何风险。一些 SO 答案建议通过 Activity 生命周期观察器保留上下文引用,但我想避免任何静态引用和潜在的内存泄漏。

我发现的唯一缺点是应用程序上下文是“非主题的”,但 Activity 看起来符合预期。所以这似乎不是问题?

这种方法有什么问题吗?

最佳答案

The only drawback I found is that the app context is "non-themed", but the activity looks as expected. So that doesn't seem to be an issue?

Activity 有自己的 Context,将绑定(bind)到自己的主题。 “不要将 Application 用于 UI”规则更适用于展开布局之类的事情 — 如果您在 Activity 中,请将 Activity 用于此类工作。

Are there any issues with this approach?

我不是粉丝,我不得不维护一个采用这种方法的应用程序一段时间:

  • 这将使测试单例变得困难,尤其是对您的Application

  • 的硬编码引用
  • 用户可能不喜欢你清除返回堆栈,除非你有其他方法让用户回到她当时所在的位置

  • 这会使后台工作变得困难,因为您不应该突然弹出身份验证 Activity (以至于在 Android Q 和更高版本上被禁止)

  • 在多窗口环境(分屏和自由格式)中可能会导致额外的问题

  • 从关注点分离的角度来看,这很丑陋(非 UI 单例不应该做 UI 的事情,比如显示 UI)

因此,从技术上讲,它应该可以工作。我不会这样做(而且,如果我有勇气,我会删除我必须维护的那个实现)。

关于java - 从应用程序上下文启动 Activity 时的风险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56266391/

相关文章:

java - 在 java 中运行 bash shell 脚本

Java Short.parseShort 和 Short.valueOf 之间的区别

java - 如果 JSON 文件要跨不同平台共享,我是否需要关心编码类型

java - 我正在检查 fragment 类中的登录过程,那么当我成功登录后搬到家时如何关闭MainActivity

java - Android Activity生命周期: when to save the Logcat into a file?

java - 我可以强制 liquibase 3.5.1 忽略旧版变更集校验和差异吗?

java - 使用 jdk 8 的默认 jaxws-ri 实现禁用 SOAP 客户端的 SOAP 验证

android - 这是一个标准的android组件吗?

java - System.loadLibrary() 在某些情况下不工作

即使操作系统杀死应用程序后,Android Activity 仍保留在堆栈中