`
quanminchaoren
  • 浏览: 926740 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android:AppWidget,PendingIntent,RemoteViews用法

阅读更多

什么是AppWidget?AppWidget就是我们平常在桌面上见到的那种一个个的小窗口,利用这个小窗口可以给用户提供一些方便快捷的操作。本篇打算从以下几个点来介绍AppWidget:

      1.如何创建一个简单的AppWidget

      2.如何使得AppWidget与客户端程序交互

下面我们来创建一个简单的AppWidget

1、定义AppWidgetProviderInfor:在res/xml文件夹中定义一个名为 :example_appwidget_info.xml,这个名字随便取。它是提供AppWidget元数据;设置在桌面上显示的大小 

example_appwidget_info.xml

 

  1. < appwidget-provider   xmlns:android = "http://schemas.android.com/apk/res/android"   
  2.     android:minWidth = "294dp"   
  3.     android:minHeight = "72dp"   
  4.     android:updatePeriodMillis = "86400000"   
  5.     android:initialLayout = "@layout/example_appwidget" >   
  6.     <!-- initiallayout设置引用 的布局文件 -->   
  7.  </ appwidget-provider >   

2、为App Widget指定样式和布局;在桌面上显示的内容,布局,就像main.xml布局一样,做为example_appwidget_info.xml的 initialLayout参数的值,用这个布局文件来初始化example_appwidget_info.xml。

 

  1. <?xml version= "1.0"  encoding= "utf-8" ?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  3.     android:orientation="vertical"   
  4.     android:layout_width="fill_parent"   
  5.     android:layout_height="fill_parent"   
  6.     >  
  7. <TextView    
  8.     android:id="@+id/widgetTextId"   
  9.     android:layout_width="fill_parent"    
  10.     android:layout_height="wrap_content"    
  11.     android:text="firstWidgetText"   
  12.     android:background="#000000"   
  13.     />  
  14. </LinearLayout>  

3、实现继承AppWidgetProvider这个类;

这个类有五个方法:都需要继承:(下面按照当第一次加载Widget到删除的时候,这些方法运行的顺序)

1、onReceive (Context  context, Intent  intent)   Implements onReceive(Context, Intent)  to dispatch calls to the various other methods on AppWidgetProvider.

2、onEnabled (Context  context)  Called in response to the ACTION_APPWIDGET_ENABLED  broadcast when the a AppWidget for this provider is instantiated. Override this method to implement your own AppWidget functionality.

3、onUpdate (Context  context, AppWidgetManager  appWidgetManager, int[] appWidgetIds)  Called in response to the ACTION_APPWIDGET_UPDATE  broadcast when this AppWidget provider is being asked to provide RemoteViews  for a set of AppWidgets. Override this method to implement your own AppWidget functionality.

4、onDeleted (Context  context, int[] appWidgetIds)  Called in response to the ACTION_APPWIDGET_DELETED  broadcast when one or more AppWidget instances have been deleted. Override this method to implement your own AppWidget functionality.

5、onDisabled (Context  context)  Called in response to the ACTION_APPWIDGET_DISABLED  broadcast, which is sent when the last AppWidget instance for this provider is deleted. Override this method to implement your own AppWidget functionality.

基中onReceive负责进行接受广播,控制运行哪一个函数,每一个操作都会首先运行这个方法,再调用其它的方法。所以在Widget一次加载到删除过程中,onReceive会执行4次;

如下图:注意message


下面看代码: ExampleAppWidgetProvider.java

 

  1. public   class  ExampleAppWidgetProvider  extends  AppWidgetProvider {  
  2.     @Override   
  3.     public   void  onUpdate(Context context, AppWidgetManager appWidgetManager,  
  4.             int [] appWidgetIds) {  
  5.         System.out.println("onupdate" );  
  6.         super .onUpdate(context, appWidgetManager, appWidgetIds);  
  7.     }  
  8.   
  9.     @Override   
  10.     public   void  onDeleted(Context context,  int [] appWidgetIds) {  
  11.         System.out.println("onDeleted" );  
  12.         super .onDeleted(context, appWidgetIds);  
  13.     }  
  14.   
  15.     @Override   
  16.     public   void  onDisabled(Context context) {  
  17.         System.out.println("onDisabled" );  
  18.         super .onDisabled(context);  
  19.     }  
  20.   
  21.     @Override   
  22.     public   void  onEnabled(Context context) {  
  23.         System.out.println("onEnabled" );  
  24.         super .onEnabled(context);  
  25.     }  
  26. }  

在这个实例中,因为与Activity脱离关系,所以Activity不用更改,只是在应用系统中注册了一个与这个应用程序相关的AppWidget而已:结果:

下面再来看看如何在AppWidget中添加按钮,添加监听事件。

1、在example_appwidget_info.xml文件里添加Button迫使

2、添加TargetActivity

只是用来响应点击事件,在此例中没有实际意义

  1. public   class  TargetActivity  extends  Activity {  
  2.     @Override   
  3.     protected   void  onCreate(Bundle savedInstanceState) {  
  4.         super .onCreate(savedInstanceState);  
  5.         setContentView(R.layout.main);  
  6.     }  
  7. }  

3、在AndroidManifest.xml文件注册TargetActivity

4、重写ExampleAppWidgetProvider类的onUpdate方法,在第一次创建WidGet的时候,向按钮添加监听。并用PendingIntent,和RemoteView两个类,对事件进行处理;

 

  1. public   void  onUpdate(Context context, AppWidgetManager appWidgetManager,  
  2.             int [] appWidgetIds) {  
  3.         System.out.println("onupdated" );  
  4.   
  5.         for  ( int  i =  0 ; i <appWidgetIds.length; i++) {  
  6.             System.out.println(appWidgetIds[i]);  
  7.             //创建一个Intent对象   
  8.             Intent intent = new  Intent(context,TargetActivity. class );  
  9.             //创建一个PendingIntent(有四种方法获取)   
  10.             PendingIntent pendingIntent = PendingIntent.getActivity(context, 0 , intent,  0 );  
  11.             RemoteViews remoteViews = new  RemoteViews(context.getPackageName(),R.layout.example_appwidget);  
  12.             //为按钮绑定事件处理器   
  13.             //第一个参数用来指定被绑定处理器的控件的ID   
  14.             //第二个参数用来指定当事件发生时,哪个PendingIntent将会被执行   
  15.             remoteViews.setOnClickPendingIntent(R.id.widgetButton, pendingIntent);  
  16.             //更新AppWidget   
  17.             //第一个参数用于指定被更新AppWidget的ID   
  18.             appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);  
  19.         }  
  20.         super .onUpdate(context, appWidgetManager, appWidgetIds);  
  21.     }  

 

Called in response to the ACTION_APPWIDGET_DELETED  broadcast when one or more AppWidget instances have been deleted. Override this method to implement your own AppWidget functionality.


在实际应用在AppWidget更多的是利用广播机制Action进行处理的;下面我们来看看如何利用广播机制,单击改变AppWidget的内容;在上例 的基础上进行扩展:

1、AppWidget的布局文件:widget01.xml

  1. <? xml   version = "1.0"   encoding = "utf-8" ?>   
  2. < LinearLayout   xmlns:android = "http://schemas.android.com/apk/res/android"   
  3.     android:orientation = "vertical"   
  4.     android:layout_width = "fill_parent"   
  5.     android:layout_height = "fill_parent"   
  6.     >   
  7. < Button   android:id = "@+id/widgetButton"   
  8.     android:layout_width = "fill_parent"   
  9.     android:layout_height = "wrap_content"   
  10.     android:text = "@string/widget_button" />   
  11.       
  12. < TextView   android:id = "@+id/test_text"   
  13.     android:layout_width = "fill_parent"   
  14.     android:layout_height = "wrap_content"   
  15.     android:text = "@string/test_text"   
  16.     android:gravity = "center"   
  17.     android:textColor = "#fff" />   
  18. </ LinearLayout >   

其中的Button控件是测试按钮,TextView用来反应单击Button之后显示的内容变化;(这是给Button添加监听器,再利用Action广播。收onRecerve接收,做出动作)

2、修改AndroidManifest.xml

在Reservi里添加action,注册事件

  1. < receiver   android:name = "ExampleAppWidgetProvider" > <!--如果action匹配成功,就在此类中进行处理-->   
  2.     < intent-filter >   
  3.         <!--利用广播机制接收,onUpdate会接收广播。查看源码可收得知  Called in response to the ACTION_APPWIDGET_UPDATE   
  4.             broadcast when this AppWidget provider is being asked to provide RemoteViews   
  5.             for a set of AppWidgets. Override this method to implement your own AppWidget   
  6.             functionality. 这个也必须要,不然onRecerve不会调用 。-->   
  7.         <!--这是自定义的Action事件--> < action   android:name = "android.appwidget.action.APPWIDGET_UPDATE" />   
  8.         < action   android:name = "learn.test.UPDATE_APP_WIDGET" />   
  9.     </ intent-filter >   
  10.     < meta-data   android:name = "android.appwidget.provider"   android:resource = "@xml/widget_test"   />   
  11. </ receiver >   

3、修改ExampleAppWidgetProvider.java代码文件,如下:

  1. public   class  ExampleAppWidgetProvider  extends  AppWidgetProvider {  
  2.     //定义一个常量字符串,该常量用于命名Action   
  3.     private   static   final  String UPDATE_ACTION =  "learn.test.UPDATE_APP_WIDGET" ;  
  4.       
  5.     @Override   
  6.     public   void  onDeleted(Context context,  int [] appWidgetIds) {  
  7.         // TODO Auto-generated method stub   
  8. System.out.println("onDeleted" );  
  9.         super .onDeleted(context, appWidgetIds);  
  10.     }  
  11.   
  12.     @Override   
  13.     public   void  onDisabled(Context context) {  
  14.         // TODO Auto-generated method stub   
  15. System.out.println("onDisabled" );  
  16.         super .onDisabled(context);  
  17.     }  
  18.   
  19.     @Override   
  20.     public   void  onEnabled(Context context) {  
  21.         // TODO Auto-generated method stub   
  22. System.out.println("onEnabled" );  
  23.         super .onEnabled(context);  
  24.     }  
  25.   
  26.     @Override   
  27.     public   void  onReceive(Context context, Intent intent) {  
  28.         // TODO Auto-generated method stub   
  29. System.out.println("onReceive" );  
  30.   
  31.         String action = intent.getAction();  
  32.         if  (UPDATE_ACTION.equals(action)) {  
  33.             RemoteViews remoteViews = new  RemoteViews(context.getPackageName(),  
  34.                     R.layout.widget01);  
  35.             remoteViews.setTextViewText(R.id.test_text, "this is OnReceive" );  
  36.             //getInstance(Context context)  Get the AppWidgetManager instance to use for the supplied Context object.静态方法。   
  37.             AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);  
  38.               
  39.             ComponentName componentName = new  ComponentName(context,ExampleAppWidgetProvider. class );  
  40.             appWidgetManager.updateAppWidget(componentName, remoteViews);  
  41.         } else  {  
  42.             super .onReceive(context, intent); 这里一定要添加,eles部分,不然,onReceive不会去调用其它的方法。但是如果把这条语句放在外面,就会每次运行 onUpdate,onDeleted等方法,就会运行两次,因为UPDATE_ACTION.equals(action)配置成功会运行一 次,uper.onReceive(context, intent)配置成功又会运行一次,后都是系统自定义的。  
  43.         }  
  44.     }  
  45.   
  46.     @Override   
  47.     public   void  onUpdate(Context context, AppWidgetManager appWidgetManager,  
  48.             int [] appWidgetIds) {  
  49.         // TODO Auto-generated method stub   
  50. System.out.println("onUpdated" );  
  51.   
  52. //创建一个Intent对象   
  53.         Intent intent = new  Intent();  
  54.         //为Intent对象设置Action   
  55.         intent.setAction(UPDATE_ACTION);  
  56.         //使用getBroadcast方法,得到一个PendingIntent对象,当该对象执行时,会发送一个广播   
  57.         PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0 ,  
  58.                 intent, 0 );  
  59.         RemoteViews remoteViews = new  RemoteViews(context.getPackageName(),  
  60.                 R.layout.widget01);  
  61.           
  62.         remoteViews.setOnClickPendingIntent(R.id.widgetButton, pendingIntent);  
  63.         appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);  
  64.         super .onUpdate(context, appWidgetManager, appWidgetIds);  
  65.     }  
  66.       

分享到:
评论
1 楼 liurui89 2012-05-29  

相关推荐

    android之appwidget(一)简单appwidget

    布局文件可以包含文本、图片、按钮等组件,但需要注意的是,由于AppWidget运行在单独进程中,因此不能直接引用Activity中的资源,而应使用RemoteViews对象来操作这些组件。 例如,一个简单的AppWidget布局文件可能...

    appWidget启动Activity

    本篇文章将深入探讨如何使用`appWidget`来启动一个`Activity`。 首先,我们需要了解`appWidget`的基本构成。一个`appWidget`通常包含一个或多个`RemoteViews`,它们是显示在主屏幕上的视图组件。`RemoteViews`允许...

    android之appwidget(二)启动新activity

    2. **将PendingIntent设置到RemoteViews**: 创建了PendingIntent后,我们需要将其关联到AppWidget中的某个视图,通常是Button或其他可点击的控件。例如: ```java RemoteViews views = new RemoteViews(context....

    Android App Widget 开发

    &lt;appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="40dp" android:minHeight="40dp" android:updatePeriodMillis="1800000" &lt;!-- 更新间隔,单位为毫秒 --&gt; ...

    android AppWidget ListView

    总结,`android AppWidget ListView`的使用涉及到AppWidget框架、RemoteViews、ListView与Adapter的结合以及事件处理等多个核心概念。通过源码学习,可以深入理解这些组件的协同工作方式,提升Android开发技能。

    Android AppWidget实例验证

    在该类中,重写`onUpdate()`方法以在AppWidget被添加或更新时更新其UI。例如,我们可以在按钮点击时更新文本视图的内容: ```java public class AppWidgetProvider extends AppWidgetProvider { @Override ...

    appwidget的简单使用

    **AppWidget的简单使用** AppWidget是Android系统提供的一种组件,允许开发者在用户的主屏幕上创建小型、可交互的应用程序小部件。这些小部件无需用户直接启动应用,就能展示实时信息或者提供快速操作入口,极大地...

    创建appWidget

    由于AppWidget运行在系统进程中,你需要通过`PendingIntent`和`BroadcastReceiver`来异步更新AppWidget的内容。例如,可以定期从服务器获取新数据,或者响应特定事件进行更新。 以上就是创建一个基本AppWidget的...

    android app widget demo

    在"appwidget"这个压缩包文件中,可能包含了示例代码和资源文件,供开发者学习如何实现上述功能。通过研究这些文件,你可以更好地理解App Widget的工作原理和实现细节,从而在自己的项目中创建出富有特色的桌面小...

    Pro Android学习:widget小例子

    &lt;action android:name="android.appwidget.action.APPWIDGET_UPDATE" /&gt; android:name="android.appwidget.provider" android:resource="@xml/widget_info" /&gt; ``` `&lt;meta-data&gt;`标签里的`@xml/widget_info`...

    android app widget 介绍

    App Widget 的概念 一个简单的App Widget例子 PendingIntent的使用 RemoteViews的使用 接收来自App Widget的广播 更新App Widget的控件状态

    Android高级应用源码-Android小部件AppWidget.zip

    在Android平台上,AppWidget是应用程序可以提供的一种桌面小部件,让用户在主屏幕上获得快速的交互体验,无需打开完整的应用程序。这个“Android高级应用源码-Android小部件AppWidget.zip”包含了一个关于如何创建和...

    app widget

    - **RemoteViewsService**:当 AppWidget 需要展示更复杂的数据结构时(如 ListView 或 GridView),可以使用此服务提供数据。它继承自 Service 类,同样需要在 AndroidManifest.xml 文件中声明。 - **...

    Android应用源码之Android小部件AppWidget.zip

    这个"Android应用源码之Android小部件AppWidget.zip"的源代码示例将帮助你理解并实践如何创建一个功能丰富的Android小部件,通过学习和分析源代码,你可以掌握AppWidget的原理和实现方法,进一步提升你的Android开发...

    AndroidStudio简单实现单击Widget打开Activity

    &lt;appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="40dp" android:minHeight="40dp" android:updatePeriodMillis="0" android:initialLayout="@layout/widget...

    AppWidget的getBroadcast

    本篇文章将深入探讨AppWidget下`getBroadcast`的使用以及其在Android系统中的工作原理。 首先,让我们理解什么是`getBroadcast`。在Android的`PendingIntent`类中,`getBroadcast`方法是用来创建一个PendingIntent...

    安卓Android源码——安卓Android小部件AppWidget.rar

    在安卓平台上,AppWidget是Android系统提供的一种轻量级组件,允许开发者在用户的主屏幕上创建交互式的迷你应用程序,也就是我们通常所说的桌面小部件。这个压缩包"安卓Android源码——安卓Android小部件AppWidget....

    Android小部件AppWidget

    在这个方法中,你可以调用AppWidgetManager的updateAppWidget()方法,传入AppWidget实例ID和新的远程视图(RemoteViews)对象,来改变小部件的显示内容。 - 另外,可以设定一个AlarmManager定时触发更新,或者监听...

    Android AppWidgetProvider使用简例

    在Android平台上,AppWidgetProvider是实现桌面小工具(AppWidget)功能的核心类。...通过这个简单的实例,我们可以了解到Android AppWidget的基本用法,为进一步开发更复杂、功能丰富的桌面小工具打下基础。

    Android窗口小工具

    重写`onUpdate()`方法,在其中使用`AppWidgetManager`和`RemoteViews`更新AppWidget的界面。例如: ```java public class AppWidgetTest1 extends AppWidgetProvider { @Override public void onUpdate(Context ...

Global site tag (gtag.js) - Google Analytics