最近做一个项目,需要做一个类似安卓launch的定制桌面,其中,需要在软件启动后把天气预报的widget预置到界面里,网上很多资料都是关于安卓平板的底层编译方法,就是直接修改安卓系统的底层设置,然后重新编译,系统桌面上就会出现widget,和我要的软件桌面设置不同。还有类似的程序代码,是在桌面上放置一个按钮,通过按钮事件响应,产生选择widget的intent,启动活动后,跳出可选的widget列表,选择后,widget就可以显示了,需要改造成不需要选的,直接放置到桌面上面。思路比较简单:
1、先事先找出自己想要的widget的class名(可以实现log打印下看看);
2、软件启动后,通过widget管理器,获得所有的可用widget;
3、遍历,如果是自己想要的widget的,就把它显示出来。widget显示需要有一个id号,这个id号,在widget选择的接口中,通过一个放置额外整型参数来自动绑定widget,因为不需要再用选择widget的接口,就需要显式的绑定一下了,一开始没注意这一点,没绑定,所以无法显式出来。
程序执行:构造intent,利用intent启动活动startActivityForResult,活动执行完后会自动调用onActivityResult;
关键代码段如下:
mAppWidgetManager = AppWidgetManager.getInstance(this);
List<AppWidgetProviderInfo> providers = mAppWidgetManager.getInstalledProviders();
final int providerCount = providers.size();
int temp=0;
for (int i = 0; i < providerCount; i++)
{
ComponentName provider = providers.get(i).provider;
Log.i("xxx",">>>>> package name : "+ provider.getPackageName()+">>>>>> class name : "+ provider.getClassName()) ;
//对比希望的privierinfor信息,如果是想要的,就拿出来,放置到界面上; if("com.icoolme.android.weather.widget.WeatherRigoWidget4x2Provider".equalsIgnoreCase(provider.getClassName())){
temp++;
Log.i("ok", "oik");
appWidgetProviderInfo = providers.get(i) ;
newAppWidgetId = mAppWidgetHost.allocateAppWidgetId() ;
//将id与widget绑定到一起;
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, newAppWidgetId);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, provider);
// TODO: we need to make sure that this accounts for the options bundle.
// intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options);
startActivityForResult(intent, MY_REQUEST_APPWIDGET);
}
}
Log.i("ok", String.valueOf(temp));
==========================================
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
Log.i("ok", "get here");
Log.i("ok", String.valueOf(resultCode));
//AppWidgetProviderInfo appWidgetProviderInfo2 = appWidgetManager.getAppWidgetInfo(newAppWidgetId) ;
AppWidgetHostView hostView = mAppWidgetHost.createView(MainActivity.this, newAppWidgetId, appWidgetProviderInfo);
int widget_minWidht = appWidgetProviderInfo.minWidth ;
int widget_minHeight = appWidgetProviderInfo.minHeight ;
//设置长宽 appWidgetProviderInfo 对象的 minWidth 和 minHeight 属性
LinearLayout.LayoutParams linearLayoutParams = new LinearLayout.LayoutParams(widget_minWidht, widget_minHeight);
//添加至LinearLayout父视图中
linearLayout.addView(hostView,linearLayoutParams) ;
}