Android ana ekran verileri, ContentProvider'ı genişleten LauncherProvider sınıfı tarafından sağlanır. Bu sınıf, XML kullanarak Launcher çalışma alanı verilerinin içe ve dışa aktarılmasına olanak tanır.
İçerik sağlayıcıyla etkileşim kurma
ContentProvider sınıfını genişleten LaunchProvider sınıfıyla etkileşim kurmak için call yöntemini kullanın:
class LauncherProvider : ContentProvider {
    public Bundle call(String method, String arg, Bundle extras);
}
LaunchProvider sınıfını çağırma
Uygulamanızdan LauncherProvider sınıfını çağırmak için aşağıdakileri kullanın:
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()
    }
}
Parametreler
Bu sabitler, arama yönteminde kullanılır:
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 sabitlerini aşağıdaki kısıtlamalarla kullanın:
- Başlatıcının çalışma alanının XML gösterimini dışa aktarmak için yöntem parametresi olarak EXPORT_LAYOUT_XMLilecontentResolver.callyöntemini kullanın.
- Dışa aktarma sırasında, döndürülen paketteki XML gösterimine KEY_LAYOUTanahtarı kullanılarak erişilebilir.
- Başlatıcı çalışma alanının XML gösterimini içe aktarmak için yöntem parametresi olarak IMPORT_LAYOUT_XMLilecontentResolver.callyöntemini kullanın.
- İçe aktarma sırasında XML gösterimi, çağrı yönteminin argparametresi olarak sağlanır.
- Hem dışa aktarma hem de içe aktarma API çağrılarında, seçilen işlemin başarıyla tamamlanması success, kesintiye uğrayan veya başarısız olan işlemler isefailuredöndürür.
- successveya- failuredeğeri,- KEY_RESULTanahtarı kullanılarak döndürülen pakette alınabilir.
Örnek için LaunchProvider sınıfını çağırma bölümüne bakın.
XML gösterimi
İçe ve dışa aktarma sırasında XML yapısı için aşağıdaki kılavuzları kullanın.
- Workspace uygulaması: - <?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>
- Hotseat uygulaması: - <?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>
- Widget: - <?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>
- Klasör: - <?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>
- Derin kısayol: - <?xml version='1.0' encoding='UTF-8' standalone='yes' ?> <workspace> <shortcut shortcutId="shortcut2" packageName="com.google.android.apps.nexuslauncher.tests" /> </workspace>
- Uygulama çifti: - <?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>
Davranışsal varsayımlar
LaunchProvider sınıfıyla ilgili davranışsal varsayımlar aşağıda verilmiştir.
- Yöntemler atomik ve engelleyici olmalıdır.
- Başlatıcıdaki benzer verilerin üzerine içe aktarma sırasında yazılır ve yalnızca yeni içe aktarılan veriler kalır.
- İçe aktarılan verilere hemen erişilebilir. İçe aktarma işleminden hemen sonra dışa aktarma işlemi yapıldığında yeni veriler döndürülür.
