یک ویجت پیشرفته ایجاد کنید

روش Compose را امتحان کنید
Jetpack Compose جعبه ابزار UI توصیه شده برای اندروید است. با نحوه ساخت ابزارک با استفاده از APIهای سبک Compose آشنا شوید.

این صفحه روش های توصیه شده برای ایجاد یک ویجت پیشرفته تر برای تجربه کاربری بهتر را توضیح می دهد.

بهینه سازی برای به روز رسانی محتوای ویجت

به روز رسانی محتوای ویجت می تواند از نظر محاسباتی گران باشد. برای صرفه جویی در مصرف باتری، نوع به روز رسانی، فرکانس و زمان بندی را بهینه کنید.

انواع به روز رسانی ویجت

سه راه برای به روز رسانی یک ویجت وجود دارد: به روز رسانی کامل، به روز رسانی جزئی، و در مورد ویجت مجموعه، به روز رسانی داده ها. هر کدام هزینه های محاسباتی و پیامدهای متفاوتی دارند.

موارد زیر هر نوع به روز رسانی را توضیح می دهد و کدهایی را برای هر کدام ارائه می دهد.

  • به روز رسانی کامل: برای به روز رسانی کامل ویجت، با AppWidgetManager.updateAppWidget(int, android.widget.RemoteViews) تماس بگیرید. این RemoteViews ارائه شده قبلی را با RemoteViews جدید جایگزین می کند. این گران ترین به روز رسانی محاسباتی است.

    کاتلین

    val appWidgetManager = AppWidgetManager.getInstance(context)
    val remoteViews = RemoteViews(context.getPackageName(), R.layout.widgetlayout).also {
    setTextViewText(R.id.textview_widget_layout1, "Updated text1")
    setTextViewText(R.id.textview_widget_layout2, "Updated text2")
    }
    appWidgetManager.updateAppWidget(appWidgetId, remoteViews)

    جاوا

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
    remoteViews.setTextViewText(R.id.textview_widget_layout1, "Updated text1");
    remoteViews.setTextViewText(R.id.textview_widget_layout2, "Updated text2");
    appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
  • به روز رسانی جزئی: برای به روز رسانی بخش هایی از ویجت AppWidgetManager.partiallyUpdateAppWidget تماس بگیرید. این RemoteViews جدید را با RemoteViews ارائه شده قبلی ادغام می کند. اگر ویجت حداقل یک به‌روزرسانی کامل را از طریق updateAppWidget(int[], RemoteViews) دریافت نکند، این روش نادیده گرفته می‌شود.

    کاتلین

    val appWidgetManager = AppWidgetManager.getInstance(context)
    val remoteViews = RemoteViews(context.getPackageName(), R.layout.widgetlayout).also {
    setTextViewText(R.id.textview_widget_layout, "Updated text")
    }
    appWidgetManager.partiallyUpdateAppWidget(appWidgetId, remoteViews)

    جاوا

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
    remoteViews.setTextViewText(R.id.textview_widget_layout, "Updated text");
    appWidgetManager.partiallyUpdateAppWidget(appWidgetId, remoteViews);
  • بازخوانی داده‌های مجموعه: با AppWidgetManager.notifyAppWidgetViewDataChanged تماس بگیرید تا داده‌های نمای مجموعه در ویجت خود را باطل کنید. این باعث می شود RemoteViewsFactory.onDataSetChanged . در این میان، داده های قدیمی در ویجت نمایش داده می شوند. با این روش می توانید با خیال راحت کارهای گران قیمت را به صورت همزمان انجام دهید.

    کاتلین

    val appWidgetManager = AppWidgetManager.getInstance(context)
    appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_listview)

    جاوا

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_listview);

تا زمانی که برنامه دارای همان UID کلاس AppWidgetProvider مربوطه باشد، می‌توانید این روش‌ها را از هر کجای برنامه خود فراخوانی کنید.

تعیین کنید هر چند وقت یکبار یک ویجت را به روز کنید

ویجت ها به صورت دوره ای بسته به مقدار ارائه شده برای ویژگی updatePeriodMillis به روز می شوند. ویجت می‌تواند در پاسخ به تعامل کاربر، به‌روزرسانی‌های پخش یا هر دو به‌روزرسانی شود.

به صورت دوره ای به روز کنید

می‌توانید با تعیین یک مقدار برای AppWidgetProviderInfo.updatePeriodMillis در XML appwidget-provider فرکانس به‌روزرسانی دوره‌ای را کنترل کنید. هر به روز رسانی متد AppWidgetProvider.onUpdate() فعال می کند، جایی که می توانید کد را برای به روز رسانی ویجت قرار دهید. با این حال، اگر ویجت شما نیاز به بارگیری داده ها به صورت ناهمزمان یا بیش از 10 ثانیه طول می کشد تا به روز رسانی شود، گزینه های جایگزین برای به روز رسانی گیرنده پخش که در بخش زیر توضیح داده شده است را در نظر بگیرید، زیرا پس از 10 ثانیه، سیستم یک BroadcastReceiver را پاسخگو نمی داند.

