Android 托管配置提供商

Android managed configurations provider

设置托管配置页面的overview部分说明如下:

Apps define the managed configuration options that can be remotely set by an administrator. These are arbitrary settings that can be changed by a managed configuration provider.
[...]
The managed configurations provider is another app running on the same device.

然后该页面描述了如何设置托管应用程序,但没有关于以下内容的任何进一步信息:"managed configurations provider app" - 如果我理解正确,该应用程序负责发送 ACTION_APPLICATION_RESTRICTIONS_CHANGED 当配置更改时。

我的问题是这个 "provider app" 是什么类型的应用程序?这个应用程序是否应该实施任何 Android API 才能充当配置提供程序?此配套应用如何将配置更改挂钩到 RestrictionsManager,以便托管应用能够检索它们?

我在这里问这个问题是因为不幸的是我没有在 Android 文档中找到任何参考资料。

What kind of app is this "provider app"?

配置提供程序应用是设备上的另一个应用 运行。此应用程序通常由管理员控制。管理员将配置更改传达给提供商应用程序,而该应用程序又会更改托管应用程序上的配置。

查看 BasicManagedProfile 示例:https://github.com/googlesamples/android-BasicManagedProfile。这就是这种应用程序。

Are there any Android API this app should implement in order to act as a configurations provider?

是的,此应用程序应要求配置受管理的配置文件:

Intent intent = new Intent(ACTION_PROVISION_MANAGED_PROFILE);
intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME,
                        activity.getApplicationContext().getPackageName());
if (intent.resolveActivity(activity.getPackageManager()) != null) {
    startActivityForResult(intent, REQUEST_PROVISION_MANAGED_PROFILE);
    activity.finish();
} else {
    Toast.makeText(activity, "Device provisioning is not enabled. Stopping.",
                                                  Toast.LENGTH_SHORT).show();
}

How does this companion app hooks the configuration changes into the RestrictionsManager, so that the managed app to be able to retrieve them?

它使用 DevicePolicyManager 对托管应用实施限制:

DevicePolicyManager manager = (DevicePolicyManager) getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);

Bundle settings = new Bundle();
settings.putBoolean("downloadOnCellular", true);

manager.setApplicationRestrictions(
        BasicDeviceAdminReceiver.getComponentName(getActivity()),
        PACKAGE_NAME_MANAGED_APP, settings);

再次看看示例项目中是如何完成的。