হোম স্ক্রিন ডেটা আমদানি এবং রপ্তানি করুন

অ্যান্ড্রয়েড হোম স্ক্রিনের ডেটা LauncherProvider ক্লাস দ্বারা সরবরাহ করা হয়, যা ContentProvider এক্সটেন্ড করে এবং XML ব্যবহার করে লঞ্চার ওয়ার্কস্পেস ডেটা ইম্পোর্ট ও এক্সপোর্ট করার সুযোগ দেয়।

কন্টেন্ট প্রদানকারীর সাথে যোগাযোগ করুন

ContentProvider ক্লাসকে এক্সটেন্ড করে এমন LaunchProvider ক্লাসের সাথে ইন্টারঅ্যাক্ট করতে, 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 কনস্ট্যান্টগুলি ব্যবহার করুন:

  • লঞ্চারের ওয়ার্কস্পেসের একটি XML উপস্থাপনা এক্সপোর্ট করতে, মেথড প্যারামিটার হিসেবে EXPORT_LAYOUT_XML সহ contentResolver.call মেথডটি ব্যবহার করুন।
  • এক্সপোর্টের সময়, ফেরত আসা বান্ডেলে KEY_LAYOUT কী ব্যবহার করে XML রিপ্রেজেন্টেশনটি অ্যাক্সেস করা যায়।
  • লঞ্চারের ওয়ার্কস্পেসের একটি XML উপস্থাপনা ইম্পোর্ট করতে, মেথড প্যারামিটার হিসেবে IMPORT_LAYOUT_XML সহ contentResolver.call মেথডটি ব্যবহার করুন।
  • ইম্পোর্ট করার সময়, XML উপস্থাপনাটি কল মেথডের arg প্যারামিটার হিসেবে প্রদান করা হয়।
  • এক্সপোর্ট এবং ইম্পোর্ট উভয় এপিআই কলের ক্ষেত্রেই, নির্বাচিত অপারেশনটি সফলভাবে সম্পন্ন হলে success রিটার্ন করে, এবং অপারেশনটি বাধাগ্রস্ত বা ব্যর্থ হলে failure রিটার্ন করে।
  • ফেরত আসা বান্ডেল থেকে KEY_RESULT কী ব্যবহার করে success বা failure মানটি পাওয়া যায়।

একটি উদাহরণের জন্য, LaunchProvider ক্লাসটি আহ্বান করা দেখুন।

XML উপস্থাপনা

আমদানি ও রপ্তানির সময় XML কাঠামোর জন্য নিম্নলিখিত নির্দেশিকাগুলো ব্যবহার করুন।

  • ওয়ার্কস্পেস অ্যাপ:

    <?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 ক্লাসের জন্য নিম্নলিখিত আচরণগত অনুমানগুলো প্রযোজ্য।

  • পদ্ধতিগুলো হলো অ্যাটমিক এবং ব্লকিং।
  • ইম্পোর্ট করার সময় লঞ্চারে থাকা অনুরূপ ডেটা মুছে যায়, ফলে শুধু নতুন ইম্পোর্ট করা ডেটাই থেকে যায়।
  • ইম্পোর্ট করা ডেটা তাৎক্ষণিকভাবে অ্যাক্সেসযোগ্য হয়; ইম্পোর্ট করার ঠিক পরেই এক্সপোর্ট করলে নতুন ডেটা ফেরত আসে।