updatePeriodMillis از مقادیر کمتر از 30 دقیقه پشتیبانی نمی کند. با این حال، اگر می خواهید به روز رسانی های دوره ای را غیرفعال کنید، می توانید 0 را تعیین کنید.

می‌توانید به کاربران اجازه دهید فرکانس به‌روزرسانی‌ها را در یک پیکربندی تنظیم کنند. به عنوان مثال، آنها ممکن است بخواهند که یک علامت سهام هر 15 دقیقه یا فقط چهار بار در روز به روز شود. در این حالت، updatePeriodMillis روی 0 قرار دهید و به جای آن از WorkManager استفاده کنید.

به روز رسانی در پاسخ به تعامل کاربر

در اینجا چند روش توصیه شده برای به روز رسانی ویجت بر اساس تعامل کاربر آورده شده است:

  • از یک فعالیت برنامه: مستقیماً با AppWidgetManager.updateAppWidget در پاسخ به تعامل کاربر، مانند ضربه زدن کاربر، تماس بگیرید.

  • از تعاملات راه دور، مانند اعلان یا ویجت برنامه: یک PendingIntent بسازید، سپس ویجت را از Activity ، Broadcast یا Service فراخوانی شده به روز کنید. شما می توانید اولویت خود را انتخاب کنید. به عنوان مثال، اگر یک Broadcast برای PendingIntent انتخاب کنید، می توانید یک پخش پیش زمینه را برای اولویت دادن BroadcastReceiver انتخاب کنید.

به روز رسانی در پاسخ به یک رویداد پخش

نمونه ای از یک رویداد پخش که برای به روز رسانی به ویجت نیاز دارد، زمانی است که کاربر عکس می گیرد. در این حالت، شما می خواهید وقتی یک عکس جدید شناسایی شد، ویجت را به روز کنید.

می‌توانید یک کار را با JobScheduler زمان‌بندی کنید و با استفاده از روش JobInfo.Builder.addTriggerContentUri ، پخش را به عنوان محرک مشخص کنید.

همچنین می‌توانید یک BroadcastReceiver برای پخش ثبت کنید - برای مثال، گوش دادن به ACTION_LOCALE_CHANGED . با این حال، چون این کار منابع دستگاه را مصرف می کند، با احتیاط از آن استفاده کنید و فقط به پخش خاص گوش دهید. با معرفی محدودیت‌های پخش در Android 7.0 (سطح API 24) و Android 8.0 (سطح API 26)، برنامه‌ها نمی‌توانند پخش‌های ضمنی را در مانیفست‌های خود ثبت کنند، به استثنای برخی موارد .

ملاحظات هنگام به روز رسانی یک ویجت از یک BroadcastReceiver

اگر ویجت از یک BroadcastReceiver ، از جمله AppWidgetProvider به‌روزرسانی می‌شود، از ملاحظات زیر در رابطه با مدت زمان و اولویت به‌روزرسانی ویجت آگاه باشید.

مدت زمان به روز رسانی

به عنوان یک قاعده، سیستم به گیرنده‌های پخش که معمولاً در رشته اصلی برنامه اجرا می‌شوند، اجازه می‌دهد تا 10 ثانیه قبل از اینکه آنها را پاسخگو نمی‌داند و خطای Application Not Responding (ANR) را راه‌اندازی کند، کار کنند. برای جلوگیری از مسدود شدن رشته اصلی در هنگام مدیریت پخش، از روش goAsync استفاده کنید. اگر به‌روزرسانی ویجت بیشتر طول می‌کشد، با استفاده از WorkManager یک کار را زمان‌بندی کنید.

Caution: Any work you do here blocks further broadcasts until it completes,
so it can slow the receiving of later events.

برای اطلاعات بیشتر به ملاحظات امنیتی و بهترین شیوه ها مراجعه کنید.

اولویت به روز رسانی

به طور پیش‌فرض، پخش‌ها - از جمله آنهایی که با استفاده از AppWidgetProvider.onUpdate ساخته شده‌اند - به عنوان فرآیندهای پس‌زمینه اجرا می‌شوند. این بدان معناست که منابع بیش از حد سیستم می تواند باعث تاخیر در فراخوانی گیرنده پخش شود. برای اولویت بندی پخش، آن را به یک فرآیند پیش زمینه تبدیل کنید.

برای مثال، پرچم Intent.FLAG_RECEIVER_FOREGROUND را به Intent اضافه کنید که به PendingIntent.getBroadcast زمانی که کاربر روی قسمت خاصی از ویجت ضربه می‌زند.