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来在名称名称的别名之间唯一选择。
(除非可以仅禁用目标活动之一,并依靠清单中的顺序在备选方案之间进行交换,但这存在脆弱性问题。)