AppWidgetProvider小部件开发(RemoteViews 机制分析)

桌面小部件开发:

一,AppWidgetProvider 

(本质是一个广播) 运行在SystemServier 通过RemoteViews 跨进程更新

1.xml文件

注册的xml文件:

   <receiver android:name=".widget.TableWidget"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
                <action android:name="com.com.example.cuizehui.estore.widget.Click"/>
            </intent-filter>
            <meta-data android:name="android.appwidget.provider"
                android:resource="@xml/example_appwidget_info" />
        </receiver>

配置 长相的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="80dp"
    android:minHeight="80dp"
    android:previewImage="@drawable/shop_normal"
    android:initialLayout="@layout/tablewidget_layout"
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen|keyguard">

    <!--
    android:minWidth : 最小宽度
    android:minHeight : 最小高度
    android:updatePeriodMillis : 更新widget的时间间隔(ms),"86400000"为1个小时
    android:previewImage : 预览图片
    android:initialLayout : 加载到桌面时对应的布局文件
    android:resizeMode : widget可以被拉伸的方向。horizontal表示可以水平拉伸,vertical表示可以竖直拉伸
    android:widgetCategory : widget可以被显示的位置。home_screen表示可以将widget添加到桌面,keyguard表示widget可以被添加到锁屏界面。
    android:initialKeyguardLayout : 加载到锁屏界面时对应的布局文件
     -->

</appwidget-provider>

2.实现类

public class TableWidget extends AppWidgetProvider {


   public  static  final String  ClickAction="com.com.example.cuizehui.estore.widget.Click" ;
    public TableWidget() {
        super();
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

        //对ui进行初始化

    
    
RemoteViews remoteViews=new RemoteViews(context.getPackageName(), R.layout.tablewidget_layout);// 包名和布局文件名
remoteViews.setImageViewResource(R.id.table_imageview,R.drawable.tabl); ComponentName componentName=new ComponentName(context,TableWidget.class); //设置点击事件 Intent intentclick=new Intent(context,MainActivity.class); // intentclick.setAction(ClickAction); PendingIntent pendingIntent=PendingIntent.getActivity(context,0,intentclick,0); remoteViews.setOnClickPendingIntent(R.id.table_imageview,pendingIntent); /* //如果时内部 则相当于给自己发送广播 注册好action 后自己发送 Intent intentaciton=new Intent(); PendingIntent pendingIntentclick=PendingIntent.getBroadcast(context,0,intentaciton,0); remoteViews.setOnClickPendingIntent(R.id.table_imageview,pendingIntentclick); */ appWidgetManager.updateAppWidget(componentName,remoteViews); } //接受到广播后自己要做什么 @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); if (intent.getAction().equals(ClickAction)){ AppWidgetManager appWidgetManager=AppWidgetManager.getInstance(context); //对ui进行修改 RemoteViews remoteViews=new RemoteViews(context.getPackageName(), R.layout.tablewidget_layout); Bitmap bitmap= BitmapFactory.decodeResource(context.getResources(),R.drawable.tabl); remoteViews.setImageViewBitmap(R.id.table_imageview,rotateBitmap(context,bitmap,180)); appWidgetManager.updateAppWidget(new ComponentName(context,TableWidget.class),remoteViews); } } private Bitmap rotateBitmap(Context context,Bitmap srcbBitmap ,float degeree){ Matrix matrix=new Matrix(); matrix.reset(); matrix.setRotate(degeree); Bitmap tmpBitmap=Bitmap.createBitmap(srcbBitmap,0,0,srcbBitmap.getWidth(),srcbBitmap.getHeight(),matrix,true); return tmpBitmap; } }

通过上面可以看到 注册点击事件的方法和更新UI的方式。

onRreceive 源码可以看到
是根据Intent 来判断 并自动调用其中的 onUpdata/onDisable/....等几个方法的
(所以我们也可以自己注册Action 并获取  在其中写自己的逻辑)

3.点击事件

PedingIntent (send/cancel)

支持三种待定的意图 (activity /broadcast/service)
4个参数, 最后一个Flag的作用是通过前两个 参数(requestcode 和intent 其中的intent-fitlter和conponext)用来标识 是否是同一 来选择是否send/cancel。

setOnclickPedingIntent() 即可完成点击事件的注册。

4.更新UI的方式

这段代码是用来更新UI的:
   AppWidgetManager appWidgetManager=AppWidgetManager.getInstance(context);

         //对ui进行修改
         RemoteViews remoteViews=new RemoteViews(context.getPackageName(), R.layout.tablewidget_layout);
         Bitmap bitmap= BitmapFactory.decodeResource(context.getResources(),R.drawable.tabl);
         remoteViews.setImageViewBitmap(R.id.table_imageview,rotateBitmap(context,bitmap,180));


         appWidgetManager.updateAppWidget(new ComponentName(context,TableWidget.class),remoteViews);

代码解析:

本质上是AppwidgetManager 通过Binder 和SystemService中的 AppwigetService 进行通信

Remoteview 实现了parcelable 接口所以可以通过Binder进行传输


每次Remoteview的set方法本质都是产生了一个RemotionAction对象放到 list中, 传递过去后通过 apply 拆包的(最终是RemoteView的Apply 和reApply 方法获取的)
 

参考文章:
http://blog.csdn.net/qq_26787115/article/details/54427183

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android小部件开发是一种在Android应用程序中创建可直接在主屏幕上显示的交互式组件的方法。它允许用户通过简单地查看主屏幕即可获得应用程序的相关信息或访问其常用功能,而不必打开整个应用程序。 Android小部件可以是静态的,只能显示信息,例如时钟或天气预报,也可以是动态的,可以与用户进行实时交互,例如音乐播放器或电子邮件小部件。 要开发Android小部件,首先需要创建一个小部件类,继承自Android的AppWidgetProvider类。然后,需要在AndroidManifest.xml文件中进行相应的声明,以使系统能够正确加载和处理小部件。 接下来,需要定义小部件的布局和样式,以及处理小部件的交互逻辑。可以使用XML布局文件来定义小部件的外观与布局,还可以使用Java代码来处理用户与小部件的交互,例如点击事件或滑动手势。 在开发过程中,还可以利用Android提供的各种小部件组件,例如文本视、按钮或进度条,来构建小部件的界面和功能。 最后,需要在小部件类中实现一些生命周期方法,例如onUpdate()、onEnabled()和onDisabled(),以便处理小部件的更新和启用/禁用状态。 Android小部件开发具有广泛的应用场景,可以用于显示实时数据、控制设备、提供快捷操作等。通过灵活运用小部件的设计和开发技巧,可以为用户提供更便捷、直观的体验,并提升应用程序的功能性和可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值