android widget 研究

    技术2022-05-20  31

     

    之前的一些配置如mainfest.xml,xml/widget  ,res/layout/my_widget的具体配置请参考API文档,有详细的介绍。

     

     

    一。对widget的配置。

     

    要实现对widget的configurate的设置有以下几点要注意的

    Intent intent = new Intent(); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { mAppWidgetId }); context.sendBroadcast(intent); setResult(RESULT_OK, intent); 

     

    1.通过sendBroadcast把当前intent发送出去,action必须是AppWidgetManager.Action_APPWIDGET_UPDATE; 这样你写的WidgetProvider能接受到,因为widgetProvider本身就是reciver,action就是AppWidgetManager.Action_APPWIDGET_UPDATE,这样就能实现call widgetProvider

     

    2.一定要写setResult(RESULT_OK, intent); 不然widget不会放到桌面上去(忘记了我测试了好久都没有出现。很郁闷的)

     

     

    E/AndroidRuntime( 1785): Caused by: java.lang.NullPointerException

    E/AndroidRuntime( 1785): at com.android.launcher.Launcher.completeAddAppWidget(Launcher.java:657)

    E/AndroidRuntime( 1785): at com.android.launcher.Launcher.onActivityResult(Launcher.java:352)

    E/AndroidRuntime( 1785): at android.app.Activity.dispatchActivityResult(Activity.java:3595)

    E/AndroidRuntime( 1785): at android.app.ActivityThread.deliverResults(ActivityThread.java:3001)

     

    因为对应的Laucher中把对应的widget的ID加入到WorkSpace.java中去。

     

     

    二。对widgetProvidrer的编写

     

    1.对于WidgetProvider的编写

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // TODO Auto-generated method stub super.onUpdate(context, appWidgetManager, appWidgetIds); defaultAppWidget(context, appWidgetIds); context.startService(updateIntent); } 

     

    defaultAppWidget的处理主要是获取到当前的RemoteViews 然后对其中的button 等设置监听

    监听的设置 一般是用pendingIntent.因为RemoteViews只支持setOnClickPendingIntent(id,pendingIntent);

    而pendIntent的获取一般有2种方法一种是PendingIntent.getActivity();就是跳到对应的Activity去处理你的事假。

     

    pendingIntent = PendingIntent.getActivity(context,

    0 /* no requestCode */, intent, 0 /* no flags */);

    views.setOnClickPendingIntent(R.id.ivCover, pendingIntent);

     

    第二种是通过调用servers来处理

     

    pendingIntent = PendingIntent.getService(context,

    0 /* no requestCode */, intent, 0 /* no flags */);

    views.setOnClickPendingIntent(R.id.btnNext, pendingIntent);

     

     

     

    三。对server的编写

     

    onCreate一般是第一次调用的时候实例化一些东西

    一般在onStart()中对你传过来的action进行处理

     

    对应的servers处理完之后,调用WidgetProvider中的更新UI的code就ok了

     

     

    参考文献:

    Music的widget

    Search的widget

    有兴趣朋友可以直接去查看下源码!

     


    最新回复(0)