【问题标题】:Overriding Home button for a Car Home replacement app覆盖 Car Home 替换应用程序的 Home 按钮
【发布时间】:2011-02-21 04:50:16
【问题描述】:

我一直致力于替换现有的 Car Home 应用程序,但我完全不知道如何覆盖 Home 按钮,以便在手机停靠时将我的应用程序带回前台。这就是汽车之家的运作方式,所以一定有办法。

BroadcastReceivers 似乎不起作用,因为每当按下 Home 按钮时广播的意图仍会导致默认主屏幕应用程序启动;我无法阻止它。我可以从我的应用程序中覆盖主页按钮,但这对我没有好处,因为当用户在我的应用程序之外时这需要工作。 Car Home 也不会做任何奇怪的事情,比如在运行时将自己设置为默认主屏幕应用程序(我检查了 logcat 以确保)。

在这件事上,我真的一直在碰壁。有没有人有任何想法,或者你至少能给我指出正确的方向吗?

【问题讨论】:

    标签: android dock android-homebutton


    【解决方案1】:

    我找到了解决 HOME 键的方法。对于您的应用程序,将清单设置为

    <action android:name="android.intent.action.MAIN" />                              
    <category android:name="android.intent.category.HOME" />                                
    <category android:name="android.intent.category.DEFAULT" />                            
    <category android:name="android.intent.category.MONKEY"/> 
    

    现在您的应用程序是备用启动器应用程序。

    使用 adb,并使用包管理器禁用启动器应用程序

    pm 禁用 com.android.launcher2。

    现在 Home 键按下将始终保持在同一屏幕上。

    【讨论】:

    • 这确实会强制主页按钮始终启动您的应用程序,但它会禁用您的正常启动器应用程序。这对我来说并不理想,因为我只希望主页按钮在手机处于对接状态时改变其行为。
    • @amiekuser thanx 寻找同样需要禁用启动器。您能提供一些详细信息如何禁用启动器
    【解决方案2】:

    嗯,几个月后我终于找到了这个问题的答案。关键是“android.dock_home”元数据元素,可在此处找到:

    http://developer.android.com/reference/android/content/Intent.html#METADATA_DOCK_HOME

    通过在您的 AndroidManifest.xml 中使用它,您可以使您的停靠应用程序暂时成为主应用程序。为此,请将此行添加到 Dock 应用活动的 Activity 标记内的 AndroidManifest.xml:

    <meta-data android:name="android.dock_home" android:value="true" />
    

    如果该值设置为 true,则只要您的手机停靠在主屏幕按钮上,您就会返回停靠应用程序。取消对接后,Home 按钮将带您回到正常的 Home 应用。

    【讨论】:

    • 如何使用此元数据覆盖主页按钮。我使用它,但它对我不起作用。请给出您在活动中编写的完整代码。
    • 基本上,在您的 AndroidManifest.xml 中,您需要编辑要用作停靠主页的 Activity 的 xml,如下所示:&lt;activity&gt; &lt;meta-data android:name="android.dock_home" android:value="true" /&gt; &lt;/activity&gt; 我不在我的机器附近现在所以我不能给你完整的代码,但只要你把那行放在 Activity 标记中,你就可以开始了。
    • 如果设备是 Froyo 之前的:Intent dockIntent = new Intent(); dockIntent.setAction(Intent.ACTION_DOCK_EVENT); dockIntent.putExtra(Intent.EXTRA_DOCK_STATE,Intent.EXTRA_DOCK_STATE_CAR); sendStickyBroadcast(dockIntent); 如果是 Froyo 或更高版本:UiModeManager manager = (UiModeManager) getSystemService(Context.UI_MODE_SERVICE); manager.enableCarMode(0);
    • 使用上面写的代码,它应该是这样的:&lt;activity android:name=".Home" android:label="@string/app_name"&gt; &lt;meta-data android:name="android.dock_home" android:value="true" /&gt; &lt;intent-filter&gt; &lt;action android:name="android.intent.action.MAIN"/&gt; &lt;category android:name="android.intent.category.LAUNCHER"/&gt; &lt;category android:name="android.intent.category.CAR_DOCK"/&gt; &lt;category android:name="android.intent.category.DEFAULT"/&gt; &lt;/intent-filter&gt; &lt;/activity&gt;
    【解决方案3】:

    您需要在清单中设置正确的意图过滤器,以便在您对接手机时自动启动应用。有关信息,请参阅http://developer.android.com/reference/android/content/Intent.html#CATEGORY_CAR_DOCK

    【讨论】:

    • 也许我需要澄清一下...我已经为 CATEGORY_CAR_DOCK 的主要活动设置了一个意图过滤器,当您将其放入汽车底座时,我的应用程序就会启动,就像它应该做的那样。问题是,当您在应用程序运行时点击 Home 按钮时,它应该被带回到前面,就像 Car Home 运行时发生的情况一样。这就是我坚持的部分。
    【解决方案4】:

    很遗憾,在公共 API 中无法在没有用户确认的情况下覆盖主页按钮。

    最好的办法是实现CATEGORY_HOME Intent。这意味着当用户按下 Home 时,他们将看到运行标准 Home 或您的 Home 的选项,并根据需要将您的设为默认。

    当您的应用程序启动时,您可以检查手机是否已对接。如果手机没有对接,您可以在显示任何内容之前打开标准主屏幕并关闭您的应用。

    【讨论】:

    • 问题是我的应用程序并不是一个家庭替代应用程序。另外,让应用程序自动启动只是为了杀死自己并启动不同的启动器应用程序(以及它如何知道是哪一个?)的想法并不理想。不要试图否定你的答案;相信我,我已经考虑过这样做,但必须有更好的方法来做到这一点。就像我说的,Car Home 做到了这一点,并且市场上至少还有一个其他应用程序也做到了这一点。
    • 我见过的一个应用程序是 Toddler Lock,它确实覆盖了 Home 意图。 Car Home 可能使用未发布的 API 来完成它的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2017-02-02
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    相关资源
    最近更新 更多