【问题标题】:Where to insert code for application startup?在哪里插入应用程序启动的代码?
【发布时间】:2012-07-21 16:49:09
【问题描述】:

这里是 Android 新手,我有一些代码要在我的 android 应用程序第一次启动时运行。它检查本地数据库的版本,如果当前版本过时,则下载新版本。我一直坚持在我的第一个活动的 oncreate 中,很确定必须有一个更好的地方来放置它。有什么推荐的地方我可以把它放在启动时会被调用一次的地方吗?

【问题讨论】:

  • 为什么说应该有更好的地方放启动代码呢? OnCreate() 应该做你想做的事..
  • 制作一个加载屏幕活动并在其中添加您的版本检查代码。
  • Snailer 如果我将代码留在活动中,然后我需要暂停或重新创建活动,那么代码会被一遍又一遍地调用。
  • @user1509590,任何onCreate都会发生这种情况。如果您想在您的应用程序生命周期中执行一次代码,请保持状态(例如,保存到 SharedPreferences)并标记您的代码,以使其不再被调用。这就是我们生成和持久化的方式,例如 UUID 安装 ID。
  • 只是为了澄清问题:我并不是说SharedPreferences 是(部分)解决方案。我正在解决 OP,它似乎特别担心有一个代码块(理论上任何代码块)“一遍又一遍”运行,因为它在 Activity 中,而实际上,Application 对象可能如果您的应用由于内存原因不断被系统终止,则重新创建的次数比一个特定的 Activity(尤其是“加载”Activity)要多。

标签: android


【解决方案1】:

您可以编写自定义应用程序类(从 android.app.Application 扩展)。覆盖 onCreate 以指定应用程序启动时发生的情况:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        // Do something here.
    }
}

然后您需要在清单文件中注册您的自定义类:

<application ... android:name="fully.qualified.MyApplication">

编辑:

作为对 David Cesarino 的回应,我不同意 Application 类的目的。如果您依赖ActivityonCreate,那么如何阻止它成为同样庞大的杂项类...如果您需要在应用程序启动时发生某些事情,则必须在某处编写该代码;并且Activity 可能会变得更加混乱,因为您还必须在其中执行Activity 特定逻辑。如果您担心混乱,请将逻辑分离到其他类中并从Application 调用它们。使用SharedPreferences 来确定是否应该执行逻辑似乎更像是解决已经解决的问题。

Dianne Hackborn 似乎指的是数据,而不是逻辑,我完全同意这一点。静态变量比应用程序级变量好得多...更好的范围界定和类型安全性使可维护性/可读性更容易。

【讨论】:

  • 显然,SharedPreferences 是 cmets 中无关问题的一个示例(它甚至不是答案的一部分)。我并不是说您需要将数据库版本(或其他)持久化到SharedPreferences,因为它已经“持久化”在数据库本身中(用于onUpgrade例如)。关于早期使用 Application 类执行数据库检查,我们同意不同意。感谢您的回复。
  • 明白,我并不是要关注它的SharedPreferences 方面,而是说:if (someCondition) { // Execute something. } 对我来说,这就是创建Application 的目的。 ..我想这只是两种看待它的方式,正如你所说......同意不同意。
  • 别担心,没问题! :-)
  • 这个类的好名字是什么?作为一名 iOS 开发人员,我倾向于将其命名为 AppDelegate,但我觉得 android 开发人员可能已经为它起了一个标准名称。
【解决方案2】:

首先,查看Activity lifecycle

回答您的问题后,您可以将代码放入任何“启动”方法中,具体取决于您想要做什么,最重要的是,何时您想要触发它。对于你的问题,onCreate 是合理的地方。

我一直把它放在我的第一个活动的 oncreate 中,很确定必须有一个更好的地方来放置它。

为什么会这样?任何代码都有一个 entry 点,对吧?在 Android 活动中,它恰好是 onCreate(再次,请参阅上面的链接以获取完整的详细信息)。除了事件处理(即对主调用序列之外发生的事件的响应)之外,您还可以在 onCreate 中添加内容。

如果您担心方法变得庞大,那么这是另一个问题。我说,更好地抽象你的代码。为了检查初步的东西,人们通常在启动应用程序的主要活动之前提供一个“加载”活动。

已编辑:

这是drumboog 提议的后续行动,因为我的评论开始变得越来越复杂,“只是评论”。

就个人而言,我会避免扩展 Application 类,唯一的原因是尽早执行代码,更重要的是优先级不那么明智的代码(版本控制数据库)。 Application 类主要用作在Activity'ies 之间保持状态 的简单方法,而不是“做所有事情”的方法。总之,我觉得Application 类经常被滥用。

对于您想要的,您可以在ActivityonCreate 中完美实现该调用代码。这降低了复杂性,因为我已经看到人们填充 Application 直到它变成一大类杂项代码用途。这是维护的禁忌,本身就有逻辑问题。

此外,如果您真的想要另一个解决方案,与 UI 完全分离,您应该考虑实施 Service 代替(但我认为没有必要这样做)。

those concerns were previously addressed by Dianne Hackborn(或我从她的消息中得到的)。

【讨论】:

  • 即便如此,几乎总是有更好的方法来保持状态(静态等)。我用一只手数过我扩展了Application 类的次数。
猜你喜欢
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 2020-01-12
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多