Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Widget 小部件(一) 簡單實現

Android Widget 小部件(一) 簡單實現

編輯:關於Android編程

在屏幕上添加Widget:或長按屏幕空白處,或找到WidgetPreview App選擇。原生系統4.0以下使用長按方式,4.0及以上 打開WIDGETS

創建Widget的一般步驟:
在menifest中


             
                 
                 
                 
             
             
                 

Widget描述文件:timer_widget_provider.xml



	


Widget使用的布局:timer_widget.xml


    
	
	


處理Widget相關事件的 AppWidgetProvider
package com.stone.ui;

import java.util.Arrays;

import com.stone.R;
import com.stone.service.TimerWidgetService;

import android.app.PendingIntent;
import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.text.format.DateUtils;
import android.widget.RemoteViews;

/*
 * AppWidgetProvider 必須要接收android.appwidget.action.APPWIDGET_UPDATE 廣播
 * 
 */
public class TimerWidgetProvider extends AppWidgetProvider {
	
	@Override //更新部件時調用,在第1次添加部件時也會調用
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		super.onUpdate(context, appWidgetManager, appWidgetIds);
		System.out.println("onUpdate widget:" + Arrays.toString(appWidgetIds));
		/*
		 * 構造pendingIntent發廣播,onReceive()根據收到的廣播,更新
		 */
		Intent intent = new Intent(context, TimerWidgetService.class);
		PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);
		RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.timer_widget);
		rv.setOnClickPendingIntent(R.id.start_stop, pendingIntent);
		appWidgetManager.updateAppWidget(appWidgetIds, rv);
	}
	
	@Override	//部件從host中刪除
	public void onDeleted(Context context, int[] appWidgetIds) {
		super.onDeleted(context, appWidgetIds);
		System.out.println("onDeleted widget");
	}
	
	@Override //第1次創建時調用,之後再創建不會調用
	public void onEnabled(Context context) {
		super.onEnabled(context);
		System.out.println("onEnabled widget");
	}
	
	@Override //當最後一個部件實例 被刪除時 調用  用於清除onEnabled執行的操作
	public void onDisabled(Context context) {
		super.onDisabled(context);
		System.out.println("onDisabled widget");
	}
	
	@Override //
	public void onReceive(Context context, Intent intent) {
		super.onReceive(context, intent);
		System.out.println("onReceive widget");
		/*
		 * 接收 
           在其他組件或activity或service中發送這些廣播
           
		 */
		if (intent.getAction().equals("com.stone.action.start")) {
			long time = intent.getLongExtra("time", 0);
			 updateWidget(context, time);
			 System.out.println("receive com.stone.action.start");
		}
	}
	
	private void updateWidget(Context context, long time) {
		//RemoteViews處理異進程中的View
		RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.timer_widget);
		System.out.println("time=" + time);
		rv.setTextViewText(R.id.counter, DateUtils.formatElapsedTime(time / 1000));
		
		AppWidgetManager am = AppWidgetManager.getInstance(context);
		int[] appWidgetIds = am.getAppWidgetIds(new ComponentName(context, TimerWidgetProvider.class));
		am.updateAppWidget(appWidgetIds, rv);//更新 所有實例
	}
}

AppWidgetProvider中使用的TimerWidgetService

package com.stone.service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class TimerWidgetService extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}
	
	@Override
	public void onCreate() {
		super.onCreate();
	}
	
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		/*
		 * do some thing
		 */
		//發送廣播通知 widget 更新 狀態
		sendBroadcast(new Intent("com.stone.action.start").putExtra("time", System.currentTimeMillis()));
		return Service.START_STICKY;
	}
}


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved