Android开发入门之Appwidget用法分析

 更新时间:2016年07月08日 12:30:19   作者:manymore13  
这篇文章主要介绍了Android开发入门之Appwidget用法,较为详细的分析了App Widget的概念、功能、创建、使用方法与相关注意事项,需要的朋友可以参考下

本文实例讲述了Android Appwidget用法。分享给大家供大家参考,具体如下:

App Widgets 是一个小型应用程序的View  他可以嵌入到其他应用程序中(如 桌面程序) 并且可以得到周期性刷新。

在创建App Widget之前需要了解以下几个概念

AppWidgetProviderInfo对象

它是对App Widget 元数据的一个描述,譬如 AppWidget的布局,刷新频率,以及   AppWidgetProvider 类  这些元数据都是定义在XML中。

AppWidgetProvider 类的实现

对于App Widget定义了(回调接口)一些基本的方法,这些方法都是基于广播事件(broadcast events ),,通过它,当App Widget更新,创建,无效,卸载时,你可以接收广播。

View layout

为App Widget定义初始布局,用XML来布局

另外,你可以为App Widget 实现一个配置的Activity,这是一个可选择的Activity,在用户添加你的App Widget 准备创建时允许他修改或者配 置App Widget 。

下面我们就开始创建一个App Widget

① 在Manifest声明App Widget

首先,在AndroidManifest.xml中声明  AppWidgetProvider

<receiver android:name="ExampleAppWidgetProvider" >
      <intent-filter>
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
      </intent-filter>
      <meta-data android:name="android.appwidget.provider"
        android:resource="@xml/example_appwidget_info" />
</receiver>

<receiver>元素需要Android:name 属性,AppWidgetProvider作为引用
<intent-filter>  元素务必要包含 <action>元素 然后Action中要有android:name 属性,这个属性需要指定能接收 ACTION_APPWIDGET_UPDATE 广播的AppWidgetProvider,也就是ExampleAppWidgetProvider 这个广播必须唯一 必须明确声明,因为AppWidgetManager会自动的发送所有其他应用程序的广播给AppWidgetProvider,所以很重要。

<meta-data> 元素指定AppWidgetProviderInfo资源需要以下属性
Android:name -指定了元数据的名字,用android.appwidget.provider代表数据是AppWidgetProviderInfo描述。
Android:resource -引用AppWidgetProviderInfo 资源的位置
总之一句话:在AndroidManifest.xml主要声明概念中AppWidgetProvider 和AppWidgetProviderInfo

②添加AppWidgetProviderInfo元数据

AppWidgetProviderInfo为AppWidgeet定义了一些最基本的数据,譬如布局的最小尺寸,初始化布局资源,怎样更新App Widget,以及在创建app Widget时的可配置Activity(可选)

要定义一个AppWidgetProviderInfo对象可以用XML资源文件定义,保存在res/xml/自己的文件名 ,XML文件中用一个单一的元素<appwidget-provider> 请看下面的例子:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
  android:minWidth="294dp"
  android:minHeight="72dp"
  android:updatePeriodMillis="86400000"
  android:previewImage="@drawable/preview"
  android:initialLayout="@layout/example_appwidget"
  android:configure="com.example.android.ExampleAppWidgetConfigure"
  android:resizeMode="horizontal|vertical">
</appwidget-provider>

initialLayout:指定App Widget布局资源文件
Configure:在创建App Widget时为他配置属性的activity
updatePeriodMillis: appwidget更新频率

③ 创建App Widget 布局

你必须为你的App Widget定义个初始化布局文件,可以将布局文件放在 res/layout/directory。 你可以设计你的App Widget用下面列出来
的View对象,但是在你设计开始之前,请你熟读App Widget Design Guidelines.

如果你熟悉XML Layouts ,那么创建一个App Widget将会是简单的, 然而,你必须意识到App Widget布局是基于 RemoteViews ,它并不是支持每一种layout和View widget。

一个RemoteView对象只能支持下面几种layout布局类:
FrameLayout  LinearLayout   RelativeLayout

支持下面几种widget 类:
AnalogClock   Button  Chronometer  ImageButton  ImageView  ProgressBar  TextView  ViewFlipper  ListView  GridView
StackView  AdapterViewFlipper

PS:这些类的继承类也是不被支持的。

下面是我本次写的demo中的Appwidget

功能很简单只为初步理解AppWidget ,响应Appwidget上按钮事件

