編輯:關於android開發
1、自定義widget必須繼承AppWidgetProvider
源碼:http://www.jinhusns.com/Products/Download/?type=xcj
2、AndroidManifest.xml中必須注冊
<receiver android:name=".widget.AppWidget" >
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/guide_widget" />
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
</receiver>
(1)receiver的name必須為自定義widget類名
(2)meta-data的name必須為android.appwidget.provider
(3)meta-data 的resource為該widget的描述文件,該文件必須放在res/xml路徑下
(4)需要添加action增加監聽receiver種類android.appwidget.action.APPWIDGET_UPDATE
3、res/xml
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/guide_widget"
android:minHeight="294.0dip"
android:minWidth="294.0dip"
android:updatePeriodMillis="1801000" />
(1)最外層標簽必須為appwidget-provider
(2) android:initialLayout指定了widget使用的布局文件
(3)android:minHeight指定了widget的高度,android:minWidth指定了widget的寬度。這兩個數值不能隨意 指定,最好根據需要放置的widget所占據的屏幕行列數設定。例如,某widget為3行2列,則minHeight應為(3*74)- 2=220,minWidth應為(2*74)-2=146
(4)android:updatePeriodMillis該值為widget刷新時間,最好設置1小時以上,否則會嚴重浪費系統資源,耗電量會很大。每隔固定的該時間,系統就會調用該widget的onUpdate方法,如果該值為0,則表示不更新widget
4、widget繼承自父類方法
(1)onEnabled(Context context)
該方法會在用戶添加widget後調用
(2)onUpdate(Context context, AppWidgetManager
appWidgetManager,int[] appWidgetIds)
該方法會在用戶添加widget後調用,用來刷新界面已經安裝的widget(在onEnabled之後調用)。
appWidgetManager參數用來執行刷新界面的操作
appWidgetIds是該應用程序所有widget的id(用戶可能添加多個,因此此處為數組)
(3)onDeleted(Context context, int[] appWidgetIds)
該方法會在widget被刪除後調用(注意,是刪除後,也就是說,該方法不是執行刪除動作的)
(4)onReceive(Context context, Intent intent)
該方法是繼承自receiver的,盡量不要使用,如果要使用,就需要你自己處理一些特殊代碼,否則widget就會出問題
5、界面widget的刷新及點擊事件
(1)在widget中,不能再使用findviewbyid方法獲取組件,需要使用其他的方式。RemoteViews rv = new RemoteViews(context.getPackageName(),
R.layout.guide_widget);
RemoteViews 是一個虛構的組件,用它來承載layout。
(2) 點擊layout中的某個組件啟動activity或service
Intent intent = new Intent(context, WidgetDemoActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
rv.setOnClickPendingIntent(R.id.guide_0, pendingIntent);
(3) 界面刷新
appWidgetManager.updateAppWidget(appWidgetId, rv);
6、 widget支持在layout中使用的組件
FrameLayout、LinearLayout、RelativeLayout
AnalogClock、Button、Chronometer、ImageButton、ImageView、ProgressBar、TextView
7、 自定義widget類完整代碼
public class AppWidget extends AppWidgetProvider {
RemoteViews rv;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
System.out.println(context.getPackageName());
final int N = appWidgetIds.length;
// 因為有可能用戶添加了多個窗口小部件,所以這裡需要遍歷appWidgetIds
for (int i = 0; i < N; i++) {
System.out.println(appWidgetIds[i]);
int appWidgetId = appWidgetIds[i];
rv = new RemoteViews(context.getPackageName(),
R.layout.guide_widget);
Intent intent = new Intent(context, WidgetDemoActivity.class);
intent.setAction(context.getPackageName() + appWidgetId);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
intent, 0);
rv.setOnClickPendingIntent(R.id.guide_0, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, rv);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
}
8、 widget生命周期(android1.6)
(1) 當用戶拖拽widget到界面時,會按照順序分別調用如下幾個方法:onReceive-onEnabled-onReceive-onUpdate-onReceive-onReceive
(2) 當用戶拖拽widget刪除時,會按照順序分別調用如下幾個方法:
onReceive-onDeleted-onReceive-onDisabled
免費培訓課:http://www.jinhusns.com/Products/Curriculum/?type=xcj
React-Native系列Android——Native與Javascript通信原理(二) 前一篇博客分析了Native端向Javascript端通信的全流程,這
Linux內核系列—操作系統開發之保護模式的優勢,linux內核在上一篇中我們雖然成功進入了保護模式,但是並沒有體驗到保護模式帶給我們的便利。其實在保護模式下尋址空間可以
ImageView學習,imageview package liu.roundimagedemo.view; import android.conten
學習Android從0開始之基礎篇(4)-TextView與EditText TextView與EditText詳解 TextView 顧名思義:就是在界面