`
zhanglfat
  • 浏览: 91693 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

widget的设计与应用

 
阅读更多
1.AppWidgetProviderInfo对象

      这个对象为AppWidget提供元数据,包括布局、更新频率等信息,这个对象定义在xml文件中,不需要自己生成,时系统自己生成的。

2.AppWidgetProvider

      这个类定义了AppWidget的基本生命周期函数,具体如下:

onReceive(Context, Intent)   接收广播事件
onUpdate(Context , AppWidgetManager, int[] appWidgetIds)  到达指定的更新时间或用户向桌面添加widget时候调用
onEnabled(Context)  当AppWidget实例第一次被创建时调用
onDeleted(Context, int[] appWidgetIds)  当AppWidget被删除时调用
onDisabled(Context)  当最后一个AppWidget被删除时调用

四.创建AppWidget的基本步骤

1.定义AppWidgetProviderInfo:在res中新建文件夹xml,在其中定义AppWidget_ProviderInfo.xml文件,主要设置的参数如下:
minWidth: 定义Wdiget组件的宽度
minHeight: 定义Wdiget组件的高度
updatePeriodMillis: 更新的时间周期
initialLayout: Widget的布局文件

代码示例:

<?xml version="1.0" encoding="utf-8"?> 

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 

      android:minWidth="80dp" 

      android:minHeight="32dp" 

      android:updatePeriodMillis="86400000" 

      android:initialLayout="@layout/appwidgetlayout"   > 

</appwidget-provider>

其中的appwidgetlayout为layout文件夹下面新建一个xml文件,在这个文件中描述了appWidget的控件和布局等等信息,如:

<?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="horizontal"
  android:background="@drawable/appbackground"
  android:gravity="center">
 
  <TextView
   android:id="@+id/title"
   android:layout_width="90dip"
   android:layout_height="wrap_content"
   android:text="无歌曲播放"
   android:textColor="#ffffff"
   android:textSize="15dip"
   android:layout_marginLeft="30dip"
   />
    <ImageButton
   android:id="@+id/lastButton"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="@drawable/latest_selecor"
   android:layout_marginRight="5dip"
   />
 
  <ImageButton
   android:id="@+id/playButton"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_marginRight="5dip"
   android:layout_marginLeft="5dip"

   />
  <ImageButton
   android:id="@+id/nextButton"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="@drawable/next_selecor"
   android:layout_marginLeft="5dip"
   />
  </LinearLayout>

2.为AppWidget指定布局和样式,即此AppWidget在手机桌面上显示的样式,其实就是一个布局xml文件。需要注意的是使用的组件必须是RemoteViews所支持的,目前原生API中支持的组件如下:
FrameLayout
LinearLayout
RelativeLayout

AnalogClock
Button
Chronmeter
ImageButton
ImageView
ProgressBar
TextView
如果使用了除此之外的组件,则在Widget创建时会导致android.view.InflateExceptionn异常。这就导致有一些功能或样式无法实现,如很基本的list或文本编辑框都是无法直接实现的。

3.实现AppWidgetProvider。

      覆写其中的回调函数,后边会详细介绍。

4.在AndroidManifest.xml中声明(用receiver标签声明)

   <receiver android:name="music.dreamer.useful.AppWidget">
         <meta-data android:name="android.appwidget.provider" //name固定这么写
            android:resource="@xml/appwidgetprovider"/>//在xml文件夹下建立的AppWidgetProviderInfo文件
         <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action> //接收什么样的广播,默认的action有4种,对应除onReceive外的4种生命周期函数,也可以自己写。自己写的如以下4个:

             <action android:name="music.dreamer.playmusic"></action>
             <action android:name="music.dreamer.pause"></action>
             <action android:name="music.dreamer.play"></action>
             <action android:name="music.dreamer.musictitle"></action>
            </intent-filter>
        </receiver>

五.在AppWidget中使用控件

1.一个重要的概念

      AppWidget和其原本的App并不在同一个进程中,而是运行在HomeScreen进程当中,因此,在控件监听器的绑定,更新等操作都会与以前基本的方法有所不同。

2.PendingIntent

(1)概念

      PendingIntent是一个特殊的Intent,实际上它像一个邮包,其中包裹着真正的Intent,当邮包未打开时,Intent是被“挂起”的,所以并不执行,只有当邮包拆开时才会执行。它与Intent的区别在于:Intent 是及时启动,intent 随所在的activity 消失而消失。
PendingIntent 可以看作是对intent的包装,通常通过getActivity,getBroadcast ,getService来得到pendingintent的实例,当前activity并不能马上启动它所包含的intent,而是在外部执行 pendingintent时,调用intent的。正由于pendingintent中 保存有当前App的Context,使它赋予外部App一种能力,使得外部App可以如同当前App一样的执行pendingintent里的 Intent, 就算在执行时当前App已经不存在了,也能通过存在pendingintent里的Context照样执行Intent。另外还可以处理intent执行后的操作。常和alermanger 和notificationmanager一起使用。
Intent一般是用作Activity、Sercvice、BroadcastReceiver之间传递数据,而Pendingintent,一般用在 Notification上,可以理解为延迟执行的intent,PendingIntent是对Intent一个包装。

(2)执行过程

      进程A创建PendingIntent,发送给进程B,进程B此事并不执行,直到用户出发某一事件时,包裹被拆开,里面的Intent真正执行。所以Intent什么时候被执行是不知道的,由用户出发事件来决定,整个过程类似回调函数的原理。

(3)创建

有三种方法创建PendingIntent:

getActivity(Context context,int requestCode,Intent intent,int flags)        这时的PendingIntent作用是启动一个新的Activity

getBroadcast(Context context,int requestCode,Intent intent,int flags)   这时的PendingIntent作用是发送一个广播

getService(Context context,int requestCode,Intent intent,int flags)       这时的PendingIntent作用是启动一个Service

3.RemoteViews

(1)RemoteViews表示了一系列view对象,即AppWidget所有的控件。

(2)RemoteViews所标示的对象都运行在另外的进程中。

(3)应用

      RemoteViews.setOnClickPendingIntent(R.id.widgetButtonId,pendingIntent);      //第一个参数就是需要绑定的控件,

                                                                                                                                 //第二个参数是点击后触发执行的PendingIntent。

4.为控件绑定监听器的实现(点击按钮,开启新的Activity)

   @Override 

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 

            int[] appWidgetIds) {      //appWidgetManager用来管理appWidget,而appWidgetIds[]指的是,每当新建一个appWidget,

                                                  //系统就会给新建的appWidget一个ID,而这个数组中储存的就是这些ID。

        // TODO Auto-generated method stub  

        final int N = appWidgetIds.length; 

        for (int i = 0; i < N; i++) { 

         //创建Intent 对象

         Intent intent=new Intent(context,TargetActivity,.class);

         //创建PendingIntent  对象,即把intent装进pendingIntent中

         PendingIntent  pendingIntent=new PendingIntent.getActivity(context,0,intent,0);

         //通过布局文件得到RemoteViews 对象

         RemoteViews remoteViews=new RemoteViews (context.getPackageName,R.layout.my_AppWidget);

         //绑定监听事件,即当widgetButtonId控件有onClick事件时,会执行pendingIntent(就是之前所说的拆邮包)

         remoteViews.setOnClickPendingIntent(R.id.widgetButtonId,pendingIntent);

         //使用appWidgetManager更新AppWidge。第一个参数指明更新的是哪一个appWidgetId,第二个参数指明了更新的远程Views。

         appWidgetManager.updateAppWidget(appWidgetIds[i],remoteViews);  

        } 

         super.onUpdate(context,appWidgetManager,appWidgetIds);

    } 

六.接收AppWidget中的广播(AppWidget与AppWidgetProvider的互动)

1.机制

      其实,AppWidgetProvider就是一个广播接收器。在AppWidgetProvider中,pendingIntent传来后由onReceive方法接收,之后检查intent对象中的action,由action来决定分发给哪一个函数。Android默认设置了四种action,对应了除onReceive外剩下的四种方法。因此,我们可以理解为AppWidgetProvider中的方法其实又依赖于onReceive。

2.实现步骤

(1)在AndroidManifest.xml中为AppWidgetProvider注册intent-filter,如前介绍。

(2)使用getBroadcast方法创建一个PendingIntent对象。

(2)为AppWidget中的控件注册处理器(即绑定监听器)。

(4)在onReceive方法中接收广播消息。

3.代码示例(本人写的更新播放按钮的WIDGET)

  @Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
   int[] appWidgetIds) {
  Log.i("info", "onUpdate...");
  RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidgetlayout);
  /*设置播放键的动作*/
  views.setImageViewResource(R.id.playButton, R.drawable.play_selecor);
  Intent playIntent = new Intent(PLAY_ACTION);

  //设置pendingIntent的作用
  PendingIntent playPending = PendingIntent.getBroadcast(context, 0, playIntent, 0);
  views.setOnClickPendingIntent(R.id.playButton, playPending);
  /*设置上一首按钮的动作*/
  Intent lastIntent = new Intent(lAST_ACTION);
  PendingIntent lastPending = PendingIntent.getBroadcast(context, 0, lastIntent, 0);
  views.setOnClickPendingIntent(R.id.lastButton, lastPending);
  /*设置下一首按钮的动作*/
  Intent nextIntent = new Intent(NEXT_ACTION);
  PendingIntent nextPending = PendingIntent.getBroadcast(context, 0, nextIntent, 0);
  views.setOnClickPendingIntent(R.id.nextButton, nextPending);
 
  /*获取正在播放的音乐名*/
  Intent intent = new Intent();
  intent.setAction(START_APP);
  context.sendBroadcast(intent);
   //使用appWidgetManager更新AppWidge。第一个参数指明更新的是哪一个appWidgetId,第二个参数指明了更新的远程Views。
  appWidgetManager.updateAppWidget(appWidgetIds, views);
}

      之后覆写onReceive方法,实现接收广播后需要执行的操作即可(如“七”将要介绍)。当点击button时,会触发pendingIntent的执行,这时候会发送一个广播,而onReceive会接收广播并执行相应操作。

七.更新AppWidget中控件的状态

1.AppWidget中的更新操作是使用RemoteViews的一系列方法进行的。(比如更换图片:RemoteViews.setImageViewResource等)

2.更新后应记得使用AppWidgetManager通知AppWidget进行更新。

3.代码示例

说明:这里实现的即是点击某按钮,发送一个广播,在onReceive方法里实现更新操作,即需要覆写onReceive方法。

@Override
public void onReceive(Context context, Intent intent) {
  RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidgetlayout);
  if (intent.getAction().equals("music.dreamer.pause")){
   views.setImageViewResource(R.id.playButton, R.drawable.play_selecor);
  } else if (intent.getAction().equals("music.dreamer.play")){

//将id为playButton的控件中的图片更新为pause_selecor

   views.setImageViewResource(R.id.playButton, R.drawable.pause_selecor);
  } else if (intent.getAction().equals("music.dreamer.musictitle")){
   String musicName = intent.getExtras().getString("title");
   if (musicName.length()>6){
    musicName = musicName.substring(0, 5)+"...";
   }
   views.setTextViewText(R.id.title, musicName);
  }
  AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        ComponentName componentName = new ComponentName(context,AppWidget.class);

      //通知AppWidgetProvider更新
        appWidgetManager.updateAppWidget(componentName, views);
  Log.i("info", "onReceive...");
  super.onReceive(context, intent);
}
分享到:
评论

相关推荐

    Android天气预报widget的设计与实现毕业论文

    第4章 天气预报WIDGET的设计 19 4.1 网络功能实现 19 4.1.1 标准Java接口 19 4.1.2 Apache接口 20 4.1.3 使用Java接口连接网络 23 4.2 XML解析的实现 23 4.3 制作WIDGET应用程序 27 4.3.1 源文件组织 29 4.3.2 类...

    Widget应用程序设计与实现[定义].pdf

    【Widget应用程序设计与实现】 Widget应用程序,又称为桌面小工具,是近年来在个人电脑和移动设备上广泛应用的一种轻量级应用程序。它们以小巧、便捷、高效的特点,为用户提供了丰富的功能,如天气预报、时钟、日历...

    jQuery widget设计文档

    6. **主题和样式**:介绍如何与jQuery UI的主题系统集成,使组件可以无缝地融入到不同的页面设计中。 接下来,`AWD Widget Guidelines.docx`可能涵盖了更具体的开发指导,如“先进、可工作、可发现”的原则。这些...

    Android应用源码Widget炫酷特效 (宏基扇子型效果-IT计算机-毕业设计.zip

    本项目“Android应用源码Widget炫酷特效 (宏基扇子型效果)”显然着重于展示一种独特且吸引人的Widget设计,即“宏基扇子型效果”。这种效果通常涉及到动态的动画和视觉元素,为用户提供一种新颖的交互体验。 1. **...

    基于Android平台的App Widget设计与实现.pdf

    【App Widget设计与实现】 Android平台上的App Widget是桌面小部件的一种形式,它允许开发者创建可在用户主屏幕上显示和交互的轻量级组件。这些组件通常提供应用的主要功能的快捷方式或者简化的视图,无需打开整个...

    Android应用源码之android Widget小组件开发-IT计算机-毕业设计.zip

    在Android应用开发中,Widget小组件是用户界面的重要组成部分,它们允许用户在主屏幕上与应用程序进行交互,而无需实际打开应用。本项目是针对Android Widget小组件开发的一个毕业设计示例,适合学习和理解Android...

    应用创建AppWidget的小demo

    3. **布局文件**: 创建一个XML布局文件(如`app_widget_layout.xml`)来设计AppWidget的界面。这通常包含一些View组件,如TextView、Button等,这些组件将显示在主屏幕上。 4. **更新机制**: 由于AppWidget不能像...

    widget

    5. **发布与更新**: 将Widget打包成可安装包,发布到应用市场或者自定义渠道,后期根据用户反馈进行迭代更新。 **Widget的应用场景** 1. **桌面小部件**: 在桌面环境下,Widget可以提供天气预报、日历、新闻速览等...

    Android应用源码之Android小部件AppWidget.zip项目安卓应用源码下载

    Android应用源码之Android小部件AppWidget.zip项目安卓应用源码下载Android应用源码之Android小部件AppWidget.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术...

    Android高级应用源码-android Widget小组件开发.rar

    用户可以直接在主屏幕上与Widget交互,而无需打开完整的应用程序。Widget可以显示静态信息,如天气预报,也可以动态更新,如音乐播放器控制。 二、Widget的组成 1. AppWidgetProvider:这是Widget的核心类,继承自...

    android axure widget包

    对于Android开发者来说,使用Axure制作Widget原型可以帮助他们在设计阶段更好地理解和规划应用界面。这个“android axure widget包”就是一组专门针对Android平台的Axure组件库,由用户自己制作并分享。 标题中的...

    Widget 应用实例

    5. **布局与视图**:展示了如何设计Widget的UI,使用RemoteViews来操作Widget的视图元素。 6. **用户交互**:讲解了如何处理Widget上的按钮点击和其他交互,通过PendingIntent将用户操作传递回应用程序。 7. **...

    Android平台天气预报widget的设计与实现毕业论文.doc

    "Android平台天气预报Widget的设计与实现" Android 平台天气预报 Widget 的设计与实现是基于 Android 平台的开发技术的研究和分析。本文首先介绍了 Android 开发所需的基础知识,然后详细介绍了软件的具体实现过程...

    Android平台天气预报widget的设计与实现毕业论文

    本文首先介绍了Android开发的基础知识,包括系统架构、应用程序设计和开发工具,然后详细阐述了软件的具体实现过程,包括网络接口的使用、XML数据的获取与解析以及widget的制作技术。 1. 项目背景: 随着移动设备的...

    amixer与widget、controls

    ### amixer、Widget与Controls详解 #### 一、概述 在深入探讨`amixer`、`widget`以及`controls`之前,我们先来简要了解一下它们的基本概念。 - **amixer**:`amixer`是ALSA (Advanced Linux Sound Architecture) ...

    Android应用源码之Android小部件AppWidget-IT计算机-毕业设计.zip

    7. **毕业设计应用** - **应用场景**:例如,天气预报小部件、日程提醒小部件、音乐播放控制器等,可以提高用户体验,让用户快速访问功能。 - **论文撰写**:可以从设计思路、实现技术、用户交互等方面阐述App...

    widget现状分析报告(移动widget)

    - **整合服务**:与热门应用和服务合作,将Widget作为内容和服务的入口。 总结,移动Widget在提供便捷信息获取和交互方面具有显著优势,但需不断适应用户需求变化和技术进步,以保持其在移动互联网中的活力和吸引...

    web技术深入交流:Widget技术及其在资源个性化获取的应用

    Web技术在不断发展,Widget技术作为其中的一支重要力量,为网页和应用程序的交互与个性化提供了新的解决方案。在本文中,我们将深入探讨Widget技术的核心概念、工作原理,以及它如何应用于资源个性化获取,以提升...

    appWidget启动Service

    在Android开发中,AppWidget是桌面小部件,它允许用户在主屏幕上与应用程序进行交互,而无需实际打开应用。Service是Android系统中的一个组件,它可以在后台长时间运行,执行一些耗时的操作,如音乐播放、数据同步等...

    Android课程设计Widget电池插件

    在Android平台上,Widget是应用程序的一种轻量级交互方式,它可以在用户的主屏幕上提供实时信息或者简单操作,无需打开完整应用。本课程设计的主题是“Android课程设计Widget电池插件”,旨在让学生掌握如何创建一个...

Global site tag (gtag.js) - Google Analytics