安卓定製軟體桌面(launch)上預置特定程式的widget

whalevoy發表於2015-11-14

最近做一個專案,需要做一個類似安卓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) ;    
        
    }

相關文章