Site icon C1CTech

Android App Widgets with Example

<p>In this article&comma; we will talk about Android Widgets&comma; how to add Widgets into our application and also how to work with it with a simple example&period;<&sol;p>&NewLine;<h3><span style&equals;"color&colon; &num;000080&semi;"><strong>What is an App Widget&quest;<&sol;strong><&sol;span><&sol;h3>&NewLine;<p><strong><span style&equals;"color&colon; &num;008000&semi;">App Widgets<&sol;span><&sol;strong> are miniature application views of an app’s most important data and functionality that is accessible right from the user’s home screen and receive periodic updates&period; Using widgets users can see the information they need &OpenCurlyDoubleQuote;at-a-glance” without unlocking their phone or launching the related app&period; An application component that is able to hold other App Widgets is called an <strong><span style&equals;"color&colon; &num;008000&semi;">App Widget host <&sol;span><&sol;strong><span style&equals;"color&colon; &num;008000&semi;"><span style&equals;"color&colon; &num;000000&semi;">&lpar;such as the Home screen&rpar;<&sol;span><&sol;span>&period;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">Get GITHUB code from <a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;github&period;com&sol;arunk7839&sol;AndroidWidgetExample">here<&sol;a>&period;<&sol;span><&sol;strong><&sol;p>&NewLine;<p><span class&equals;"embed-youtube" style&equals;"text-align&colon;center&semi; display&colon; block&semi;"><amp-youtube data-videoid&equals;"aw3TYsAbB-I" data-param-rel&equals;"1" data-param-showsearch&equals;"0" data-param-showinfo&equals;"1" data-param-iv&lowbar;load&lowbar;policy&equals;"1" data-param-fs&equals;"1" data-param-hl&equals;"en-US" data-param-autohide&equals;"2" data-param-wmode&equals;"transparent" width&equals;"1200" height&equals;"675" layout&equals;"responsive"><a href&equals;"https&colon;&sol;&sol;www&period;youtube&period;com&sol;watch&quest;v&equals;aw3TYsAbB-I" placeholder><amp-img src&equals;"https&colon;&sol;&sol;i&period;ytimg&period;com&sol;vi&sol;aw3TYsAbB-I&sol;hqdefault&period;jpg" alt&equals;"YouTube Poster" layout&equals;"fill" object-fit&equals;"cover"><noscript><img src&equals;"https&colon;&sol;&sol;i&period;ytimg&period;com&sol;vi&sol;aw3TYsAbB-I&sol;hqdefault&period;jpg" loading&equals;"lazy" decoding&equals;"async" alt&equals;"YouTube Poster"><&sol;noscript><&sol;amp-img><&sol;a><&sol;amp-youtube><&sol;span><&sol;p>&NewLine;<h3><span style&equals;"color&colon; &num;000080&semi;"><strong>Creating New Project<&sol;strong><&sol;span><&sol;h3>&NewLine;<p><strong>1<&sol;strong>&period; Create a new project in <span style&equals;"color&colon; &num;008000&semi;"><strong>Android Studio<&sol;strong> <&sol;span>from <span style&equals;"color&colon; &num;008000&semi;"><strong>File &Implies; New Project<&sol;strong><&sol;span> and fill the project details&period;<&sol;p>&NewLine;<p><strong>2<&sol;strong>&period; Now to set up a widget for your application thanks to Android Studio&comma; it does this for you automatically&period; To create a widget right click on<span style&equals;"color&colon; &num;008000&semi;"><strong> project root folder under <span style&equals;"color&colon; &num;0000ff&semi;">Java folder<&sol;span> -&gt&semi; New -&gt&semi; Widget -&gt&semi; App Widget<&sol;strong>&period;<&sol;span><&sol;p>&NewLine;<p><img class&equals;" size-full wp-image-1427 aligncenter" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2019&sol;12&sol;Screenshot-2019-12-12-15&period;57&period;12&period;png" alt&equals;"Screenshot 2019-12-12 15&period;57&period;12" width&equals;"2204" height&equals;"1378" &sol;><&sol;p>&NewLine;<p><strong>3<&sol;strong>&period; Once you click on it&comma; a <span style&equals;"color&colon; &num;008000&semi;"><strong>New Android Component<&sol;strong><&sol;span> window will open&period; Android Studio has an amazing interface for creating widgets&period;<&sol;p>&NewLine;<figure id&equals;"attachment&lowbar;1428" aria-describedby&equals;"caption-attachment-1428" style&equals;"width&colon; 570px" class&equals;"wp-caption aligncenter"><img class&equals;"alignnone size-full wp-image-1428" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2019&sol;12&sol;android&lowbar;widget&lowbar;creation&period;gif" alt&equals;"android&lowbar;widget&lowbar;creation" width&equals;"570" height&equals;"472" &sol;><figcaption id&equals;"caption-attachment-1428" class&equals;"wp-caption-text">Android Studio &&num;8211&semi; Create  a new App Widget<&sol;figcaption><&sol;figure>&NewLine;<ul class&equals;"ul1">&NewLine;<li class&equals;"li1">Provide a <span style&equals;"color&colon; &num;0000ff&semi;"><strong>name<&sol;strong><&sol;span> for your widget &lpar;We give it <span style&equals;"color&colon; &num;008000&semi;"><b>MyAppWidget<&sol;b><&sol;span>&rpar;&period;<&sol;li>&NewLine;<li class&equals;"li1">Select <span style&equals;"color&colon; &num;0000ff&semi;"><strong>placement<&sol;strong><&sol;span> which defines whether your App Widget can be displayed on the home screen &lpar;<span class&equals;"s2">home&lowbar;screen<&sol;span>&rpar;&comma; the lock screen &lpar;<span class&equals;"s2">keyguard<&sol;span>&rpar;&comma; or both&period;<&sol;li>&NewLine;<&sol;ul>&NewLine;<p style&equals;"padding-left&colon; 40px&semi;"><strong><span style&equals;"color&colon; &num;000080&semi;">Note&colon;<&sol;span><&sol;strong> Only Android versions lower than 5&period;0 support lock-screen widgets&period; For Android 5&period;0 and higher&comma; only <span class&equals;"s2">home&lowbar;screen<&sol;span> is valid&period;<&sol;p>&NewLine;<ul class&equals;"ul1">&NewLine;<li class&equals;"li1">Select <span style&equals;"color&colon; &num;0000ff&semi;"><strong>Resizable<&sol;strong><&sol;span> option which specifies the rules by which a widget can be resized&period; You can make widgets resizeable—horizontally&comma; vertically&comma; none&comma; or on both axes&period;<&sol;li>&NewLine;<li class&equals;"li1"><span class&equals;"s2">Provide <strong><span style&equals;"color&colon; &num;0000ff&semi;">MinimumHeight<&sol;span><&sol;strong><&sol;span> and <strong><span class&equals;"s2" style&equals;"color&colon; &num;0000ff&semi;">MinimumWidth <&sol;span><&sol;strong>which specifies the minimum height and width&lpar;in cells&rpar; to which the widget can be resized&period;<&sol;li>&NewLine;<li>You can implement an App Widget configuration Activity by checking the <span style&equals;"color&colon; &num;0000ff&semi;"><strong>configuration screen<&sol;strong><&sol;span> checkbox&period; This is an optional <span style&equals;"color&colon; &num;008000&semi;"><strong>Activity<&sol;strong><&sol;span> that launches when the user adds your App Widget and allows them to modify App Widget settings at create-time&comma; such as the App Widget color&comma; size&comma; update period or other functionality settings&period; Here I will leave it as unchecked&period;<&sol;li>&NewLine;<&sol;ul>&NewLine;<p><strong>4<&sol;strong>&period; Now click <strong><span style&equals;"color&colon; &num;008000&semi;">finish<&sol;span><&sol;strong>&period; You can see some files and folder gets added in your application&period;<&sol;p>&NewLine;<h3><span style&equals;"color&colon; &num;000080&semi;"><b>Widget Creation Steps &colon;<&sol;b><&sol;span><&sol;h3>&NewLine;<ul class&equals;"ul1">&NewLine;<li class&equals;"li2">create a layout for the widget&period;<&sol;li>&NewLine;<li class&equals;"li2">create XML for defining the widget properties&period;<&sol;li>&NewLine;<li class&equals;"li2">create a class for the widget actions&period;<&sol;li>&NewLine;<li class&equals;"li2">add all these to the <strong><span style&equals;"color&colon; &num;008000&semi;">AndroidManifest&period;xml<&sol;span><&sol;strong> file&period;<&sol;li>&NewLine;<&sol;ul>&NewLine;<h3 class&equals;"p2"><span style&equals;"color&colon; &num;000080&semi;"><b>Widget-Layout File<&sol;b><&sol;span><&sol;h3>&NewLine;<p>Now you have to define the layout of your widget in your default XML file &lpar;<span style&equals;"color&colon; &num;008000&semi;"><strong>my&lowbar;app&lowbar;widget&period;xml <&sol;strong><&sol;span>&rpar;&period;<&sol;p>&NewLine;<p>By default it creates a very simple layout for a widget as shown below&colon;<&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>my&lowbar;app&lowbar;widget&period;xml<&sol;strong><&sol;span><&sol;p>&NewLine;<pre>&lt&semi;RelativeLayout xmlns&colon;android&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;apk&sol;res&sol;android"&NewLine; android&colon;layout&lowbar;width&equals;"match&lowbar;parent"&NewLine; android&colon;layout&lowbar;height&equals;"match&lowbar;parent"&NewLine; android&colon;background&equals;"&num;09C"&NewLine; android&colon;padding&equals;"&commat;dimen&sol;widget&lowbar;margin"&gt&semi;&NewLine;&NewLine; &lt&semi;TextView&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;appwidget&lowbar;text"&NewLine; android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;centerHorizontal&equals;"true"&NewLine; android&colon;layout&lowbar;centerVertical&equals;"true"&NewLine; android&colon;layout&lowbar;margin&equals;"8dp"&NewLine; android&colon;background&equals;"&num;09C"&NewLine; android&colon;contentDescription&equals;"&commat;string&sol;appwidget&lowbar;text"&NewLine; android&colon;text&equals;"&commat;string&sol;appwidget&lowbar;text"&NewLine; android&colon;textColor&equals;"&num;ffffff"&NewLine; android&colon;textSize&equals;"24sp"&NewLine; android&colon;textStyle&equals;"bold&vert;italic" &sol;&gt&semi;&NewLine;&NewLine;&lt&semi;&sol;RelativeLayout&gt&semi;<&sol;pre>&NewLine;<p class&equals;"p2">This layout is displayed as a widget on the user’s home screen&period;<&sol;p>&NewLine;<h3 class&equals;"p2"><span style&equals;"color&colon; &num;000080&semi;"><b>Widget-XML File<&sol;b><&sol;span><&sol;h3>&NewLine;<p>In <strong><span style&equals;"color&colon; &num;008000&semi;">res<&sol;span><&sol;strong> folder it creates a new <span style&equals;"color&colon; &num;0000ff&semi;"><strong>xml<&sol;strong><&sol;span> folder which contains an xml file that defines the widget properties&period;<&sol;p>&NewLine;<p><img class&equals;"alignnone wp-image-1429" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2019&sol;12&sol;Screenshot-2019-12-12-19&period;23&period;23-2762959793-1576170924747&period;png" alt&equals;"Screenshot-2019-12-12-19&period;23&period;23&period;png" width&equals;"362" height&equals;"435" &sol;><&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;008000&semi;"><strong>my&lowbar;app&lowbar;widget&lowbar;info&period;xml<&sol;strong><&sol;span> is an xml file that contains various properties for your widget such as refresh time&comma; preview image&comma; minimum height&sol;width&comma; etc&period;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">my&lowbar;app&lowbar;widget&lowbar;info&period;xml<&sol;span><&sol;strong><&sol;p>&NewLine;<pre>&lt&semi;&quest;xml version&equals;"1&period;0" encoding&equals;"utf-8"&quest;&gt&semi;&NewLine;&lt&semi;appwidget-provider xmlns&colon;android&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;apk&sol;res&sol;android"&NewLine; android&colon;initialKeyguardLayout&equals;"&commat;layout&sol;my&lowbar;app&lowbar;widget"&NewLine; android&colon;initialLayout&equals;"&commat;layout&sol;my&lowbar;app&lowbar;widget"&NewLine; android&colon;minWidth&equals;"110dp"&NewLine; android&colon;minHeight&equals;"110dp"&NewLine; android&colon;previewImage&equals;"&commat;drawable&sol;example&lowbar;appwidget&lowbar;preview"&NewLine; android&colon;resizeMode&equals;"horizontal&vert;vertical"&NewLine; android&colon;updatePeriodMillis&equals;"86400000"&NewLine; android&colon;widgetCategory&equals;"home&lowbar;screen"&gt&semi;&NewLine; &NewLine;&lt&semi;&sol;appwidget-provider&gt&semi;<&sol;pre>&NewLine;<p class&equals;"p1">A quick look for these properties&colon;<&sol;p>&NewLine;<ul class&equals;"ul1">&NewLine;<li class&equals;"li1"><span style&equals;"color&colon; &num;0000ff&semi;"><strong> initialLayout<&sol;strong><&sol;span>&colon; points to the layout resource that defines the App Widget layout&period;<&sol;li>&NewLine;<li class&equals;"li1"><strong><span style&equals;"color&colon; &num;0000ff&semi;"> minHeight and minWidth<&sol;span><&sol;strong>&colon; The values for the <span style&equals;"color&colon; &num;008000&semi;"><strong><span class&equals;"s1">minWidth<&sol;span><&sol;strong><&sol;span> and <span style&equals;"color&colon; &num;008000&semi;"><strong><span class&equals;"s1">minHeight<&sol;span><&sol;strong><&sol;span> attributes specify the minimum amount of space the App Widget consumes&lpar;in dp&rpar; by default&period; Every 60dp means 1 cell in android home-screen&period; The widget takes min 1&&num;215&semi;1 cell&lpar;s&rpar;&period;<&sol;li>&NewLine;<li class&equals;"li1"><span style&equals;"color&colon; &num;0000ff&semi;"><strong> previewImage<&sol;strong><&sol;span><i>&colon; <&sol;i> specifies a preview of what the app widget will look like after it&&num;8217&semi;s configured&comma; which the user sees when selecting the app widget&period;<&sol;li>&NewLine;<li class&equals;"li1"><span style&equals;"color&colon; &num;0000ff&semi;"><strong> resizeMode<&sol;strong><&sol;span><i>&colon;<&sol;i> specifies the rules by which a widget can be resized&period; You use this attribute to make homescreen widgets resizeable—horizontally&comma; vertically&comma; or on both axes&period;<&sol;li>&NewLine;<li class&equals;"li1"><strong><span style&equals;"color&colon; &num;0000ff&semi;"> updatePeriodMillis<&sol;span><&sol;strong><i>&colon;<&sol;i> The widget’s update method is called when the specified time is reached in a millisecond&period;<&sol;li>&NewLine;<li class&equals;"li1"><strong><span style&equals;"color&colon; &num;0000ff&semi;"> widgetCategory<&sol;span><&sol;strong><i>&colon;<&sol;i> declares whether your App Widget can be displayed on the home screen &lpar;<span class&equals;"s1">home&lowbar;screen<&sol;span>&rpar;&comma; the lock screen &lpar;<span class&equals;"s1">keyguard<&sol;span>&rpar;&comma; or both&period;<&sol;li>&NewLine;<&sol;ul>&NewLine;<h3 class&equals;"p2"><span style&equals;"color&colon; &num;000080&semi;"><b>Widget-Java File<&sol;b><&sol;span><&sol;h3>&NewLine;<p>It creates a java file which defines the basic methods that allow you to programmatically interface with the App Widget&comma; based on broadcast events&period;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">MyAppWidget&period;Java<&sol;span><&sol;strong><&sol;p>&NewLine;<pre>package com&period;example&period;androidwidgetexample&semi;&NewLine;&NewLine;import android&period;appwidget&period;AppWidgetManager&semi;&NewLine;import android&period;appwidget&period;AppWidgetProvider&semi;&NewLine;import android&period;content&period;Context&semi;&NewLine;import android&period;widget&period;RemoteViews&semi;&NewLine;&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&ast;&ast;<&sol;span><&sol;strong>&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;"> &ast; Implementation of App Widget functionality&period;<&sol;span><&sol;strong>&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;"> &ast;&sol;<&sol;span><&sol;strong>&NewLine;public class MyAppWidget extends AppWidgetProvider &lbrace;&NewLine;&NewLine; static void updateAppWidget&lpar;Context context&comma; AppWidgetManager appWidgetManager&comma;&NewLine; int appWidgetId&rpar; &lbrace;&NewLine;&NewLine; CharSequence widgetText &equals; context&period;getString&lpar;R&period;string&period;appwidget&lowbar;text&rpar;&semi;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; Construct the RemoteViews object<&sol;span><&sol;strong>&NewLine; RemoteViews views &equals; new RemoteViews&lpar;context&period;getPackageName&lpar;&rpar;&comma; R&period;layout&period;my&lowbar;app&lowbar;widget&rpar;&semi;&NewLine; views&period;setTextViewText&lpar;R&period;id&period;appwidget&lowbar;text&comma; widgetText&rpar;&semi;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; Instruct the widget manager to update the widget<&sol;span><&sol;strong>&NewLine; appWidgetManager&period;updateAppWidget&lpar;appWidgetId&comma; views&rpar;&semi;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onUpdate&lpar;Context context&comma; AppWidgetManager appWidgetManager&comma; int&lbrack;&rsqb; appWidgetIds&rpar; &lbrace;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; There may be multiple widgets active&comma; so update all of them<&sol;span><&sol;strong>&NewLine; for &lpar;int appWidgetId &colon; appWidgetIds&rpar; &lbrace;&NewLine; updateAppWidget&lpar;context&comma; appWidgetManager&comma; appWidgetId&rpar;&semi;&NewLine; &rcub;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onEnabled&lpar;Context context&rpar; &lbrace;&NewLine;<span style&equals;"color&colon; &num;008000&semi;"><strong> &sol;&sol; Enter relevant functionality for when the first widget is created<&sol;strong><&sol;span>&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onDisabled&lpar;Context context&rpar; &lbrace;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; Enter relevant functionality for when the last widget is disabled<&sol;span><&sol;strong>&NewLine; &rcub;&NewLine;&rcub;&NewLine;&NewLine;<&sol;pre>&NewLine;<p>The <span style&equals;"color&colon; &num;008000&semi;"><strong>AppWidgetProvider<&sol;strong><&sol;span> class extends BroadcastReceiver as a convenience class to handle the App Widget broadcasts&period; The AppWidgetProvider receives only the event broadcasts that are relevant to the App Widget&comma; such as when the App Widget is updated&comma; deleted&comma; enabled&comma; and disabled&period;<&sol;p>&NewLine;<p class&equals;"p1"><span style&equals;"color&colon; &num;000000&semi;">AppWidgetProvider<&sol;span> extends <span style&equals;"color&colon; &num;0000ff&semi;"><strong>BroadcastReceiver<&sol;strong><&sol;span>&period; <strong><span style&equals;"color&colon; &num;008000&semi;">MyAppWidget<&sol;span><&sol;strong> is indirectly a child of BroadcastReceiver&period; So our widget class is a receiver class&period;<&sol;p>&NewLine;<h3 class&equals;"p2"><span style&equals;"color&colon; &num;000080&semi;"><b>Adding Created files in AndroidManifest&period;xml<&sol;b><&sol;span><&sol;h3>&NewLine;<p>In <span style&equals;"color&colon; &num;008000&semi;"><strong>AndroidManifest<&sol;strong><&sol;span> file you can see the below changes&colon;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">AndroidManifest&period;xml<&sol;span><&sol;strong><&sol;p>&NewLine;<pre>&lt&semi;&quest;xml version&equals;"1&period;0" encoding&equals;"utf-8"&quest;&gt&semi;&NewLine;&lt&semi;manifest xmlns&colon;android&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;apk&sol;res&sol;android"&NewLine; package&equals;"com&period;example&period;androidwidgetexample"&gt&semi;&NewLine;&NewLine; &lt&semi;application&NewLine; android&colon;allowBackup&equals;"true"&NewLine; android&colon;icon&equals;"&commat;mipmap&sol;ic&lowbar;launcher"&NewLine; android&colon;label&equals;"&commat;string&sol;app&lowbar;name"&NewLine; android&colon;roundIcon&equals;"&commat;mipmap&sol;ic&lowbar;launcher&lowbar;round"&NewLine; android&colon;supportsRtl&equals;"true"&NewLine; android&colon;theme&equals;"&commat;style&sol;AppTheme"&gt&semi;&NewLine; &lt&semi;activity android&colon;name&equals;"&period;MainActivity"&gt&semi;&NewLine; &lt&semi;intent-filter&gt&semi;&NewLine; &lt&semi;action android&colon;name&equals;"android&period;intent&period;action&period;MAIN" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;category android&colon;name&equals;"android&period;intent&period;category&period;LAUNCHER" &sol;&gt&semi;&NewLine; &lt&semi;&sol;intent-filter&gt&semi;&NewLine; &lt&semi;&sol;activity&gt&semi;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&lt&semi;receiver android&colon;name&equals;"&period;MyAppWidget"&gt&semi;<&sol;span><&sol;strong>&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;"> &lt&semi;intent-filter&gt&semi;<&sol;span><&sol;strong>&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;"> &lt&semi;action android&colon;name&equals;"android&period;appwidget&period;action&period;APPWIDGET&lowbar;UPDATE" &sol;&gt&semi;<&sol;span><&sol;strong>&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;"> &lt&semi;&sol;intent-filter&gt&semi;<&sol;span><&sol;strong>&NewLine;&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;"> &lt&semi;meta-data<&sol;span><&sol;strong>&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;"> android&colon;name&equals;"android&period;appwidget&period;provider"<&sol;span><&sol;strong>&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;"> android&colon;resource&equals;"&commat;xml&sol;my&lowbar;app&lowbar;widget&lowbar;info" &sol;&gt&semi;<&sol;span><&sol;strong>&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;"> &lt&semi;&sol;receiver&gt&semi;<&sol;span><&sol;strong>&NewLine; &lt&semi;&sol;application&gt&semi;&NewLine;&NewLine;&lt&semi;&sol;manifest&gt&semi;<&sol;pre>&NewLine;<p class&equals;"p1">The <span style&equals;"color&colon; &num;0000ff&semi;"><strong><span class&equals;"s1">&lt&semi;receiver&gt&semi;<&sol;span><&sol;strong><&sol;span> element requires the <strong><span class&equals;"s1" style&equals;"color&colon; &num;008000&semi;">android&colon;name<&sol;span><&sol;strong> attribute&comma; which specifies the <span style&equals;"color&colon; &num;000000&semi;"><span class&equals;"s2">AppWidgetProvider<&sol;span><&sol;span> used by the App Widget&period;<&sol;p>&NewLine;<p class&equals;"p1">The <strong><span style&equals;"color&colon; &num;0000ff&semi;"><span class&equals;"s1">&lt&semi;intent-filter&gt&semi;<&sol;span> <&sol;span><&sol;strong>element must include an <span style&equals;"color&colon; &num;0000ff&semi;"><strong><span class&equals;"s1">&lt&semi;action&gt&semi;<&sol;span><&sol;strong><&sol;span> element with the <strong><span class&equals;"s1" style&equals;"color&colon; &num;008000&semi;">android&colon;name<&sol;span><&sol;strong> attribute specifies that the <span style&equals;"color&colon; &num;000000&semi;"><span class&equals;"s2">AppWidgetProvider<&sol;span><&sol;span> accepts the <strong><span style&equals;"color&colon; &num;008000&semi;"><a style&equals;"color&colon; &num;008000&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;appwidget&sol;AppWidgetManager&period;html&num;ACTION&lowbar;APPWIDGET&lowbar;UPDATE"><span class&equals;"s2">ACTION&lowbar;APPWIDGET&lowbar;UPDATE<&sol;span><&sol;a><&sol;span><&sol;strong> broadcast&period;<&sol;p>&NewLine;<p class&equals;"p1">The <strong><span class&equals;"s1" style&equals;"color&colon; &num;0000ff&semi;">&lt&semi;meta-data&gt&semi;<&sol;span><&sol;strong> element specifies the <strong><span style&equals;"color&colon; &num;008000&semi;"><span class&equals;"s2">AppWidgetProviderInfo<&sol;span><&sol;span><&sol;strong> resource and requires the following attributes&colon;<&sol;p>&NewLine;<ul class&equals;"ul1">&NewLine;<li class&equals;"li1"><span style&equals;"color&colon; &num;0000ff&semi;"><strong><span class&equals;"s1">android&colon;name<&sol;span><&sol;strong><&sol;span> &&num;8211&semi; Specifies the metadata name&period; Use <span style&equals;"color&colon; &num;008000&semi;"><strong><span class&equals;"s1">android&period;appwidget&period;provider<&sol;span><&sol;strong><&sol;span> to identify the data as the <span style&equals;"color&colon; &num;000000&semi;"><span class&equals;"s2">AppWidgetProviderInfo<&sol;span><&sol;span> descriptor&period;<&sol;li>&NewLine;<li class&equals;"li1"><strong><span class&equals;"s1" style&equals;"color&colon; &num;0000ff&semi;">android&colon;resource<&sol;span><&sol;strong> &&num;8211&semi; Specifies the <span style&equals;"color&colon; &num;000000&semi;"><span class&equals;"s2">AppWidgetProviderInfo<&sol;span><&sol;span> resource location&period;<&sol;li>&NewLine;<&sol;ul>&NewLine;<h3 class&equals;"p1"><span style&equals;"color&colon; &num;000080&semi;"><b>RemoteView<&sol;b><&sol;span><&sol;h3>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;"><a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;RemoteViews&period;html">RemoteView<&sol;a><&sol;span><&sol;strong>  is a class that describes a view hierarchy that can be displayed in another process&period; The hierarchy is inflated from a layout resource file&comma; and this class provides some basic operations for modifying the content of the inflated hierarchy&period;<&sol;p>&NewLine;<&excl;-- WP QUADS Content Ad Plugin v&period; 2&period;0&period;98&period;1 -->&NewLine;<div class&equals;"quads-location quads-ad2" id&equals;"quads-ad2" style&equals;"float&colon;none&semi;margin&colon;0px&semi;">&NewLine;&NewLine;<&sol;div>&NewLine;&NewLine;<p class&equals;"p1">RemoteView is limited to support for the following layouts&colon;<&sol;p>&NewLine;<ul class&equals;"ul1">&NewLine;<li class&equals;"li2"><strong><span class&equals;"s2" style&equals;"color&colon; &num;0000ff&semi;"> <a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;FrameLayout&period;html"><span class&equals;"s3">FrameLayout<&sol;span><&sol;a>&comma;<&sol;span><&sol;strong><&sol;li>&NewLine;<li class&equals;"li2"><strong><span class&equals;"s2" style&equals;"color&colon; &num;0000ff&semi;"> <a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;LinearLayout&period;html"><span class&equals;"s3">LinearLayout<&sol;span><&sol;a>&comma;<&sol;span><&sol;strong><&sol;li>&NewLine;<li class&equals;"li2"><strong><span class&equals;"s2" style&equals;"color&colon; &num;0000ff&semi;"> <a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;RelativeLayout&period;html"><span class&equals;"s3">RelativeLayout<&sol;span><&sol;a>&comma;<&sol;span><&sol;strong><&sol;li>&NewLine;<li class&equals;"li2"><strong><span class&equals;"s2" style&equals;"color&colon; &num;0000ff&semi;"> <a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;GridLayout&period;html"><span class&equals;"s3">GridLayout<&sol;span><&sol;a>&period;<&sol;span><&sol;strong><&sol;li>&NewLine;<li class&equals;"li2"><strong><span class&equals;"s2" style&equals;"color&colon; &num;0000ff&semi;"><a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;ViewFlipper&period;html"><span class&equals;"s3">ViewFlipper<&sol;span><&sol;a><&sol;span><&sol;strong><&sol;li>&NewLine;<li class&equals;"li2"><strong><span class&equals;"s2" style&equals;"color&colon; &num;0000ff&semi;"> <a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;ListView&period;html"><span class&equals;"s3">ListView<&sol;span><&sol;a><&sol;span><&sol;strong><&sol;li>&NewLine;<li class&equals;"li2"><strong><span class&equals;"s2" style&equals;"color&colon; &num;0000ff&semi;"> <a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;GridView&period;html"><span class&equals;"s3">GridView<&sol;span><&sol;a><&sol;span><&sol;strong><&sol;li>&NewLine;<li class&equals;"li2"><strong><span class&equals;"s2" style&equals;"color&colon; &num;0000ff&semi;"> <a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;StackView&period;html"><span class&equals;"s3">StackView<&sol;span><&sol;a><&sol;span><&sol;strong><&sol;li>&NewLine;<li class&equals;"li2"><strong><span class&equals;"s2" style&equals;"color&colon; &num;0000ff&semi;"> <a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;AdapterViewFlipper&period;html"><span class&equals;"s3">AdapterViewFlipper<&sol;span><&sol;a><&sol;span><&sol;strong><&sol;li>&NewLine;<&sol;ul>&NewLine;<p class&equals;"p1">RemoteView supports only the following views&colon;&colon;<&sol;p>&NewLine;<ul class&equals;"ul1">&NewLine;<li class&equals;"li2"><span style&equals;"color&colon; &num;0000ff&semi;"><strong><span class&equals;"s2"> <a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;AnalogClock&period;html"><span class&equals;"s3">AnalogClock<&sol;span><&sol;a>&comma;<&sol;span><&sol;strong><&sol;span><&sol;li>&NewLine;<li class&equals;"li1"><span style&equals;"color&colon; &num;0000ff&semi;"><strong><a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;Button&period;html"><span class&equals;"s3">Button<&sol;span><&sol;a>&comma;<&sol;strong><&sol;span><&sol;li>&NewLine;<li class&equals;"li2"><span style&equals;"color&colon; &num;0000ff&semi;"><strong><span class&equals;"s2"> <a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;Chronometer&period;html"><span class&equals;"s3">Chronometer<&sol;span><&sol;a>&comma;<&sol;span><&sol;strong><&sol;span><&sol;li>&NewLine;<li class&equals;"li2"><span style&equals;"color&colon; &num;0000ff&semi;"><strong><span class&equals;"s2"> <a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;ImageButton&period;html"><span class&equals;"s3">ImageButton<&sol;span><&sol;a>&comma;<&sol;span><&sol;strong><&sol;span><&sol;li>&NewLine;<li class&equals;"li2"><span style&equals;"color&colon; &num;0000ff&semi;"><strong><span class&equals;"s2"> <a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;ImageView&period;html"><span class&equals;"s3">ImageView<&sol;span><&sol;a>&comma;<&sol;span><&sol;strong><&sol;span><&sol;li>&NewLine;<li class&equals;"li2"><span style&equals;"color&colon; &num;0000ff&semi;"><strong><span class&equals;"s2"> <a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;ProgressBar&period;html"><span class&equals;"s3">ProgressBar<&sol;span><&sol;a>&comma;<&sol;span><&sol;strong><&sol;span><&sol;li>&NewLine;<li class&equals;"li2"><span style&equals;"color&colon; &num;0000ff&semi;"><strong><span class&equals;"s2"> <a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;widget&sol;TextView&period;html"><span class&equals;"s3">TextView<&sol;span><&sol;a><&sol;span><&sol;strong><&sol;span><&sol;li>&NewLine;<&sol;ul>&NewLine;<p class&equals;"p1"><strong><span style&equals;"color&colon; &num;000080&semi;">Note&colon;<&sol;span><&sol;strong> If you use another view&comma; RemoteView has no operation for the view&period;<&sol;p>&NewLine;<h3 class&equals;"p1"><span style&equals;"color&colon; &num;000080&semi;"><b>Receiving App Widget broadcast Intents<&sol;b><&sol;span><&sol;h3>&NewLine;<p class&equals;"p2"><strong><span class&equals;"s1" style&equals;"color&colon; &num;008000&semi;">AppWidgetProvider<&sol;span><&sol;strong> is just a convenience class&period; If you would like to receive the App Widget broadcasts directly&comma; you can implement your own <span style&equals;"color&colon; &num;008000&semi;"><strong><span class&equals;"s1">BroadcastReceiver<&sol;span><&sol;strong><&sol;span> or override the <strong><span class&equals;"s1" style&equals;"color&colon; &num;008000&semi;">onReceive&lpar;Context&comma; Intent&rpar;<&sol;span><&sol;strong> callback&period; The Intents you need to care about are as follows&colon;<&sol;p>&NewLine;<ul class&equals;"ul1">&NewLine;<li class&equals;"li3"><strong><span class&equals;"s2" style&equals;"color&colon; &num;0000ff&semi;"><a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;appwidget&sol;AppWidgetManager&period;html&num;ACTION&lowbar;APPWIDGET&lowbar;UPDATE"><span class&equals;"s3">ACTION&lowbar;APPWIDGET&lowbar;UPDATE<&sol;span><&sol;a><&sol;span><&sol;strong><&sol;li>&NewLine;<li class&equals;"li3"><strong><span class&equals;"s2" style&equals;"color&colon; &num;0000ff&semi;"><a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;appwidget&sol;AppWidgetManager&period;html&num;ACTION&lowbar;APPWIDGET&lowbar;DELETED"><span class&equals;"s3">ACTION&lowbar;APPWIDGET&lowbar;DELETED<&sol;span><&sol;a><&sol;span><&sol;strong><&sol;li>&NewLine;<li class&equals;"li3"><strong><span class&equals;"s2" style&equals;"color&colon; &num;0000ff&semi;"><a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;appwidget&sol;AppWidgetManager&period;html&num;ACTION&lowbar;APPWIDGET&lowbar;ENABLED"><span class&equals;"s3">ACTION&lowbar;APPWIDGET&lowbar;ENABLED<&sol;span><&sol;a><&sol;span><&sol;strong><&sol;li>&NewLine;<li class&equals;"li3"><strong><span class&equals;"s2" style&equals;"color&colon; &num;0000ff&semi;"><a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;appwidget&sol;AppWidgetManager&period;html&num;ACTION&lowbar;APPWIDGET&lowbar;DISABLED"><span class&equals;"s3">ACTION&lowbar;APPWIDGET&lowbar;DISABLED<&sol;span><&sol;a><&sol;span><&sol;strong><&sol;li>&NewLine;<li class&equals;"li3"><strong><span class&equals;"s2" style&equals;"color&colon; &num;0000ff&semi;"><a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;appwidget&sol;AppWidgetManager&period;html&num;ACTION&lowbar;APPWIDGET&lowbar;OPTIONS&lowbar;CHANGED"><span class&equals;"s3">ACTION&lowbar;APPWIDGET&lowbar;OPTIONS&lowbar;CHANGED<&sol;span><&sol;a><&sol;span><&sol;strong><&sol;li>&NewLine;<&sol;ul>&NewLine;<h3 class&equals;"p1"><span style&equals;"color&colon; &num;000080&semi;"><b>Understanding Override Methods<&sol;b><&sol;span><&sol;h3>&NewLine;<p class&equals;"p2">The AppWidgetProvider receives only the event broadcasts that are relevant to the App Widget&comma; such as when the App Widget is updated&comma; deleted&comma; enabled&comma; and disabled&period; When these broadcast events occur&comma; the AppWidgetProvider receives the following method calls&colon;<&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong><span class&equals;"s2">onUpdate&lpar;&rpar;<&sol;span>&colon;<&sol;strong><&sol;span><&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;008000&semi;">onUpdate&lpar;&rpar;<&sol;span><&sol;strong> is called to update the App Widget at intervals defined by the updatePeriodMillis attribute in the <strong><span style&equals;"color&colon; &num;008000&semi;">AppWidgetProviderInfo<&sol;span><&sol;strong>&period;<&sol;p>&NewLine;<p class&equals;"p1">This method is also called when each App Widget is added to a host &lpar;unless you use a configuration Activity&rpar;&comma; so it should perform the essential setup&comma; such as define event handlers for Views &lpar;For example&comma; if you want an App Widget with a button that launches an Activity when clicked&rpar; and start a temporary <span class&equals;"s1">Service<&sol;span>&comma; if necessary&period;<&sol;p>&NewLine;<p class&equals;"p1">If you have declared a configuration Activity&comma; <span style&equals;"color&colon; &num;008000&semi;"><b>this method is not called<&sol;b><&sol;span> when the user adds the App Widget&comma; but is called for the subsequent updates&period; It is the responsibility of the configuration Activity to perform the first update when the configuration is done&period;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;"><span class&equals;"s2">onAppWidgetOptionsChanged&lpar;&rpar;<&sol;span> &colon;<&sol;span><&sol;strong><&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;008000&semi;"><strong><span class&equals;"s2">onAppWidgetOptionsChanged&lpar;&rpar;<&sol;span><&sol;strong><&sol;span> is called when the widget is first placed and also whenever the widget is resized&period; You can use this callback to show or hide content based on the widget&&num;8217&semi;s size ranges&period;<&sol;p>&NewLine;<p><img class&equals;" size-full wp-image-1434 aligncenter" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2019&sol;12&sol;widgets&lowbar;resizing1&period;png" alt&equals;"widgets&lowbar;resizing1" width&equals;"1017" height&equals;"101" &sol;><&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;"><span class&equals;"s2">onDeleted&lpar;Context&comma; int&lbrack;&rsqb;&rpar;<&sol;span>&colon;<&sol;span><&sol;strong><&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;008000&semi;"><strong><span class&equals;"s2">onDeleted&lpar;&rpar;<&sol;span><&sol;strong><&sol;span> is called every time an App Widget is deleted from the App Widget host&period;<&sol;p>&NewLine;<p><span class&equals;"s2"><span style&equals;"color&colon; &num;0000ff&semi;"><strong>onEnabled&lpar;Context&rpar;<&sol;strong><&sol;span><&sol;span><span style&equals;"color&colon; &num;0000ff&semi;"><strong>&colon;<&sol;strong><&sol;span><&sol;p>&NewLine;<p><span class&equals;"s2" style&equals;"color&colon; &num;008000&semi;"><strong>onEnabled&lpar;&rpar;<&sol;strong><&sol;span> is called when an instance the App Widget is created for the first time&period;<&sol;p>&NewLine;<p class&equals;"p1">For example&comma; if the user adds two instances of your App Widget&comma; this is only called the first time&period; If you need to open a new database or perform other setup that only needs to occur once for all App Widget instances&comma; then this is a good place to do it&period;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;"><span class&equals;"s2">onDisabled&lpar;Context&rpar;<&sol;span>&colon;<&sol;span> <&sol;strong><&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;008000&semi;"><strong><span class&equals;"s2">onDisabled&lpar;&rpar;<&sol;span><&sol;strong><&sol;span> is called when the last instance of your App Widget is deleted from the App Widget host&period;<&sol;p>&NewLine;<p class&equals;"p1">This is where you should clean up any work done in <strong><span class&equals;"s1" style&equals;"color&colon; &num;008000&semi;">onEnabled&lpar;&rpar;<&sol;span><&sol;strong>&comma; such as delete a temporary database&period;<&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong><span class&equals;"s2">onReceive&lpar;Context&comma; Intent&rpar;<&sol;span>&colon;<&sol;strong><&sol;span><&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;008000&semi;"><strong><span class&equals;"s2">onReceive&lpar;&rpar;<&sol;span><&sol;strong><&sol;span> is called for every broadcast and before each of the above callback methods&period;<&sol;p>&NewLine;<p class&equals;"p1">You normally don&&num;8217&semi;t need to implement this method because the default <span style&equals;"color&colon; &num;008000&semi;"><strong>AppWidgetProvider<&sol;strong><&sol;span> implementation filters all App Widget broadcasts and calls the above methods as appropriate&period;<&sol;p>&NewLine;<p class&equals;"p2">Confused&quest; No problem&period; The below GIF shows you when these methods will call&period;<&sol;p>&NewLine;<p><img class&equals;" size-full wp-image-1430 aligncenter" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2019&sol;12&sol;appwidget&lowbar;lifecycle&lowbar;methods&period;gif" alt&equals;"appwidget&lowbar;lifecycle&lowbar;methods" width&equals;"542" height&equals;"494" &sol;><&sol;p>&NewLine;<p>Whenever we add&sol;remove the app widget&comma; the two methods <strong><span style&equals;"color&colon; &num;008000&semi;">onUpdate&lpar;&rpar;<&sol;span><&sol;strong> and <span style&equals;"color&colon; &num;008000&semi;"><strong>onDeleted&lpar;&rpar;<&sol;strong> <&sol;span>will call for each app widget instance&period; But<span style&equals;"color&colon; &num;008000&semi;"><strong> onEnabled&lpar;&rpar;<&sol;strong><&sol;span> will call only when an instance the App Widget is created for the first time and <span style&equals;"color&colon; &num;008000&semi;"><strong>onDisabled&lpar;&rpar;<&sol;strong><&sol;span> will only be called when the last instance of your App Widget is deleted&period;<&sol;p>&NewLine;<p><img class&equals;" size-full wp-image-1431 aligncenter" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2019&sol;12&sol;appwidget&lowbar;lifecycle&lowbar;demo&period;gif" alt&equals;"appwidget&lowbar;lifecycle&lowbar;demo" width&equals;"522" height&equals;"514" &sol;><&sol;p>&NewLine;<p>In the above GIF you can see <strong><span style&equals;"color&colon; &num;008000&semi;">onEnabled&lpar;&rpar;<&sol;span><&sol;strong> is called only for the first app widget instance&lpar;Creation&rpar; and <span style&equals;"color&colon; &num;008000&semi;"><strong>onDisabled&lpar;&rpar;<&sol;strong><&sol;span> is called only for the last instance of the App Widget&lpar;deletion&rpar;&period;<&sol;p>&NewLine;<h3 class&equals;"p1"><span style&equals;"color&colon; &num;000080&semi;"><b>Widget updates<&sol;b><&sol;span><&sol;h3>&NewLine;<p class&equals;"p2">A widget gets its data on periodic updates&period; There are two methods to update a widget&comma; one is based on an <span style&equals;"color&colon; &num;008000&semi;"><strong>XML configuration file<&sol;strong><&sol;span>  and the other is based on the Android <span style&equals;"color&colon; &num;008000&semi;"><strong>AlarmManager<&sol;strong><&sol;span> service&period;<&sol;p>&NewLine;<p class&equals;"p2">In the widget configuration file&comma; you can specify a fixed update interval&period; If the device is asleep when it is time for an update &lpar;as defined by updatePeriodMillis&rpar;&comma; then the device will wake up in order to perform the update and call your broadcast receiver to update the widget&period; The minimum update interval is 1800000 milliseconds &lpar;30 minutes&rpar;&period; If you don&&num;8217&semi;t update more than once per hour&comma; this probably won&&num;8217&semi;t cause significant problems for the battery life&period;<&sol;p>&NewLine;<p>If&comma; however&comma; you need to update more frequently and&sol;or you do not need to update while the device is asleep&comma; then you can instead perform updates based on an alarm that will not wake the device&period; To do so&comma; set an alarm with an Intent that your <strong><span style&equals;"color&colon; &num;008000&semi;">AppWidgetProvider<&sol;span><&sol;strong> receives&comma; using the <strong><span style&equals;"color&colon; &num;0000ff&semi;"><a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;app&sol;AlarmManager&period;html"><span class&equals;"s1">AlarmManager<&sol;span><&sol;a><&sol;span>&period;<&sol;strong><&sol;p>&NewLine;<p>Set the alarm type to either <strong><span style&equals;"color&colon; &num;008000&semi;"><a style&equals;"color&colon; &num;008000&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;app&sol;AlarmManager&period;html&num;ELAPSED&lowbar;REALTIME"><span class&equals;"s1">ELAPSED&lowbar;REALTIME<&sol;span><&sol;a><&sol;span><&sol;strong> or <strong><span style&equals;"color&colon; &num;008000&semi;"><a style&equals;"color&colon; &num;008000&semi;" href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;reference&sol;android&sol;app&sol;AlarmManager&period;html&num;RTC"><span class&equals;"s1">RTC<&sol;span><&sol;a>&comma;<&sol;span><&sol;strong> which will only deliver the alarm when the device is awake&period; Then set updatePeriodMillis to zero &lpar;&&num;8220&semi;0&&num;8221&semi;&rpar;&period;<&sol;p>&NewLine;<h3><strong><span style&equals;"color&colon; &num;000080&semi;">Adding Code in Widget&&num;8217&semi;s Java Class<&sol;span><&sol;strong><&sol;h3>&NewLine;<p>Let&&num;8217&semi;s create a simple example&comma; demonstrating the use of application Widget&period; It creates a basic widget application that will be opening a website on widget clicks&period;<&sol;p>&NewLine;<p>Let’s add some code to our widget class&period;<&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>MyAppWidget&period;java<&sol;strong><&sol;span><&sol;p>&NewLine;<pre>public class MyAppWidget extends AppWidgetProvider &lbrace;&NewLine;&NewLine; static void updateAppWidget&lpar;Context context&comma; AppWidgetManager appWidgetManager&comma;&NewLine; int appWidgetId&rpar; &lbrace;&NewLine;&NewLine; <span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol; Construct an Intent object includes web adresss&period;<&sol;strong><&sol;span>&NewLine; Intent intent &equals; new Intent&lpar;Intent&period;ACTION&lowbar;VIEW&comma; Uri&period;parse&lpar;"https&colon;&sol;&sol;c1ctech&period;com"&rpar;&rpar;&semi;&NewLine;&NewLine; <span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol; In widget we are not allowing to use intents as usually&period; <&sol;strong><&sol;span>&NewLine;<span style&equals;"color&colon; &num;008000&semi;"><strong> &sol;&sol;We have to use PendingIntent instead of 'startActivity'<&sol;strong><&sol;span>&NewLine; PendingIntent pendingIntent &equals; PendingIntent&period;getActivity&lpar;context&comma; 0&comma; intent&comma; 0&rpar;&semi;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; Construct the RemoteViews object<&sol;span><&sol;strong>&NewLine; RemoteViews views &equals; new RemoteViews&lpar;context&period;getPackageName&lpar;&rpar;&comma; R&period;layout&period;my&lowbar;app&lowbar;widget&rpar;&semi;&NewLine; views&period;setOnClickPendingIntent&lpar;R&period;id&period;appwidget&lowbar;text&comma; pendingIntent&rpar;&semi;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">&sol;&sol; Instruct the widget manager to update the widget<&sol;span><&sol;strong>&NewLine; appWidgetManager&period;updateAppWidget&lpar;appWidgetId&comma; views&rpar;&semi;&NewLine;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onUpdate&lpar;Context context&comma; AppWidgetManager appWidgetManager&comma; int&lbrack;&rsqb; appWidgetIds&rpar; &lbrace;&NewLine;&NewLine; <span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol; There may be multiple widgets active&comma; so update all of them<&sol;strong><&sol;span>&NewLine; for &lpar;int appWidgetId &colon; appWidgetIds&rpar; &lbrace;&NewLine; updateAppWidget&lpar;context&comma; appWidgetManager&comma; appWidgetId&rpar;&semi;&NewLine; &rcub;&NewLine; &rcub;&NewLine;&NewLine;&NewLine;&rcub;<&sol;pre>&NewLine;<p>As we can see there is an override method <strong><span style&equals;"color&colon; &num;0000ff&semi;">onUpdate<&sol;span><&sol;strong> which is called when the specified time defined in <strong><span style&equals;"color&colon; &num;008000&semi;">updatePeriodMillis<&sol;span><&sol;strong> attribute has reached<em class&equals;"iq">&period;<&sol;em><&sol;p>&NewLine;<p>After updating your AppWidgetProvider class with the above code run your app&period;<&sol;p>&NewLine;<p><img class&equals;"alignnone wp-image-1517" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2020&sol;02&sol;Screenshot&lowbar;1580809560&period;png" alt&equals;"Screenshot&lowbar;1580809560" width&equals;"313" height&equals;"556" &sol;>      <img class&equals;"alignnone wp-image-1518" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2020&sol;02&sol;Screenshot&lowbar;1580809494&period;png" alt&equals;"Screenshot&lowbar;1580809494" width&equals;"314" height&equals;"558" &sol;><&sol;p>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<p>I hope this article will help you in understanding what is App Widget&comma; its lifecycle and also how to add widgets into our application without doing more efforts&period;&NewLine;

Exit mobile version