Android Widget之桌面组件App Widget案例

本文通过一个实战案例介绍了如何使用Android的AppWidget组件实现桌面组件的功能。案例中详细展示了如何让AppWidget在被点击后文本内容发生变化的过程,包括布局文件、清单文件的配置及关键代码的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android Widget之桌面组件App Widget案例


    Android Widget之桌面组件App Widget案例是本文要介绍的内容,主要Android Widget组件的学习教程,具体内容来看本文详解。

    模拟一个案例:把AppWidget添加到桌面后,点击AppWidget后AppWidget文本会轮回改变

    main.xml布局文件

       
    1. <?xml version="1.0" encoding="utf-8"?> 
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    3.     android:orientation="vertical" android:layout_width="fill_parent" 
    4.     android:layout_height="fill_parent"> 
    5.     <TextView android:id="@+id/tv" 
    6.         android:layout_width="fill_parent" 
    7.         android:layout_height="wrap_content"   
    8.         android:text="程序入口"   
    9.         android:textSize="50dip"/> 
    10. </LinearLayout> 
    11.  
    12. res/xml/my_appwidget.xml布局文件  
    13.  
    14. <?xml version="1.0" encoding="utf-8"?> 
    15. <appwidget-provider 
    16.     xmlns:android="http://schemas.android.com/apk/res/android" 
    17.     android:minWidth="120dp"   
    18.     android:minHeight="60dp" 
    19.     android:updatePeriodMillis="1000" 
    20.     android:initialLayout="@layout/main"> 
    21. </appwidget-provider> 

    清单文件

       
    1. <?xml version="1.0" encoding="utf-8"?> 
    2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    3.     package="com.ljq.activity" android:versionCode="1" 
    4.     android:versionName="1.0"> 
    5.     <application android:icon="@drawable/icon" 
    6.         android:label="@string/app_name"> 
    7.         <receiver android:name=".TestActivity"> 
    8.             <meta-data android:name="android.appwidget.provider" 
    9.                 android:resource="@xml/my_appwidget"> 
    10.             </meta-data> 
    11.             <intent-filter> 
    12.                 <action android:name="COM.LJQ.ACTION.WIDGET.CLICK"></action> 
    13.                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
    14.             </intent-filter> 
    15.         </receiver> 
    16.     </application> 
    17.     <uses-sdk android:minSdkVersion="7" /> 
    18.  
    19. </manifest> 

    变量类UtilTool:用来控件文本改变

       
    1. package com.ljq.activity;  
    2.  
    3. public class UtilTool {  
    4.     public static boolean isChange=true;  
    5. }  
    6.  
    7. TestActivity类,继承自AppWidgetProvider  
    8.  
    9. package com.ljq.activity;  
    10.  
    11. import android.app.PendingIntent;  
    12. import android.appwidget.AppWidgetManager;  
    13. import android.appwidget.AppWidgetProvider;  
    14. import android.content.ComponentName;  
    15. import android.content.Context;  
    16. import android.content.Intent;  
    17. import android.widget.RemoteViews;  
    18.  
    19. public class TestActivity extends AppWidgetProvider {  
    20.     // 自定义一个Action名  
    21.     private static final String ACTION_CLICK_NAME = "COM.LJQ.ACTION.WIDGET.CLICK";  
    22.     private RemoteViews rv;  
    23.  
    24.     @Override  
    25.     public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {  
    26.         System.out.println("onUpdate");  
    27.         //获取R.layout.main布局,通过类RemoteViews对布局R.layout.main里的控件进行操作  
    28.         /*rv = new RemoteViews(context.getPackageName(), R.layout.main);  
    29.         Intent intentClick = new Intent(ACTION_CLICK_NAME);  
    30.         PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentClick, 0);  
    31.         rv.setOnClickPendingIntent(R.id.tv, pendingIntent);  
    32.           
    33.         ComponentName cmp = new ComponentName(context, TestActivity.class);  
    34.         AppWidgetManager myAppWidgetManager = AppWidgetManager.getInstance(context);  
    35.         myAppWidgetManager.updateAppWidget(cmp, rv);*/  
    36.         final int N = appWidgetIds.length;  
    37.         for (int i = 0; i < N; i++) {  
    38.             int appWidgetId = appWidgetIds[i];  
    39.             updateAppWidget(context, appWidgetManager, appWidgetId);  
    40.         }  
    41.       
    42.     }  
    43.       
    44.     //AppWidget生命周期: 每接收一次,广播执行一次为一个生命周期结束。  
    45.     //也就是说在重写AppWidgetProvider类里面声明全局变量做状态判断,  
    46.     //每次状态改变AppWidgetProvider再接收第二次广播时即为你重新初始化也就是说重新实例化了一次AppWidgetProvider。  
    47.     //今天我因为在里面放了一个boolean值初始化为true,观察调试看到每次进入都为TRUE故你在设置桌面组件时,  
    48.     //全局变量把它声明在另外一个实体类用来判断是没问题的,切忌放在本类。  
    49.     @Override  
    50.     public void onReceive(Context context, Intent intent) {  
    51.         System.out.println("onReceive");  
    52.         if (rv == null) {  
    53.             rv = new RemoteViews(context.getPackageName(), R.layout.main);  
    54.         }  
    55.         if (intent.getAction().equals(ACTION_CLICK_NAME)) {  
    56.             if (UtilTool.isChange) {  
    57.                 rv.setTextViewText(R.id.tv, "abc");  
    58.             } else {  
    59.                 rv.setTextViewText(R.id.tv, "123");  
    60.             }  
    61.             UtilTool.isChange = !UtilTool.isChange;  
    62.             AppWidgetManager appWidgetManger = AppWidgetManager.getInstance(context);  
    63.             int[] appIds = appWidgetManger.getAppWidgetIds(new ComponentName(context, TestActivity.class));  
    64.             appWidgetManger.updateAppWidget(appIds, rv);  
    65.         }else{  
    66.             super.onReceive(context, intent);  
    67.         }  
    68.           
    69.     }  
    70.       
    71.     private void updateAppWidget(Context context,  
    72.             AppWidgetManager appWidgeManger, int appWidgetId) {  
    73.         rv = new RemoteViews(context.getPackageName(), R.layout.main);  
    74.         Intent intentClick = new Intent();  
    75.         intentClick.setAction(ACTION_CLICK_NAME);  
    76.         PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentClick, 0);  
    77.         rv.setOnClickPendingIntent(R.id.tv, pendingIntent);  
    78.         appWidgeManger.updateAppWidget(appWidgetId, rv);  
    79.     }  

    小结:Android Widget之桌面组件App Widget案例的内容介绍完了,希望通过Android Widget组件的应用内容的学习能对你有所帮助。

    【编辑推荐】

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值