android-widget<普通篇>
1.AppWidgetProviderInfo对象
为App Widget 提供元数据(如何HTML标签),包括布局,更新频率等等数据。
这个对象被定义在xml文件中。
2.AppWidgetProvider
定义了App Widget的基本生命周期函数。
它继承了BroadcastReceiver类,
3.创建一个App Widget的步骤
3.1 定义AppWidgetProviderInfo:
在res/xml文件夹当中定义一个名为“example_appwidget_info.xml”文件:appwidget-provider(info对象)
在layout文件夹下,定义一个“example_appwidget.xml”布局文件:被上面对象指定的布局
在src里,新建一个继承AppWidgetProvider的类:该类注册在清单文件中
最后在清单文件中注册<receiver/>:指明上面创建的AppWidgetProvider类和appwidget-provider(info对象)
注意:App Widget和我们的应用程序(main)运行在不同的进程当中(app widget当中的View是运行在Home Screen 进程当中),所以无法像以前一样为button设置监听器。
4.RemoteViews
它可以远程操作界面,即可以操作不同进程里的界面,如操作app widget的界面。
构造方法:RemoteViews(String packageName, int layoutId);//常用在AppWidgetProvider的update方法里。
成员方法:setOnClickPendingIntent(R.id.button,pendingIntent);//为appwidget设置监听器。
5.PendingIntent
它是一个包装真正Intent的锦囊,它不知道它要干嘛,所以包装一个真正的Intent,由它去解决。
构造方法: getActivity(Context, int, Intent, int)
,//都是静态的方法,启动Activity
getBroadcast(Context, int, Intent, int)
,//启动一个Broadcast
getService(Context, int, Intent, int),//启动一个Service
6.AppWidgetProvider
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 * 该类为appwidgetprovider类 3 * */ 4 public class ExampleAppWidgetProvider extends AppWidgetProvider{ 5 6 @Override 7 public void onDeleted(Context context, int[] appWidgetIds) { 8 // TODO Auto-generated method stub 9 super.onDeleted(context, appWidgetIds); 10 System.out.println("onDeleted"+context.getPackageName()); 11 } 12 13 @Override 14 public void onDisabled(Context context) { 15 // TODO Auto-generated method stub 16 super.onDisabled(context); 17 System.out.println("onDisabled"+context.getPackageName()); 18 19 } 20 21 @Override 22 public void onEnabled(Context context) { 23 // TODO Auto-generated method stub 24 super.onEnabled(context); 25 System.out.println("onEnabled"+context.getPackageName()); 26 27 } 28 29 @Override 30 public void onReceive(Context context, Intent intent) { 31 //在这里处理传过来的intent意图对象 32 if(intent.getAction().equals(ACTION)) 33 { 34 RemoteViews rv=new RemoteViews(context.getPackageName(), R.layout.example_appwidget) ; 35 rv.setImageViewResource(R.id.iv,R.drawable.qq); 36 //更新视图 37 AppWidgetManager manager=AppWidgetManager.getInstance(context); 38 ComponentName cn=new ComponentName (context,ExampleAppWidgetProvider.class); 39 manager.updateAppWidget(cn, rv ); 40 } 41 42 43 else super.onReceive(context, intent); 44 //System.out.println("onReceive"+context.getPackageName()); 45 46 } 47 //设置intent的动作 48 private final static String ACTION="MYWIDGET_ACITON"; 49 @Override 50 public void onUpdate(Context context, AppWidgetManager appWidgetManager, 51 int[] appWidgetIds) { 52 //监听在此实现 53 //第一步取出appwidget(桌面可能添加多个相同的appwidget) 54 // for(int id=0;id<appWidgetIds.length;id++) 55 // { 56 // //如何设置远程监听操作widget界面 57 // //1,新建pendingIntent 58 // Intent intent=new Intent(context,TestWidget2Activity.class);//启动Activity 59 // PendingIntent pintent=PendingIntent.getActivity(context, 0, intent, 0); 60 // //2,建remoteViews 61 // RemoteViews views=new RemoteViews(context.getPackageName(),R.layout.example_appwidget); 62 // //3,设置监听器 63 // views.setOnClickPendingIntent(R.id.bt, pintent); 64 // //4,最后更新界面 65 // appWidgetManager.updateAppWidget(appWidgetIds[id], views); 66 // 67 // } 68 69 //更改widget里的imageview和textiew 70 Intent intent2=new Intent(); 71 intent2.setAction(ACTION); 72 //用pendingintent包装,并发起广播 73 PendingIntent pintent2=PendingIntent.getBroadcast(context, 0, intent2, 0); 74 RemoteViews remoteviews=new RemoteViews(context.getPackageName(), R.layout.example_appwidget); 75 remoteviews.setOnClickPendingIntent(R.id.bt, pintent2); 76 appWidgetManager.updateAppWidget(appWidgetIds, remoteviews); 77 //super.onUpdate(context, appWidgetManager, appWidgetIds); 78 79 80 81 } 82 83 }