編輯:關於Android編程
Android平台上在桌面上所放置的一種小控件
AppWidgetProviderInfo對象:
定義App Widget的一些信息,為App Widget提供元數據,包括App Widget布局文件的指定,更新頻率等數據。
這個對象被定義在XML文件當中,其相對於一個Config配置“文件”.
AppWidgetProvider:
繼承自BroadcastReicever廣播接收器。
定義了App Widget的基本生命周期的回調函數.
二、創建一個App Widget的步驟
一、定義AppWidgetProviderInfo:
在res/xml文件夾當中定義描述AppWidgetProviderInfo的xml文件。
例:…\res\xml\appwidget_info.xml
其中updatePeriodMillis為更新的毫秒數;initialLayout為初始化的布局;previewImage為該app widget的預覽圖,在桌面小部件選擇時顯示。
二、為App Widget指定布局:
定義App Widget展示時的布局文件appwidget_layout
例:…\res\layout\appwidget_layout.xml
三、實現AppWidgetProvider
onUpdate:在到達指定的更新時間之後或者當用戶向桌面添加App Widget時會調用該方法
onDeleted:在App Widget被刪除時,會調用該方法
onEnable:當一個App Widget的實例第一次被創建時,會調用該方法
onDisable:當最後一個App Widget實例被刪除後,會調用該方法
onReceive:監聽/接收廣播事件,可用於處理控件的點擊事件等
(桌面上可以有多個同樣的app widget)
例:
public class MyAppWidgetProvider extends AppWidgetProvider {
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
}
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
}
}
因AppWidgetProvider又繼承自BroadcastReceiver,所以需要在AndroidManifest中注冊:
其中action是引用android自己定義的action,meta-data為元數據,resource為提高App Widget 的配置信息的xml文件。
三、使用App Widget布局中的控件
>使用App Widget布局中的控件其中涉及到了PendingIntent,RemoteViews..
一、PendingIntent
Pending:待處理的。PendingIntent 可以看作為一種“留待日後處理”的意圖,是對Intent的一種包裝,創建之後並不馬上使用,一旦某種觸發事件的發生,意圖才馬上執行。
App Widget和應用程序並不是在同一進程當中。
創建PendingIntent對象的三個靜態方法:
getActivity(Context context, int requestCode, Intent intent, int flags) getBroadcast(Context context, int requestCode, Intent intent, int flags) getService(Context context, int requestCode, Intent intent, int flags)
根據PeningIntent具體發送/啟動(廣播/Activity/服務)來選擇對應的一個靜態方法來創建PendingIntent對象。
二、RemoteViews的作用
RemoteViews:遠程控件。App Widget裡的控件和主程序不在同一進程中,所以App Widget裡的控件相對於一種遠程控件。
RemoteViews對象表示了一系列的View對象。 RemoteViews所表示的對象運行在另外的進程中。 App Widget當中的View運行在Home Screen進程當中。
三、操作AppWidget的Button
由於AppWidget的Button不與主程序在同一進程中,所以無法按照之前慣用的方法給Button綁定監聽器。
為AppWidget的Button綁定監聽器:
新方法:remoteViews.setOnClickPendingIntent(R.id.widget_button, pendingIntent);
第一個參數為AppWidget的Button的id,第二參數為PendingIntent對象。
當Button被點擊時,會引起pendingIntent的執行。
例:重新實現AppWidgetProvider:點擊Button時啟動Activity
public class MyAppWidgetProvider extends AppWidgetProvider {
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
Log.i("z","onReceive");
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
// appWidgetMahager:管理app widget
// appWidgetIds : appWidget的id數組(桌面可放置多個同樣的小部件)
for (int i= 0;i< appWidgetIds.length;i++){
//給每一個小部件的按鈕綁定監聽器
Log.i("z",appWidgetIds[i]+" ");
//創建一個Intent對象
Intent intent = new Intent(context,MainActivity.class);
//包裝成一個PendingIntent對象
PendingIntent pendingIntent = PendingIntent.getActivity(context,0,intent,0);
//得到RemoteViews對象
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout);
//給app widget中的Button綁定監聽器
remoteViews.setOnClickPendingIntent(R.id.widget_button,pendingIntent);
//更新app widget
appWidgetManager.updateAppWidget(appWidgetIds[i],remoteViews);
}
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
Log.i("z","onDeleted");
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
Log.i("z","onEnabled");
}
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
Log.i("z","onDisabled");
}
}
四、接收來自AppWidget的廣播和更新控件的狀態
在AndroidManifest當中為AppWidgetProvider注冊新的intent-filter,配置所要接收的廣播行為。AppWidgetProvider本質上是一個廣播接收器。
使用getBroadcast(…)方法創建一個發送廣播PendingIntent。
為AppWidget當中的控件注冊處理器,用來觸發發送廣播的行為。
在onReceive方法當中接收來自AppWidget發送的廣播消息,並執行自己的業務邏輯,使用RemoteViews對象更新App Widget當中的控件狀態。
AppWidgetProvider的運行機制:通過onReceive來接收廣播,接收到特定的系統內置廣播時來調用onUpdate(..)等生命周期的回調方法,由onReceive來調用生命周期函數。
例:重新在AndroidMainfest注冊AppWidgerProvider:
“android.appwidget.action.APPWIDGET_UPDATE”:系統自帶廣播,用來接收後回調聲明周期函數。
“my.appwidget.Text_UPDATE”:自定義廣播,用來接收後進行對TextView的操作。
重新實現AppWidgetProvider:
public class MyAppWidgetProvider extends AppWidgetProvider {
private static final String TEXT_UPDATE = "my.appwidget.Text_UPDATE";
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if(intent!=null&& TextUtils.equals(TEXT_UPDATE,intent.getAction())){
Log.i("z","onReceiveTextUpdate");
//獲取app widget的所有控件
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout);
//設置TextView的文本
remoteViews.setTextViewText(R.id.widget_text,"Changed Text");
//獲取app widget的管理器
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
//獲取app widget的對象
ComponentName componentName = new ComponentName(context,MyAppWidgetProvider.class);
//管理器更新app widget
appWidgetManager.updateAppWidget(componentName,remoteViews);
}
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
// appWidgetMahager:管理app widget
// appWidgetIds : appWidget的id數組(桌面小部件可重復放置多個小部件)
for (int i= 0;i< appWidgetIds.length;i++){
Log.i("z",appWidgetIds[i]+" ");
//創建一個發送廣播的Intent對象,並設置action
Intent intent = new Intent();
intent.setAction(TEXT_UPDATE);
//包裝成一個PendingIntent對象,執行時會發送一個廣播。
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0,intent,0);
//得到RemoteViews對象
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout);
//給app widget中的Button綁定監聽器
remoteViews.setOnClickPendingIntent(R.id.widget_button,pendingIntent);
//更新app widget
appWidgetManager.updateAppWidget(appWidgetIds[i],remoteViews);
}
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
Log.i("z","onDeleted");
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
Log.i("z","onEnabled");
}
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
Log.i("z","onDisabled");
}
}
大家好 我是akira上一節 我們講到使用AsyncTask 這個類進行異步的下載 主要是涉及到一些圖片的更新 這次我們繼續上一個demo的改進 。 不知道你是否發現一個
首先我們知道,在Android中,Adapter本身是一個接口,他 派生了很多子接口,這些子接口又被很多具體的類實現,來實現具體的顯示效果。本次我們主要介紹的是Simpl
今天來寫一個關於圖片請求的小例子,我們用NetworkImageView這個類來實現,這個類可以直接用在xml控件中,當作imageview,而且內部原理也是使用的Ima
從今天起傻蛋打算做一個系列文章,對最新的Android4.0系統中的Launcher,也就是Android4.0原生的桌面程序,進行一個深入淺出的分析,從而引領Andro