package com.manymorere.appwidget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
public class ExampleAppWidgetProvider extends AppWidgetProvider{
  private static final String ACTION = "com.manymore.appwidget";
  private int id;
  @Override
  public void onDeleted(Context context, int[] appWidgetIds) {
    System.out.println("onDeleted");
    super.onDeleted(context, appWidgetIds);
  }
  @Override
  public void onDisabled(Context context) {
    // TODO Auto-generated method stub
    System.out.println("onDisabled");
    super.onDisabled(context);
  }
  @Override
  public void onEnabled(Context context) {
    // TODO Auto-generated method stub
    System.out.println("onEnabled");
    super.onEnabled(context);
  }
  @Override
  public void onReceive(Context context, Intent intent) {
    System.out.println("onReceive");
    // 自己定义的ACTION
    if(intent.getAction().equals(ACTION))
    {
      RemoteViews remoteView = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout);
      remoteView.setCharSequence(R.id.button, "setText", "22222222222222");
      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
      ComponentName componentName = new ComponentName(context, ExampleAppWidgetProvider.class);
      appWidgetManager.updateAppWidget(componentName , remoteView);
      System.out.println("收到自定义ACTION");
    }else{
      super.onReceive(context, intent);
    }
  }
  @Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager,
      int[] appWidgetIds) {
    int N = appWidgetIds.length;
    for(int i = 0; i<N; i++)
    {
      int appWidgetId = appWidgetIds[i];
      Intent intent = new Intent(ACTION);
      PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
      RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout);
      remoteViews.setOnClickPendingIntent(R.id.button, pendingIntent);
      appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
      System.out.println(appWidgetId);
    }
    super.onUpdate(context, appWidgetManager, appWidgetIds);
  }
}

每次添加Appwidget实例 都会调用onUpdate()方法 然后会注册里面的Button Onclick事件,当你点击该按钮时会发送一个broadcast,这个broadcast是自己定义的,然后onReceive方法会收到该broadcast,然后再做出一些反应,我这里是把修改了TextView上的text。

由于Appwidget和本身的应用,虽然是在一个程序中,但运行时,它们并不是在一个进程中,所以在在调用方法和修改界面上多少会有点限制,没有普通的(Activity上对View的一些操作)那么自由,所以想对Appwidget上的View做一些操作,或者更新Appwidget,一般需要用到RemoteViews,AppWidgetManager 同时可能还会用到ComponentName

个人理解:RemoteViews在创建时主要代表一个Appwidget实例中View的一个集合 ,而ComponentName则代表一个整个Appwidget实例

完整实例代码点击此处本站下载

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android编程之activity操作技巧总结》、《Android资源操作技巧汇总》、《Android文件操作技巧汇总》、《Android操作SQLite数据库技巧总结》、《Android操作json格式数据技巧总结》、《Android数据库操作技巧总结》、《Android编程开发之SD卡操作方法汇总》、《Android开发入门与进阶教程》、《Android视图View技巧总结》及《Android控件用法总结

希望本文所述对大家Android程序设计有所帮助。

相关文章

  • Android Studio升级3.6 Build窗口出现中文乱码问题解决方法

    Android Studio升级3.6 Build窗口出现中文乱码问题解决方法

    这篇文章主要介绍了Android Studio升级3.6 Build窗口出现中文乱码问题解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Android实现纸飞机的简单操作

    Android实现纸飞机的简单操作

    这篇文章主要为大家详细介绍了Android实现纸飞机的简单操作,类似于漂流瓶功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Android 获取系统各个目录的方法

    Android 获取系统各个目录的方法

    今天小编就为大家分享一篇Android 获取系统各个目录的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Android实现简单加法计算器

    Android实现简单加法计算器

    这篇文章主要为大家详细介绍了Android实现简单加法计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Flutter实现渐变色加描边字体效果

    Flutter实现渐变色加描边字体效果

    这篇文章介绍了Flutter实现渐变色描边字体效果的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • Android NotificationListenerService通知监听服务使用

    Android NotificationListenerService通知监听服务使用

    这篇文章主要为大家介绍了Android NotificationListenerService通知监听服务使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 使用Android的OkHttp包实现基于HTTP协议的文件上传下载

    使用Android的OkHttp包实现基于HTTP协议的文件上传下载

    OkHttp(GitHub主页https://github.com/square/okhttp)是近来人气攀升的一款安卓第三方HTTP包,这里我们来讲解一下如何使用Android的OkHttp包实现基于HTTP协议的文件上传下载:
    2016-07-07
  • Kotlin List与Set和Map实例讲解

    Kotlin List与Set和Map实例讲解

    集合是可变数量(可能为0)的一组条目,kotlin标准库提供一个整套用于集合管理的工具,各种集合对于解决问题都具有重要意义,并且经常用到。kotlin中的集合与Java基本类似
    2022-10-10
  • Android自定义超级炫酷的ViewPage指示器

    Android自定义超级炫酷的ViewPage指示器

    由于应公司开发要求,有一个颜色渐变带缩放的指示器,虽然网上很多大佬开源的指示器开源库,但如果一直都是使用别人造的轮子,那么对于自身的能力是毫无提升作用的,即使是参考别人的,然后自己动手写一遍那对于自身来说也是一种升华
    2022-07-07
  • HorizontalScrollView水平滚动控件使用方法详解

    HorizontalScrollView水平滚动控件使用方法详解

    这篇文章主要为大家详细介绍了HorizontalScrollView水平滚动控件的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08

最新评论