[AppWidgetProvider]Android源码分析——桌面小部件

    看了下AppWidgetProvider的源代码。它继承自BroadcastReceiver,说明是一个广播接收者。

    先上源代码:

public class AppWidgetProvider extends BroadcastReceiver {

    public AppWidgetProvider() {
    }

    // BEGIN_INCLUDE(onReceive)
    public void onReceive(Context context, Intent intent) {
        // Protect against rogue update broadcasts (not really a security issue,
        // just filter bad broacasts out so subclasses are less likely to crash).
        String action = intent.getAction();
        if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) {
            Bundle extras = intent.getExtras();
            if (extras != null) {
                int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
                if (appWidgetIds != null && appWidgetIds.length > 0) {
                    this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds);
                }
            }
        }
        else if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
            Bundle extras = intent.getExtras();
            if (extras != null && extras.containsKey(AppWidgetManager.EXTRA_APPWIDGET_ID)) {
                final int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
                this.onDeleted(context, new int[] { appWidgetId });
            }
        }
        else if (AppWidgetManager.ACTION_APPWIDGET_ENABLED.equals(action)) {
            this.onEnabled(context);
        }
        else if (AppWidgetManager.ACTION_APPWIDGET_DISABLED.equals(action)) {
            this.onDisabled(context);
        }
    }
    // END_INCLUDE(onReceive)
    
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    }
    
    public void onDeleted(Context context, int[] appWidgetIds) {
    }

    public void onEnabled(Context context) {
    }
 
    public void onDisabled(Context context) {
    }
}

     源码很简单,我们可以看到,它实现了BroadcastReceiver的onReceive方法,在这个方法中通过intent的action来区分不同的接收的广播事件。

    当action为AppWidgetManager.ACTION_APPWIDGET_UPDATE时,会调用onUpdate回调方法;

    当action为AppWidgetManager.ACTION_APPWIDGET_DELETED时,会调用onDeleted回调方法;

    当action为AppWidgetManager.ACTION_APPWIDGET_ENABLED时,会调用onEnabled回调方法;

    当action为AppWidgetManager.ACTION_APPWIDGET_DISABLED时,会调用onDisabled回调方法。

    

    那么上面四种类型的广播又是什么时候发出的呢?因此,我写了个继承AppWidgetProvider的类,测试了一下。

测试代码如下:

public class NewsWidgetProvider extends AppWidgetProvider {

	private final static String TAG = "NewsWidgetProvider";

	@Override
	public void onDeleted(Context context, int[] appWidgetIds) {
		Log.d(TAG , "onDeleted");
		super.onDeleted(context, appWidgetIds);
	}

	@Override
	public void onDisabled(Context context) {
		Log.d(TAG , "onDisabled");
		super.onDisabled(context);
	}

	@Override
	public void onEnabled(Context context) {
		Log.d(TAG , "onEnabled");
		super.onEnabled(context);
	}

	@Override
	public void onReceive(Context context, Intent intent) {
		Log.d(TAG , "onReceive");
		super.onReceive(context, intent);
	}

	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		Log.d(TAG , "onUpdate");
		super.onUpdate(context, appWidgetManager, appWidgetIds);
		for(int id : appWidgetIds)
			Log.d(TAG , "appWidgetId=" + id);
	}
	
}

实验结果为:

当第一个widget被创建出来时,执行顺序是:

当第二个相同的widget被创建出来时,执行顺序是:

当第三个相同的widget被创建出来时,执行顺序是:

删除一个widget时,执行顺序为:

删除最后一个widget时,执行顺序为:

 

 

 

 

 

你可能感兴趣的:(android)