appWidget 简单入门学习笔记

  1. 云栖社区>
  2. 博客>
  3. 正文

appWidget 简单入门学习笔记

技术小大人 2018-02-24 17:15:45 浏览772
展开阅读全文

1,让桌面能够添加你的appWidget

1,一个类,和2个xml


  1. //一个实现AppWidgetProvider的类   
  2. public class TomAppWidgetProvider extends  
  3.  AppWidgetProvider {   } 

  1. <!--放在 res/xml 文件夹中命名为tom_appwidget_info.xml-->  
  2. <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"      
  3. android:minWidth="294dp"      
  4. android:minHeight="72dp"      
  5. android:updatePeriodMillis="86400000"      
  6. android:initialLayout="@layout/tom_appwidget"      
  7. android:configure="kg.tom.AppWidgetConfigure"     > </appwidget-provider>   
  8. <!-- android:initialLayout: 初始化你的appWidget布局 --> 

  1. <!--放置在res/layout/tom_appwidget_provider.xml-->  
  2. <?xml version="1.0" encoding="utf-8"?>     
  3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      
  4. android:layout_width="294dp"      
  5. android:layout_height="72dp"      
  6. android:orientation="vertical"    > <TextView       
  7. android:id="@+id/appwidget_text"      
  8. android:layout_width="wrap_content"      
  9. android:layout_height="wrap_content"      
  10. android:textColor="#ff000000"/>     <Button          
  11. android:id="@+id/appwidget_button"          
  12. android:layout_width="wrap_content"          
  13. android:layout_height="wrap_content"          
  14. android:text="@android:string/ok"    />     
  15. </LinearLayout> 

在AndroidManifest.xml中声明你的appWidget


  1. <receiver android:name="TomAppWidgetProvider" >       
  2. <intent-filter>   
  3. <!--让系统能够设别到你的appWidgetProvider的动作-->        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />       
  4. </intent-filter>   
  5. <!--设置你的appWidget的布局-->      
  6. <meta-data android:name="android.appwidget.provider"               android:resource="@xml/tom_appwidget_info" />   
  7. </receiver> 

长按你的Home 界面,你就会看到你的widget已经在列表当中

但是,现在点击是会出错的,这时候我们需要设置我们的AppWidgetConfigure

在activity中增加一个Intent-filter


  1. <intent-filter>               
  2. <!-- 让系统能够设别到你的appWidgetProvider的动作 -->              
  3. <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />           
  4. </intent-filter> 

  1. public class AppWidgetConfigure extends Activity {       
  2. @Override      
  3. public void onCreate(Bundle savedInstanceState) {           
  4. super.onCreate(savedInstanceState);           
  5. //设置widgetId           
  6. int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;           
  7. //1,将setResult 设置为 取消,用于取消widget host         setResult(RESULT_CANCELED);                   
  8. //2,从Intent 中找到widget 的id            
  9. Intent intent = getIntent();           
  10. Bundle extras = intent.getExtras();           
  11. if(extras != null){               
  12. mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);         }                     
  13. //3,如果获取不到 appWidget id 我们就结束           
  14. if(mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID){               
  15. Log.d("app""获取失败退出!!!");               
  16. finish();         }                               
  17. final Context context = AppWidgetConfigure.this;           
  18. //4,实例化你的 appWidget           
  19. AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);                     
  20. //5,更新widget           
  21. Intent resultValue = new Intent();         resultValue.putExtra(appWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);           
  22. setResult(RESULT_OK, resultValue);           
  23. finish();                         } } 

2,然后写provider的代码


  1. public class TomAppWidgetProvider extends AppWidgetProvider {       
  2. @Override      
  3. public void onUpdate(Context context, AppWidgetManager appWidgetManager,               
  4. int[] appWidgetIds) {           
  5. // TODO Auto-generated method stub           
  6. super.onUpdate(context, appWidgetManager, appWidgetIds);           
  7. final int N = appWidgetIds.length;           
  8. Log.d("app""onUpdate--->Ids==="+String.valueOf(N) );           
  9. for(int i=0; i < N; i++){               
  10. int appWidgetId = appWidgetIds[i];                             
  11. updateAppWidget(context, appWidgetManager, appWidgetId);         }               }             
  12. static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,int appWidgetId){           
  13. Log.d("app""update---->id" + appWidgetId);           
  14. //1,widget中的的标题           
  15. CharSequence text = "这是我第一个widget";           
  16. //2,widget显示用布局,并设置text显示的值           
  17. RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.tom_appwidget_provider);         views.setTextViewText(R.id.appwidget_text, text);           
  18. //3,通知widget manager 更新         appWidgetManager.updateAppWidget(appWidgetId, views);               }             
  19. @Override      
  20. public void onDeleted(Context context, int[] appWidgetIds) {           
  21. // TODO Auto-generated method stub         super.onDeleted(context, appWidgetIds);           
  22. //删除的时候调用的方法           
  23. int appids = appWidgetIds.length;           
  24. Log.d("app""onDelete--->" + appids);     } } 

然后就可以运行了:

顺便附上一张简单原理图:..

2,小小的进阶为widget实现运行activity

只要在加上几行代码的appwidget 就能实现挑战到Activity的功能

1,新建一个HelloAppWidget的activity


  1. static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,int appWidgetId){           
  2. Log.d("app""update---->id" + appWidgetId);           
  3. //1,设置显示用标题           
  4. CharSequence text = "这是我第一个widget";                     
  5. //1.1,增加跳转用activity相关 intent           
  6. Intent intent = new Intent(context, HelloAppWidget.class);           
  7. PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);           
  8. //2,如果,没有在xml中声明RemoteViews布局,这里就必须要让其他布局基于RemoteViews           
  9. RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.tom_appwidget_provider);         views.setTextViewText(R.id.appwidget_text, text);           
  10. //2.1将需要跳转的intent绑定到appWidget button中         views.setOnClickPendingIntent(R.id.appwidget_button, pendingIntent);                     
  11. //3,通知widget manager 更新         appWidgetManager.updateAppWidget(appWidgetId, views);               } 

跳转到特定activity…ps:使用activity记得在AndroidManifest.xml中注册

网友评论

登录后评论
0/500
评论
技术小大人
+ 关注