4

我只想在我的 android 应用程序中运行特定代码一次。共享首选项解决方案不是解决方案,因为当您转到应用程序管理器并执行清除数据然后共享首选项被删除,因此应用程序将其视为全新安装。我什至尝试过失败的应用程序类,它与共享首选项相同。除共享首选项和应用程序类之外的任何帮助将不胜感激。

谢谢。

4

4 回答 4

8

答案取决于“仅一次”的含义。

每个应用程序安装一次

设置一个SharedPreference

如果用户清除数据,或卸载然后重新安装,代码将再次运行。

每台设备一次

将空文件(标志文件)保存在外部存储上的知名位置。

您可以这样做:

  • 在应用程序自己的存储中,将在卸载时清除,但不会在用户点击Clear Data时清除。
  • 共享的外部存储中。

第二种方法很有前途:它可以抵抗清除数据并重新安装。

但是,使用存储可移动或不可安装的外部存储很棘手,如果存储不可用,我不确定您的后备方案是什么。(提示:快速失败)。

您也可能不相信您的用户不会(意外或故意)删除精心放置的文件。

每个用户一次

我认为这超出了这个问题的范围。但是您应该从查看AccountManager文档开始,然后从那里开始。

每台设备一次,这次是认真的

好的,所以:

  • 如果我们无法读取外部存储,我们不想快速失败。
  • 我们不想用上面的方法做皮带和大括号,因为坏人会删除外部存储上的标志文件,并清除数据
  • 即使设备已恢复出厂设置并且外部存储已被擦除,我们也只能为每个设备执行一次

我们必须使用可以存储此设备状态的外部源进行检查;让我们称之为“服务器”。

我们需要一个标识符来唯一地向服务器标识我们自己。

通常,您会生成一个UUID并将其存储在某个地方。但是我们不能相信我们的任何存储选项。

所以我们需要从我们的静态外部环境中生成一个标识符。iPhone 现在已弃用的 UDID正是这样,由各种硬件标识符生成的

复制此链接将是一个很好的开始,但根据您的安全许可,您可能需要自己制作。如果世界上的每个人都使用您的应用程序或与您的应用程序相同的算法,则可能会影响隐私(这就是 Apple 弃用 UDID 以及每个应用程序都应使用自己的 UUID 的原因)。

无论哪种方式,对于(充其量)边缘情况来说,这都是非常大量的工程工作(包括服务器),所以我会避免它。

更糟糕的是,它将您的应用程序与互联网连接联系起来,这取决于您的上下文,这可能是一件坏事。

此外,有根设备将有权更改任何或所有这些标识符。之后就有点哲学了。

每个应用程序生命周期一次

手动进行。认真地,在部署之前或之后的某个时间手动完成。

如果您需要选择获胜设备,那么您需要一台服务器和某种识别设备的方法,如上所述。手动进行,然后选择然后告诉获胜者。但这也超出了这个 Android 问题的范围。

于 2013-10-22T01:11:41.050 回答
2

如果您不能依赖手机本身存在的数据(因为用户可以删除它),您需要以某种方式存储您已在线执行初始化。在线定义服务并跟踪已在哪些设备和哪些用户上运行了初始化。

您可以通过这种方式唯一标识设备:是否有唯一的 Android 设备 ID?

出于好奇,剧情是什么?

于 2013-09-25T13:10:40.223 回答
0

看看这个库: https ://github.com/jonfinerty/Once 帮助管理你运行它的次数,它有方便的方法,每次安装只运行一次,或者应用程序版本升级一次

于 2015-11-17T00:11:54.993 回答
-1

您可以为此使用 SQLite 数据库。创建一个只有一行的表,说 update=0,一旦你运行了这段代码,将 update 的值更改为 1。然后每次检查条件 if update == 1 然后不要运行代码,否则运行这个。如果您卸载该应用程序,该数据库也将被删除,这意味着它将再次称为全新安装。我希望这有帮助。

于 2013-10-23T10:02:20.967 回答