【发布时间】:2012-07-06 21:55:55
【问题描述】:
我见过几个不同的应用程序(如NFC TagInfo 和NFC TagInfo by NXP),它们可以选择在触摸标签时自动启动(或显示在“选择应用程序”列表中)只有在 em> 该选项已在首选项中设置,否则系统似乎完全忽略了意图过滤器。
如何在 Android 应用程序中做到这一点?
【问题讨论】:
我见过几个不同的应用程序(如NFC TagInfo 和NFC TagInfo by NXP),它们可以选择在触摸标签时自动启动(或显示在“选择应用程序”列表中)只有在 em> 该选项已在首选项中设置,否则系统似乎完全忽略了意图过滤器。
如何在 Android 应用程序中做到这一点?
【问题讨论】:
完整的答案是在应用的清单中使用<activity-alias>,如下所示:
<activity-alias
android:name=".ActivityAlias"
android:targetActivity=".YourActualActivity"
android:enabled="false" >
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity-alias>
YourActualActivity 是您希望能够为其打开或关闭意图过滤器的类。由于您不想禁用整个活动,因此您可以使用活动别名,在其中放置要启用的意图过滤器(此处默认情况下禁用)。
在您的 PreferenceActivity 中,您设置了一个在特定设置更改时调用的侦听器。然后它会做这样的事情:
getPackageManager().setComponentEnabledSetting(
new ComponentName("your.package.name", "your.package.name.ActivityAlias"),
changedBooleanPreference ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED :
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
这里changedBooleanPreference是已经改变的设置。
请注意,包管理器可能需要一些时间才能使更改生效。这取决于 Android 版本发生这种情况的时间和速度(可能还取决于设备的 CPU 速度)。
【讨论】:
您可以使用PackageManager 和setComponentEnabledSetting() 禁用具有您希望忽略的<intent-filter> 的组件。
【讨论】:
:)