溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

AppWidget怎么在Android中使用

發(fā)布時(shí)間:2021-04-12 15:49:57 來源:億速云 閱讀:189 作者:Leah 欄目:開發(fā)技術(shù)

AppWidget怎么在Android中使用?很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

一、在AndroidManifest.xml中聲明一個(gè)AppWidget

首先我們需要在AndroidManifest.xml中聲明AppWidgetProvider。格式如下:

<receiver android:name="MyAppWidgetProvider" >  
    <intent-filter>  
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />  
    </intent-filter>  
    <meta-data android:name="android.appwidget.provider"  
               android:resource="@xml/my_appwidget_info" />  
</receiver>

可以看出AppWidgetProvider實(shí)際上就是一個(gè)BroadcastReceiver,它接收特定的Broadcast。<meta-data>標(biāo)簽描述了AppWidget所使用的元數(shù)據(jù),android:resource則聲明了定義元數(shù)據(jù)的xml文件的位置。

二、添加AppWidgetProviderInfo元數(shù)據(jù)

AppWidgetProviderInfo描述了AppWidget的本質(zhì)特性,例如,AppWidget更新的周期,最小的寬度、長度,所使用的布局文件是什么,以及添加AppWidget需要啟動(dòng)的

configuration Activity等。我們需要在XML中來定義AppWidgetProviderInfo對象,這個(gè)XML文件應(yīng)該保存在res/xml文件夾下。下面是一個(gè)范例:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"  
    android:minWidth="294dp"  
    android:minHeight="72dp"  
    android:updatePeriodMillis="86400000"  
    android:previewImage="@drawable/preview"  
    android:initialLayout="@layout/example_appwidget"  
    android:configure="com.example.android.MyAppWidgetConfigure"   
    android:resizeMode="horizontal|vertical">  
</appwidget-provider>

<appwidget-provider>需要使用這個(gè)標(biāo)簽來定義AppWidgetProviderInfo。下面對范例中使用到的屬性做下說明。

minWidthminHeight定義了AppWidget需要占據(jù)的最小的空間。

updatePeriodMillis定義了大概多久AppWidget需要更新一次,這里定義的只是一個(gè)大概的時(shí)間,系統(tǒng)不能做出精確的保證。

previewImage定義了在用戶選擇AppWidget時(shí)做現(xiàn)實(shí)的圖標(biāo)。

initialLayout定義了AppWidget所使用的布局文件。

configure定義了AppWidget在添加的時(shí)候需要啟動(dòng)的configuration Activity 用于執(zhí)行配置的工作。

resizeMode定義了縮放模式。

三、創(chuàng)建AppWidget所使用的布局文件

在創(chuàng)建AppWidget時(shí)必須創(chuàng)建一個(gè)布局文件,為其提供布局描述。AppWidget創(chuàng)建視圖時(shí),需要根據(jù)RemoteViews來創(chuàng)建。而出于效率等因素的考慮,很多控件在

RemoteViews中是被支持的。以下列出能在RemoteViews中使用的UI控件:

layout : FrameLayout , LinearLayout , RelativeLayout

widget : AnalogClock , Button , Chronometer , ImageButton , ImageView , ProgressBar , TextView , ViewFlipper , ListView , GridView , StackView , AdapterViewFlipper

四、創(chuàng)建一個(gè)AppWidgetProvider的子類

前面提到過AppWidgetProvider就是一個(gè)BroadcastReceiver。對,它其實(shí)確實(shí)是繼承自BroadcastReceiver,只是它為了更加方便的處理AppWidget的廣播進(jìn)行了封裝。

AppWidgetProvider在接收到AppWidget的廣播的時(shí)候,會(huì)根據(jù)類型分別觸發(fā)以下幾個(gè)方法:

onUpdate() : 當(dāng)AppWidget需要更新時(shí),會(huì)觸發(fā)這個(gè)方法,我們需要重寫這個(gè)方法,在里面實(shí)現(xiàn)更新的操作。如果沒有定義configuration Activity,那么在添加一個(gè)AppWidget

時(shí),也會(huì)觸發(fā)此方法。

onDelete(Context , int[] ):當(dāng)AppWidget從AppWidgetHost中刪除時(shí),會(huì)觸發(fā)此方法。

onEnabled(Context ):如果為一個(gè)應(yīng)用添加了多個(gè)AppWidget,只有在第一個(gè)AppWidget被添加時(shí),此方法才會(huì)被調(diào)用。

onDisabled(Context ):當(dāng)一個(gè)應(yīng)用的最后一個(gè)AppWidget從AppWidgetHost中刪除時(shí),會(huì)觸發(fā)此方法。

onReceive(Context , Intent ):這實(shí)際上就是BroadcastReceiver中的方法,當(dāng)任何一個(gè)Broadcast被接收到時(shí),會(huì)調(diào)用此方法,并且會(huì)在以上回調(diào)方法之前被調(diào)用。

五、創(chuàng)建一個(gè)ConfigurationActivity(可選)

如果需要AppWidget添加的時(shí)候做一些配置工作,就可以使用Configuration Activity。要使用ConfigurationActivity首先需要像普通的Activity一樣在AndroidManifest.xml中

進(jìn)行聲明:

<activity android:name=".ExampleAppWidgetConfigure">  
    <intent-filter>  
        <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>  
    </intent-filter>  
</activity>

只是這里需要添加action類型為android.appwidget.action.APPWIDGET_CONFIGURE的intent-filter。然后,需要在AppWidgetProviderInfo中進(jìn)行聲明:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"  
    ...  
    android:configure="com.example.android.ExampleAppWidgetConfigure"   
    ... >  
</appwidget-provider>

最后,當(dāng)然是需要?jiǎng)?chuàng)建Activity了,在Configuration Activity中,需要執(zhí)行一些必要的操作:

1、獲取AppWidget ID

Intent intent = getIntent();  
Bundle extras = intent.getExtras();  
if (extras != null) {  
    mAppWidgetId = extras.getInt(  
            AppWidgetManager.EXTRA_APPWIDGET_ID,   
            AppWidgetManager.INVALID_APPWIDGET_ID);  
}

2、進(jìn)行必要的配置操作,獲取AppWidgetManager實(shí)例、更新RemoteViews

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);  
 
RemoteViews views = new RemoteViews(context.getPackageName(),  
R.layout.example_appwidget);  
appWidgetManager.updateAppWidget(mAppWidgetId, views);

3、設(shè)置Activity result,并且返回一個(gè)Intent。

Intent resultValue = new Intent();  
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);  
setResult(RESULT_OK, resultValue);  
finish();

這樣一個(gè)就創(chuàng)建好了一個(gè)Configuration Activity了。

注意android8.0以后無法收到發(fā)給自己的AppWidgetProvider,需要添加

intent.setComponent(new ComponentName(context,CacheProvider.class));
Intent intent = new Intent();
intent.setAction(ACTION_CACHE_CLEAN);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent.setComponent(new ComponentName(context,CacheProvider.class));
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
                    0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.tv_clean, pendingIntent);

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI