安卓定制软件桌面(launch)上预置特定程序的widget

最近做一个项目,需要做一个类似安卓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 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) ;    
        
    }

你可能感兴趣的:(android,widget)