وارد کردن و صادر کردن داده‌های صفحه اصلی

داده‌های صفحه اصلی Android را کلاس LauncherProvider ارائه می‌دهد که ContentProvider را گسترش می‌دهد و امکان وارد کردن و صادر کردن داده‌های فضای کاری «راه‌انداز» را بااستفاده از XML فراهم می‌کند.

تعامل با ارائه‌دهنده محتوا

برای تعامل با کلاس LaunchProvider که ContentProvider را گسترش می‌دهد، از روش call استفاده کنید:

class LauncherProvider : ContentProvider {
    public Bundle call(String method, String arg, Bundle extras);
}

فراخوانی کلاس LaunchProvider

برای فراخوانی کلاس LauncherProvider از برنامه‌تان، از موارد زیر استفاده کنید:

class YourClass {

    /**
     * This method imports Launcher workspace data as a XML string. Calling this method clears the old
     * data model within Launcher and replaces it with the imported data. It should be noted
     * that it doesn't need to clear all the Launcher's data, just what is similar to what is being imported.
     */
    fun importLauncherData(xmlRepresentation: String, ctx: Context): Boolean {
        val uri = try {
            getLauncherProviderUri(ctx)
        } catch (e: IllegalStateException) {
            Log.e(TAG, "Failed to get launcher provider URI", e)
            return false
        }
        val bundle = ctx.contentResolver.call(
            uri,
            LauncherProviderConstants.METHOD_IMPORT_LAYOUT_XML,
            xmlRepresentation,
            null,
        )
        return LauncherProviderConstants.SUCCESS
            .equals(bundle.getBoolean(LauncherProviderConstants.KEY_RESULT))
    }

    /**
     * Use this function to retrieve an XML string representation of the Launcher's Workspace.
     * This method doesn't return what the user sees on their home screen,
     * but rather what is in their data model at the moment it's called.
     */
    fun exportLauncherData(xmlRepresentation: String, ctx: Context): String {
        val uri = try {
            getLauncherProviderUri(ctx)
        } catch (e: IllegalStateException) {
            Log.e(TAG, "Failed to get launcher provider URI", e)
            return ""
        }
        val bundle = ctx.contentResolver.call(
            uri,
            LauncherProviderConstants.METHOD_EXPORT_LAYOUT_XML,
            null,
            null,
        )
        if (LauncherProviderConstants.FAILURE
            .equals(bundle.getBoolean(LauncherProviderConstants.KEY_RESULT))) {
            Log.e(TAG, "failed to export launcher data; review previous logs for the cause.")
        }
        return bundle.getString(LauncherProviderConstants.KEY_LAYOUT, "")
    }

    /**
     * Returns a Uri for interacting with Launcher's ContentProvider.
     *
     * Not all Launchers implement this api. This method throws an IllegalStateException
     * if the Launcher doesn't support it.
     */
    private fun getLauncherProviderUri(ctx: Context): Uri {
        val homeIntent = Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME)
        val launcherPackage: String =
            ctx.packageManager
                .resolveActivity(homeIntent, PackageManager.MATCH_DEFAULT_ONLY)
                ?.activityInfo
                ?.packageName ?: throw IllegalStateException("No launcher package found")
        val authority = "${launcherPackage}.settings"
        ctx.packageManager.resolveContentProvider(authority, 0)
            ?: throw IllegalStateException(
                "Launcher package '$launcherPackage' does not support LauncherProvider",
            )
        return "content://$authority".toUri()
    }
}

پارامترها

این ثابت‌ها در روش فراخوانی استفاده می‌شوند:

object LauncherProviderConstants {

    // Valid arg parameters for export and import operations
    private static final String METHOD_EXPORT_LAYOUT_XML = "EXPORT_LAYOUT_XML";
    private static final String METHOD_IMPORT_LAYOUT_XML = "IMPORT_LAYOUT_XML";

    // Bundle key and value set for determining if operation completed successfully or not
    private static final String KEY_RESULT = "KEY_RESULT";
    private static final String SUCCESS = "success";
    private static final String FAILURE = "failure";

