Android中小部件的使用

定义

Android中提供了AppWidgetProvider类为实现桌面小部件,AppWidgetProvider继承了BroadcastReceiver,所以它本质上是一个广播。

常用方法

AppWidgetProvider类有几个常用的重要方法,它们会自动地在广播接收后的onReceive方法里在特定的条件下被调用,这些方法有:

onEnable                          当小部件第一次添加到桌面时调用该方法,小部件可以添加多次但该方法只会在第一次添加时调用。

onUpdate                         小部件被添加时或每次自动更新时都会调用一次该方法。

onDeleted                        每删除一次桌面小部件就调用一次。

onDisabled                      当最后一个该类型的桌面小部件被删除时调用该方法。

示例

1、定义小部件界面

新建XML文件:res/layout/app_widget.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:orientation="vertical" >
   <ImageView
       android:id="@+id/imageView1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:src="@drawable/sunny" />
   <TextView
       android:id="@+id/textView1"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:gravity="center"
       android:textSize="30dp"
       android:text="天晴"/>
</LinearLayout>

2、定义小部件配置信息

新建XML文件:res/xml/appwidget_provider_info.xml:

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
   android:initialLayout="@layout/app_widget"                // 初始化布局文件
   android:minHeight="230dp"                                 // 最小尺寸   
   android:minWidth="225dp"                                  // 最小尺寸
   android:updatePeriodMillis="10000" >                      // 自动更新周期(SDK1.6及以上版本,小于30分钟的话,系统自动当30分钟)
</appwidget-provider>

3、定义小部件实现类

public class AppWidgetProvider extends android.appwidget.AppWidgetProvider {
   public static final String CLICK_ACTION ="com.example.action.CLICK";
 
   private int[] mImageIds = { R.drawable.sunny, R.drawable.rain,R.drawable.cloudy };
   private String[] mTexts = { "天晴", "小雨","多云" };
 
   public AppWidgetProvider() {
       super();
    }
 
   @Override
   public void onReceive(final Context context, Intent intent) {
       super.onReceive(context, intent);
 
       if (intent.getAction().equals(CLICK_ACTION)) {
 
           AppWidgetManager appWidgetManager =AppWidgetManager.getInstance(context);
           onWidgetUpdate(context, appWidgetManager, -1, new ComponentName(context,AppWidgetProvider.class));
       }
    }
 
   @Override
   public void onEnabled(Context context) {
       super.onEnabled(context);
    }
 
   /**
    * 每次窗口小部件被点击更新都调用一次该方法
    */
   @Override
   public void onUpdate(Context context, AppWidgetManager appWidgetManager,  int[] appWidgetIds) {
       super.onUpdate(context, appWidgetManager, appWidgetIds);
 
       final int counter = appWidgetIds.length;
       for (int i = 0; i < counter; i++) {
           int appWidgetId = appWidgetIds[i];
           onWidgetUpdate(context, appWidgetManager, appWidgetId, null);
       }
 
    }
 
   @Override
    public void onDeleted(Context context, int[]appWidgetIds) {
       super.onDeleted(context, appWidgetIds);
    }
 
   @Override
   public void onDisabled(Context context) {
       super.onDisabled(context);
    }
 
   /**
    * 小部件更新
    *
    * @param context
    * @param appWidgeManger
    * @param appWidgetId
    * @param provider
    */
   private void onWidgetUpdate(Context context, AppWidgetManager appWidgeManger, int appWidgetId, ComponentName provider) {
 
       // 生成0~2的随机数,用于随机转换天气
       Random random = new Random();
       int index = random.nextInt(3);
 
       // 用于图标点击的意图
       Intent intentBroadcast = new Intent(context, AppWidgetProvider.class);
       intentBroadcast.setAction(CLICK_ACTION);
       PendingIntent pendingIntentBroadcast = PendingIntent.getBroadcast(context,0, intentBroadcast, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
 
       // 用于文字点击的意图
       Intent intentActivity = new Intent(context, MainActivity.class);
       PendingIntent pendingIntentActivity = PendingIntent.getActivity(context,0, intentActivity, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
 
       // 定义RemoteViews布局
       RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.app_widget);
       remoteViews.setImageViewBitmap(R.id.imageView1,BitmapFactory.decodeResource(context.getResources(), mImageIds[index]));
       remoteViews.setTextViewText(R.id.textView1, mTexts[index]);
       remoteViews.setOnClickPendingIntent(R.id.imageView1,pendingIntentBroadcast);
       remoteViews.setOnClickPendingIntent(R.id.textView1,pendingIntentActivity);
 
       if (appWidgetId == -1 && remoteViews != null) {
           appWidgeManger.updateAppWidget(provider, remoteViews);
       } else {
            appWidgeManger.updateAppWidget(appWidgetId,remoteViews);
       }
    }
}

4、因为是广播,所以最后别忘了在AndroidManifest.xml中声明小部件

<receiver android:name=".AppWidgetProvider" >
   <meta-data
       android:name="android.appwidget.provider"
       android:resource="@xml/appwidget_provider_info" >
   </meta-data>
 
   <intent-filter>
       <action android:name="com.example.action.CLICK" />
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
   </intent-filter>
</receiver>

效果

说明

1、上面示例小部件做了一个演示和当单击图片会随机切换一种天气展示,当单击文字时会打开MainActivity

2、当小部件单击后切换天气展示则是通过更新RemoteView来实现的

3、AndroidManifers.xml中有两个Action,其中第一个Action用于识别小部件的单击行为,而第二个Action是系统的规范,作为小部件的标识而必须存在

4、SDK1.6及以上版本,自动更新最小间隔为30分钟。所以如果您APP需要高频更新小部件,例如像时钟小部件那样,一般需要一分种刷新一次的话,则需要自己通过服务来定时刷新时间的显示

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值