參考網(wǎng)站:
http://www.eoeandroid.com/viewthread.php?tid=19709&highlight=widget Android
開(kāi)發(fā)的
應(yīng)用除了
程序應(yīng)用,還有是
Widget應(yīng)用。好多人會(huì)開(kāi)發(fā)程序應(yīng)用而不會(huì)開(kāi)發(fā)Widget應(yīng)用。
先簡(jiǎn)單說(shuō)說(shuō)Widget的原理。Widget是在桌面上的一塊顯示信息的東西,也通過(guò)單擊Widget跳轉(zhuǎn)到一個(gè)程序里面。而系統(tǒng)自帶的程序,典型的Widget是music,這個(gè)Android內(nèi)置的音樂(lè)播放小程序。這個(gè)是典型的Widget+app應(yīng)用。就是一個(gè)程序既可以通過(guò)Widget啟動(dòng),也可以通過(guò)App啟動(dòng)。Widget就是一個(gè)AppWidgetProvider+一個(gè)UI界面顯示(預(yù)先綁定了好多Intent),界面上的信息可以通過(guò)程序控制而改變,單擊Widget,上的控件只能激發(fā)發(fā)送一個(gè)Intent,或發(fā)出一個(gè)Service的啟動(dòng)通知。而AppWidgetProvider可以攔截這個(gè)Intent,而進(jìn)行相應(yīng)的處理(比如顯示新的信息)。
我們先來(lái)看看AndroidManifest.xml中的代碼:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name=".BatteryMonitor"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_provider" />
</receiver>

</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
這里很清楚的可以看出AppWidgetProvider就是一個(gè)receiver的東西。
在receiver中
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_provider" />
代表了一個(gè)widget_provider代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="100dip"
android:minHeight="100dip"
android:initialLayout="@layout/main" >
</appwidget-provider>
這個(gè)是Widget的顯示設(shè)置,是對(duì)Widget屬性的一個(gè)配置文件這個(gè)android:minHeight是Widget的高,這個(gè)android:minWidth
是Widget的寬。這個(gè)android:updatePeriodMillis屬性是設(shè)置Widget頁(yè)面的
更新頁(yè)面的時(shí)間的頻率。而這個(gè)android:initialLayout屬性是表示的是初始化頁(yè)面的布局,Android里畫UI的地方都是通過(guò)xml文件,也可以通過(guò)代碼程序來(lái)畫,不過(guò)這樣畫的太麻煩了。
建一個(gè)類BatteryMonitor繼承于AppWidgetProvider,而AppWidgetProvider繼承與android.content.BroadcastReceiver,所以TestAppWidget就是一個(gè)攔截處理Intent的BroadcastReceiver,這些Intent只能在Androidmainfest里設(shè)置來(lái)攔截處理。
在onUpdate中設(shè)置窗口界面:

public void defaultWidget(Context context)
{
RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.main);
//updateViews.setTextViewText(R.id.battery_level, BatteryLevel+" %");
updateViews.setImageViewResource(R.id.battery_img, R.drawable.batteryimg);
// Push update for this widget to the home screen
ComponentName batteryWidget = new ComponentName(context, BatteryMonitor.class);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(batteryWidget, updateViews);
}
啟動(dòng)一個(gè)服務(wù)來(lái)更新電源電量:
context.startService(new Intent(context, BatteryMonitorReceiver.class));
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;
import android.widget.RemoteViews;




public class BatteryMonitorReceiver extends Service


{
private int BatteryLevel = 0;

private BroadcastReceiver batteryReceiver = new BroadcastReceiver()

{
@Override
public void onReceive(Context context, Intent intent)

{
String action = intent.getAction();
if (action.equals(Intent.ACTION_BATTERY_CHANGED))

{
Log.d("BatteryLevel","BatteryCHANGED");
BatteryLevel = intent.getIntExtra("level", 0);
UpdateAppWidget(context);
}
}
};

public void UpdateAppWidget(Context context)
{
RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.main);
updateViews.setTextViewText(R.id.battery_level, BatteryLevel+" %");
// Push update for this widget to the home screen
ComponentName batteryWidget = new ComponentName(context, BatteryMonitor.class);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(batteryWidget, updateViews);
}

/**//* (non-Javadoc)
* @see android.app.Service#onCreate()
*/
@Override

public void onCreate()
{
// TODO Auto-generated method stub
super.onCreate();
IntentFilter itFilter = new IntentFilter();
itFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(batteryReceiver, itFilter);
}

@Override
public void onStart(Intent intent, int startId)

{
}


/**//* (non-Javadoc)
* @see android.app.Service#onDestroy()
*/
@Override

public void onDestroy()
{
// TODO Auto-generated method stub
super.onDestroy();
unregisterReceiver(batteryReceiver);
}

@Override
public IBinder onBind(Intent intent)

{
// TODO Auto-generated method stub
return null;
}

}
在xml中注冊(cè)服務(wù)
<service android:name=".BatteryMonitorReceiver">
<intent-filter>
<action android:name="com.adroid.pp" />
<category android:name="android.intent.category.default" />
</intent-filter>
</service>
代碼下載
posted on 2010-06-13 13:13
漂漂 閱讀(3131)
評(píng)論(1) 編輯 收藏 引用 所屬分類:
android 開(kāi)發(fā)