1

为了避免一些平板电脑/手机连接,我希望我的应用程序通过活动别名向自己发出一个意图,并使清单系统将其传递给主要活动(对于平板电脑)或新活动(对于手机)。

如果我的清单中有这个:

<activity-alias android:name="my.app.WebContent"
              android:targetActivity="my.app.activities.Home"/>

那么一切都很好,并且

Intent {
    act=android.intent.action.VIEW dat=http://www.app.my/url
    cmp=my.app/.WebContent (has extras) }

按预期交付。

但是,如果我的清单中有这个:

<activity-alias android:name="my.app.WebContent"
              android:enabled="@bool/has_one_pane"
              android:targetActivity="my.app.activities.WebContent"/>
<activity-alias android:name="my.app.WebContent"
              android:enabled="@bool/has_two_panes"
              android:targetActivity="my.app.activities.Home"/>

在 values/res.xml 中有这个

<resources>
    <bool name="has_two_panes">false</bool>
    <bool name="has_one_pane">true</bool>
</resources>

这在 values-large/res.xml 和 values-sw600dp/res.xml 中:

<resources>
    <item type="layout" name="content_frame">@layout/activity_item_twopane</item>
    <bool name="has_two_panes">true</bool>
    <bool name="has_one_pane">false</bool>
</resources>

然后我的代码根据 PackageManager.resolveActivity() 将意图过滤为“无法交付”。

似乎 values/res.xml 覆盖了 values-anything/res.xml,即使 values-large 应该覆盖大型显示器的 values/res.xml。

这是Android中的错误,还是我误解了应该如何做?

4

1 回答 1

1

不,它不受支持,因为诸如屏幕宽度(res/layout-w600dp)之类的东西可以随方向而变化,但谷歌显然没有注意到“最小宽度”(res/layout-sw600dp)不受此影响。请参阅片段方向更改 - 比横向更好的测试

另请注意,如何指定仅适用于 Android 上的手机或平板电脑的活动中建议的解决方法不适用于竞争 <activity-alias> 因为您无法构造 ComponentName 以在名称名称的别名之间进行唯一选择。

(除非可以仅禁用一项目标活动并依靠清单中的排序来在备选方案之间进行交换,但这存在脆弱性问题。)

于 2013-01-21T14:44:32.400 回答