安卓安装位置和开机自启动(BOOT_COMPLETED)

12

我有一个使用AlarmService的Android应用程序。根据文档,我不应该允许将此应用程序安装/移动到外部存储中。然而,由于某些设备上内部存储空间非常小,用户无法理解这一点,并要求提供在外部存储上安装的选项(通过低星级评分)。

我需要在启动时重新注册闹钟,并拥有一个监听BOOT_COMPLETED的BroadcastReceiver。然而,如果是安装在SD卡上的应用程序,则不会调用此应用程序,因为在触发意图时未挂载该卡。遗憾的是,EXTERNAL_APPLICATIONS_AVAILABLE也不能-- 因此我没有收到通知,我们已经启动,因此没有机会重新设置闹钟。

是否有任何方法可以解决这个困境?

4个回答

3

抱歉,这是无法绕过的。这就是为什么我们说不应该将执行此类操作的应用程序放在SD卡上的原因。


4
正如我在最初的帖子中所写的,将应用程序移动到SD卡是(无知的)用户的需求。我理解他们!许多低成本的Android手机提供了可怜的内部存储空间。然而,试图向用户解释这样的问题是不值得去做的一件事情。甚至对工程师来说,系统的运作方式也没有意义... - toucan
猜测,我现在唯一能走的路就是在应用程序启动时重新安装所有警报 - 并忽略引导和启动应用程序之间应该触发警报的情况 - 这不是一个好的选择。人们想知道为什么Android团队在应用程序设置中添加了“移动到SD卡”选项,因为这对于许多应用程序实际上并不起作用,但却引发了对平台上无法实现的功能的不合理需求。 - toucan
1
但是 EXTERNAL_APPLICATIONS_AVAILABLE 不应该涵盖这个吗?当SD卡在启动后首次挂载时,它不起作用吗? - Christopher Orr
1
相关的 bug,其中功能文档表示这是可能的,但 Javadoc 反映了残酷的现实:http://b.android.com/8485 - Christopher Orr

1

最坏的情况是:创建第二个应用程序(足够轻便,不会因无法安装在SD卡上而影响),该应用程序将在启动时监听BOOT_COMPLETED事件,并在主应用程序可用时触发。告诉用户必须安装该应用程序才能使您的应用程序在安装到SD卡上时正常工作。

如果有事件/触发器发生时,您的应用程序被移动到SD卡上,您可以弹出通知告诉他们从市场获取这个第二个应用程序。

我知道这是一个糟糕的选择,但如果你绝望了,它会起作用。


抱歉,但那只是工程师的解决方案,在现实世界中并不可行。有人可能会认为Android平台(相对于iOS)还没有准备好面对真正的工作 - 但我想这是一个完全不同(而且很长)的讨论。 - toucan
确实,我已经提到过两次这不是一个完美的解决方案,但我不明白为什么一些人在他们的手机上遇到应用空间问题就意味着Android还没有准备好进行真正的工作/面对现实世界。 - Haphazard

1

如果用户要求将应用程序移动到SD卡的原因是由于空间限制(即您的应用程序需要大量空间),那么我建议将应用程序使用的数据存储在SD卡上,但限制应用程序的安装位置为内部存储。

向用户解释,如果他们要求的事情在您正在开发的平台上没有意义或技术上不可行:如果他们继续提出要求,那么我建议忽略他们。您的星级评分会受到影响,但苦恼于此并不能解决问题。


1
如上所述,如果应用程序只有几MB,用户希望这样做。提出冗长的技术解释(==借口)并不是正确的答案...似乎平台应该为此负责。他们在设计一个只能在下次重启之前工作的闹钟服务时在想什么呢? - toucan

1

您已经有了一些很好的回答来回答这个问题——这是为了澄清、纠正或者解决您在评论中提出的观点。

如果应用程序只有几MB,用户会想要这个功能

有一天,用户可能还会决定他们希望您的应用程序是粉色的,或者是3D的,或者能够与他们的Kenmore洗碗机进行接口交互,而这些都可能不在您的计划之内。因此,我建议您制定一个与客户沟通的系统,解释为什么您的应用程序不是粉色的,不是3D的,不是洗碗机准备好的,也不是存储在外部存储器上的。

现在,我会毫不犹豫地承认,Android市场应该提供更多的帮助,以便进行这种沟通渠道(例如,回复评论)。

提出长篇的技术解释(==借口)并不是正确的答案

您完全可以有自己的看法。我希望您喜欢粉色。

他们在想什么,设计一个只能在下次重启前工作的闹钟服务?

他们不希望应用程序注册闹钟,然后忘记它们。他们希望用户在重启后能够尽可能地开始一个干净的状态。

即使像HTC Desire这样“强大”的手机也只有150MB的用户空间(参见en.wikipedia.org/wiki/HTC_Desire)。这太可悲了。
请随意向HTC提出此问题。我不认为他们经常阅读StackOverflow。
安卓在这里安装应用程序的解决方案最多只是半心半意的。
不,它受到USB大容量存储模式等因素本质上的限制。长期解决方案是消除内部和外部存储之间的区别,这个过程已经在Honeycomb中进行了。
而且用户(普通人使用的不是工程师的手机)完全没有接受UI方面的教育。
我同意可以做更多的事情来帮助用户理解为什么某个应用程序可能无法移动到外部存储器。
人们想知道为什么安卓团队在应用程序设置中添加了“移动到SD卡”选项,因为这对于许多应用程序实际上并不起作用,但却引发了对平台上无法实现的功能的不合理需求。

这主要是针对游戏而言的,游戏是需要大量存储空间的主要应用类别。它们也往往不需要那些外部存储上的应用程序无法正常工作的功能。


1
如果您创建一个中等大小的应用程序,并使用预缩放图形来适应各种屏幕分辨率以使其看起来漂亮,拥有一些用于存储少量内容的数据库等,那么安装后的大小很容易超过5 MB。由于大多数Android设备的内部存储空间非常有限,因此用户希望尽可能多地将应用程序移动到SD卡上,因为这基本上是他们安装所有应用程序的唯一选择。因此,我不同意您的观点,即这是典型的用户反馈/抱怨,就像争论颜色或按钮位置一样。 - toucan
@vesterbaek:我并没有说这是一场抱怨。我说的是,这是一个你没有提供的功能。如果你不打算实现每一个功能,你需要建立一个与客户和潜在客户沟通的渠道,在那里你可以解释为什么你不提供每一个功能。专注于解决这个问题,而不是专注于指责,就像你迄今所做的评论一样。 - CommonsWare
1
那么,这个问题的解决方案是什么呢?似乎唯一可行的解决方案是不使用SD卡。我花了几个小时追踪这个问题,最终发现这是操作系统的限制。我无法相信,在SD卡上实现EXTERNAL_APPLICATIONS_AVAILABLE对应用程序来说会太困难。 - SoftWyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接