Android私有API

时间:2011-02-23 04:36:19

标签: android api

我知道这听起来很奇怪我在one of my question问了类似的问题 我按照建议的方式尝试了但是在安装我的应用程序后,如果我按下主页键,则会使用默认启动器应用程序和我的应用程序使用对话框打开完成操作

正如上面提到的问题,在汽车之家应用程序中,它永远不会让你到达主屏幕,虽然它从未要求你用完整动作替换发射器。

所以我的问题是它是否将自己注册为启动器,它是如何绕过该对话框的。

1 个答案:

答案 0 :(得分:3)

简短的回答是,你将无法做你想做的事。只有启动器/汽车底座/桌面底座程序可以作用于主页按钮,并且仅在适当的模式下(在汽车底座,桌面底座或其他模式中)。

长答案:

Android中的Home按钮基本上有三种行为。它可以启动Home或启动Car Dock或启动Desk Dock。这可以在: 机器人/框架/碱/策略/ SRC / COM /机器人/内部/策略/ IMPL / PhoneWindowManager.java

当点击主页按钮时,它会尝试找出与此功能一起使用的意图:

/**
 * Return an Intent to launch the currently active dock as home.  Returns
 * null if the standard home should be launched.
 * @return
 */
Intent createHomeDockIntent() {
    Intent intent;

    // What home does is based on the mode, not the dock state.  That
    // is, when in car mode you should be taken to car home regardless
    // of whether we are actually in a car dock.
    if (mUiMode == Configuration.UI_MODE_TYPE_CAR) {
        intent = mCarDockIntent;
    } else if (mUiMode == Configuration.UI_MODE_TYPE_DESK) {
        intent = mDeskDockIntent;
    } else {
        return null;
    }

    ActivityInfo ai = intent.resolveActivityInfo(
            mContext.getPackageManager(), PackageManager.GET_META_DATA);
    if (ai == null) {
        return null;
    }

    if (ai.metaData != null && ai.metaData.getBoolean(Intent.METADATA_DOCK_HOME)) {
        intent = new Intent(intent);
        intent.setClassName(ai.packageName, ai.name);
        return intent;
    }

    return null;
}

因此,如果手机在车载底座或桌面底座上,确实可以绕过发射器。但通常情况下,当没有这样的码头时,将会调用启动器。

如果你很好奇这些是意图。它们不是针对特定应用程序的硬编码,但将使用该类别的默认应用程序。

    mHomeIntent =  new Intent(Intent.ACTION_MAIN, null);
    mHomeIntent.addCategory(Intent.CATEGORY_HOME);
    mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
            | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

    mCarDockIntent =  new Intent(Intent.ACTION_MAIN, null);
    mCarDockIntent.addCategory(Intent.CATEGORY_CAR_DOCK);
    mCarDockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
            | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

    mDeskDockIntent =  new Intent(Intent.ACTION_MAIN, null);
    mDeskDockIntent.addCategory(Intent.CATEGORY_DESK_DOCK);
    mDeskDockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
            | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);