是否支持在清单中使用android:enabled =” @ bool / tablet”或” @ bool / phone”启用活动别名?

Is selectively enabling an activity-alias in the manifest with android:enabled=“@bool/tablet” or “@bool/phone” supported?

为避免某些平板电脑/手机连线,我希望我的应用通过活动别名发布自己的意图,并使清单系统将其传递到主要活动(对于平板电脑)或新活动(对于手机)。

如果我的清单中有此内容:

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

然后一切都好,

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

按预期方式交付。

但是,如果我的清单中有此内容:

1
2
3
4
5
6
<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

1
2
3
4
<resources>
    <bool name="has_two_panes">false</bool>
    <bool name="has_one_pane">true</bool>
</resources>

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

1
2
3
4
5
<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 / large应该会覆盖values / res.xml,但似乎values / res.xml会覆盖values-anything / res.xml。

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


不,不支持此操作,因为屏幕宽度(res / layout-w600dp)之类的内容可以随方向改变,但Google显然没有注意到"最小宽度"(res / layout-sw600dp)不受此影响。请参阅片段方向更改-比Landscape

更好的测试

还请注意,如何指定仅适用于Android上的手机或平板电脑的活动中建议的变通办法不适用于竞争,因为您无法构造ComponentName来在名称名称的别名之间唯一选择。

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