    // Bundle key used to store exported XML-string representation of Launcher's workspace layout
    // and item metadata
    private static final String KEY_LAYOUT = "KEY_LAYOUT";
}

از ثابت‌های LauncherProvider با محدودیت‌های زیر استفاده کنید:

  • از روش contentResolver.call با EXPORT_LAYOUT_XML به‌عنوان پارامتر روش برای صادر کردن نمایش XML فضای کاری راه‌انداز استفاده کنید.
  • درطول صادر کردن، نمایش XML در دسته‌ای که بااستفاده از کلید KEY_LAYOUT برگردانده شده است دردسترس است.
  • برای وارد کردن نمایش XML فضای کاری راه‌انداز، از روش contentResolver.call با IMPORT_LAYOUT_XML به‌عنوان پارامتر روش استفاده کنید.
  • درطول وارد کردن، نمایش XML به‌عنوان پارامتر arg روش تماس ارائه می‌شود.
  • برای هر دو فراخوان میانای برنامه‌سازی کاربردی صادر کردن و وارد کردن، تکمیل موفقیت‌آمیز عملیات انتخابی success را برمی‌گرداند و عملیات قطع‌شده یا ناموفق failure را برمی‌گرداند.
  • مقدار success یا failure بااستفاده از کلید KEY_RESULT در دسته‌ای که برگردانده شده است قابل‌بازیابی است.

برای مثال، فراخوانی کلاس LaunchProvider را ببینید.

نمایش XML

از راهنماهای زیر برای ساختار XML درطول وارد کردن و صادر کردن استفاده کنید.

  • برنامه Workspace:

    <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
    <workspace rows="4" columns="5">
      <autoinstall container="desktop" x="1" y="1" screen="0" className="com.android.launcher3.tests.Activity2" packageName="com.google.android.apps.nexuslauncher" />
    </workspace>
    
  • برنامه صندلی داغ:

    <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
    <workspace>
      <autoinstall container="hotseat" rank="0" className="com.android.launcher3.tests.Activity2" packageName="com.google.android.apps.nexuslauncher" />
    </workspace>
    
  • ابزاره:

    <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
    <workspace>
      <appwidget container="desktop" spanX="2" spanY="2" x="0" y="1" screen="0" className="PlaceholderWidget" packageName="com.test.pending" />
    </workspace>
    
  • پوشه:

    <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
    <workspace>
      <folder container="desktop" x="1" y="1" screen="1" titleText="CustomFolder">
        <autoinstall className="com.android.launcher3.tests.Activity1" packageName="com.google.android.apps.nexuslauncher" />
        <autoinstall className="com.android.launcher3.tests.Activity2" packageName="com.google.android.apps.nexuslauncher" />
        <autoinstall className="com.android.launcher3.tests.Activity3" packageName="com.google.android.apps.nexuslauncher" />
      </folder>
    </workspace>
    
  • میان‌بر عمیق:

    <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
    <workspace>
      <shortcut shortcutId="shortcut2" packageName="com.google.android.apps.nexuslauncher.tests" />
    </workspace>
    
  • جفت برنامه:

    <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
    <workspace>
      <apppair container="desktop" x="1" y="1" screen="1" titleText="CustomFolder">
        <autoinstall className="com.android.launcher3.tests.Activity1" packageName="com.google.android.apps.nexuslauncher" />
        <autoinstall className="com.android.launcher3.tests.Activity2" packageName="com.google.android.apps.nexuslauncher" />
      </apppair>
    </workspace>
    

فرض‌های رفتاری

موارد زیر فرض‌های رفتاری برای کلاس LaunchProvider است.

  • روش‌ها اتمی و مسدودکننده هستند.
  • داده‌های مشابه در راه‌انداز درطول وارد کردن رونویسی می‌شود و فقط داده‌های جدید واردشده باقی می‌ماند.
  • داده‌های واردشده بلافاصله دردسترس است؛ صادر کردن بلافاصله پس‌از وارد کردن داده‌های جدید را برمی‌گرداند.