Android编程之桌面小部件AppWidgetProvider用法示例

发布时间 - 2026-01-11 02:52:06    点击率:

本文实例讲述了Android编程之桌面小部件AppWidgetProvider用法。分享给大家供大家参考,具体如下:

/**
 * 桌面小部件 AppWidget配置
 *
 * @description:
 * @author ldm
 * @date 2016-5-16 下午1:57:16
 */
public class ExampleAppWidgetConfigure extends Activity {
  static final String TAG = "ExampleAppWidgetConfigure";
  // 保存的文件名
  private static final String PREFS_NAME = "com.example.android.apis.appwidget.ExampleAppWidgetProvider";
  // 保存的字段KEY
  private static final String PREF_PREFIX_KEY = "prefix_";
  // 小部件 对应ID
  int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
  // 输入框
  EditText mAppWidgetPrefix;
  public ExampleAppWidgetConfigure() {
    super();
  }
  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setResult(RESULT_CANCELED);
    // 设置布局
    setContentView(R.layout.appwidget_configure);
    mAppWidgetPrefix = (EditText) findViewById(R.id.appwidget_prefix);
    // 设置监听
    findViewById(R.id.save_button).setOnClickListener(mOnClickListener);
    // 获取intent传递过来的数据
    Intent intent = getIntent();
    Bundle extras = intent.getExtras();
    if (extras != null) {
      mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
          AppWidgetManager.INVALID_APPWIDGET_ID);
    }
    if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
      finish();
    }
    mAppWidgetPrefix.setText(loadTitlePref(ExampleAppWidgetConfigure.this,
        mAppWidgetId));
  }
  View.OnClickListener mOnClickListener = new View.OnClickListener() {
    public void onClick(View v) {
      final Context context = ExampleAppWidgetConfigure.this;
      String titlePrefix = mAppWidgetPrefix.getText().toString();
      //保存到SharedPreferences文件
      saveTitlePref(context, mAppWidgetId, titlePrefix);
      AppWidgetManager appWidgetManager = AppWidgetManager
          .getInstance(context);
      //更新小部件
      ExampleAppWidgetProvider.updateAppWidget(context, appWidgetManager,
          mAppWidgetId, titlePrefix);
      Intent resultValue = new Intent();
      resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
          mAppWidgetId);
      setResult(RESULT_OK, resultValue);
      finish();
    }
  };
  static void saveTitlePref(Context context, int appWidgetId, String text) {
    SharedPreferences.Editor prefs = context.getSharedPreferences(
        PREFS_NAME, 0).edit();
    prefs.putString(PREF_PREFIX_KEY + appWidgetId, text);
    prefs.commit();
  }
  static String loadTitlePref(Context context, int appWidgetId) {
    SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
    String prefix = prefs.getString(PREF_PREFIX_KEY + appWidgetId, null);
    if (prefix != null) {
      return prefix;
    } else {
      return context.getString(R.string.appwidget_prefix_default);
    }
  }
  static void deleteTitlePref(Context context, int appWidgetId) {
  }
  static void loadAllTitlePrefs(Context context,
      ArrayList<Integer> appWidgetIds, ArrayList<String> texts) {
  }
}

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="vertical" >
  <TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="This text will be shown before the date in our example widget." />
  <EditText
    android:id="@+id/appwidget_prefix"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
  <Button
    android:id="@+id/save_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@android:string/ok" />
</LinearLayout>

/**
 * AppWidgetProvider小部件广播组件使用:
 * 1, 实现AppWidgetProvider的子类,并至少override onUpdate()方法
 * 2,在AndroidManifest.xml中,声明上述的AppWidgetProvider的子类是一个Receiver,并且:
 * 该Receiver的intent-filter的Action必须包含“android.appwidget.action.APPWIDGET_UPDATE”;
 * 该Receiver的meta-data为“android.appwidget.provider”,并用一个xml文件来描述布局属性。
 * 3, 在第2点中的xml文件中描述布局属性的节点名称必须为“appwidget-provider”。
 *
 * @description:
 * @author ldm
 * @date 2016-5-16 下午1:43:31
 */
public class ExampleAppWidgetProvider extends AppWidgetProvider {
  // Log打印日志标签
  private static final String TAG = "ExampleAppWidgetProvider";
  /**
   * onUpdate() 处理AppWidgetManager.ACTION_APPWIDGET_UPDATE广播。
   * 该广播在需要AppWidgetProvider提供RemoteViews数据时
   * ,由AppWidgetService.sendUpdateIntentLocked()发出。
   */
  @Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager,
      int[] appWidgetIds) {
    Log.d(TAG, "onUpdate");
    final int N = appWidgetIds.length;
    for (int i = 0; i < N; i++) {
      //获取到id
      int appWidgetId = appWidgetIds[i];
      //设置标题
      String titlePrefix = ExampleAppWidgetConfigure.loadTitlePref(
          context, appWidgetId);
      //更新AppWidget
      updateAppWidget(context, appWidgetManager, appWidgetId, titlePrefix);
    }
  }
  /**
   * onDeleted() 处理AppWidgetManager.ACTION_APPWIDGET_DELETED广播。
   * 该广播在有该AppWidgetProvider的实例被删除时
   * ,由AppWidgetService.deleteAppWidgetLocked()发出。
   */
  @Override
  public void onDeleted(Context context, int[] appWidgetIds) {
    Log.d(TAG, "onDeleted");
    final int N = appWidgetIds.length;
    for (int i = 0; i < N; i++) {
      ExampleAppWidgetConfigure.deleteTitlePref(context, appWidgetIds[i]);
    }
  }
  /**
   * onEnabled() 处理AppWidgetManager.ACTION_APPWIDGET_ENABLED广播。
   * 该广播在该AppWidgetProvider被实例化时,由AppWidgetService.sendEnableIntentLocked()发出。
   */
  @Override
  public void onEnabled(Context context) {
    Log.d(TAG, "onEnabled");
    PackageManager pm = context.getPackageManager();
    pm.setComponentEnabledSetting(new ComponentName(
        "com.example.android.apis",
        ".appwidget.ExampleBroadcastReceiver"),
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
        PackageManager.DONT_KILL_APP);
  }
  /**
   * onDisabled() 处理AppWidgetManager.ACTION_APPWIDGET_DISABLED广播。
   * 该广播在该AppWidgetProvider的所有实例中的最后一个实例被删除时
   * ,由AppWidgetService.deleteAppWidgetLocked()发出。
   */
  @Override
  public void onDisabled(Context context) {
    Log.d(TAG, "onDisabled");
    PackageManager pm = context.getPackageManager();
    //设置组件可用
    pm.setComponentEnabledSetting(new ComponentName(
        "com.example.android.apis",
        ".appwidget.ExampleBroadcastReceiver"),
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
        PackageManager.DONT_KILL_APP);
  }
  static void updateAppWidget(Context context,
      AppWidgetManager appWidgetManager, int appWidgetId,
      String titlePrefix) {
    Log.d(TAG, "updateAppWidget appWidgetId=" + appWidgetId
        + " titlePrefix=" + titlePrefix);
    CharSequence text = context.getString(R.string.appwidget_text_format,
        ExampleAppWidgetConfigure.loadTitlePref(context, appWidgetId),
        "0x" + Long.toHexString(SystemClock.elapsedRealtime()));
    // 创建RemoteViews 对象
    RemoteViews views = new RemoteViews(context.getPackageName(),
        R.layout.appwidget_provider);
    // 设置RemoteViews 对象的文本
    views.setTextViewText(R.id.appwidget_text, text);
    // 告诉AppWidgetManager 显示 views对象给widget.
    appWidgetManager.updateAppWidget(appWidgetId, views);
  }
}

小部件布局

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/appwidget_text"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="#ffff00ff"
  android:textColor="#ff000000"
/>

public class ExampleBroadcastReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    Log.d("ExmampleBroadcastReceiver", "intent=" + intent);
    //获取广播的ACTION
    String action = intent.getAction();
    //对ACTION进行判断
    if (action.equals(Intent.ACTION_TIMEZONE_CHANGED)
        || action.equals(Intent.ACTION_TIME_CHANGED)) {
      AppWidgetManager gm = AppWidgetManager.getInstance(context);
      ArrayList<Integer> appWidgetIds = new ArrayList<Integer>();
      ArrayList<String> texts = new ArrayList<String>();
      ExampleAppWidgetConfigure.loadAllTitlePrefs(context, appWidgetIds, texts);
      final int N = appWidgetIds.size();
      for (int i=0; i<N; i++) {
        ExampleAppWidgetProvider.updateAppWidget(context, gm, appWidgetIds.get(i), texts.get(i));
      }
    }
  }
}

在AndroidManifest.xml中添加相应组件:

ExampleAppWidgetConfigure

<activity android:name=".appwidget.ExampleAppWidgetConfigure" >
  <intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
  </intent-filter>
</activity>

ExampleAppWidgetProvider

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

ExampleBroadcastReceiver

 <receiver
  android:name=".appwidget.ExampleBroadcastReceiver"
  android:enabled="false" >
  <intent-filter>
    <action android:name="android.intent.ACTION_TIMEZONE_CHANGED" />
    <action android:name="android.intent.ACTION_TIME" />
  </intent-filter>
</receiver>

开源代码:https://github.com/ldm520/ANDROID_API_DEMOS

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android基本组件用法总结》、《Android开发入门与进阶教程》、《Android布局layout技巧总结》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android资源操作技巧汇总》及《Android控件用法总结》

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


# Android  # 桌面小部件  # AppWidgetProvider  # Android使用ContentProvider初始化SDK库方案小结  # 基于Android FileProvider 属性配置详解及FileProvider多节点问题  # Android ContentProvider实现手机联系人读取和插入  # Android利用ContentProvider获取本地数据的方法  # Android7.0行为变更之适配File Provider的方法  # Android7.0中关于ContentProvider组件详解  # Android 中自定义ContentProvider与ContentObserver的使用简单实例  # Android 中ContentProvider的实例详解  # Android控件AppWidgetProvider使用方法详解  # Android实现花瓣飘落效果的步骤  # 子类  # 是一个  # 进阶  # 操作技巧  # 下午  # 相关内容  # 感兴趣  # 给大家  # 更多关于  # 所述  # 程序设计  # 开源  # 输入框  # 讲述了  # null  # getInt  # EXTRA_APPWIDGET_ID  # getIntent  # extras  # getExtras 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用PHP快速搭建高效网站?分步指南  南京网站制作费用,南京远驱官方网站?  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  在centOS 7安装mysql 5.7的详细教程  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  如何用JavaScript实现文本编辑器_光标和选区怎么处理  创业网站制作流程,创业网站可靠吗?  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  公司网站制作需要多少钱,找人做公司网站需要多少钱?  如何在Windows环境下新建FTP站点并设置权限?  动图在线制作网站有哪些,滑动动图图集怎么做?  Laravel如何处理异常和错误?(Handler示例)  魔方云NAT建站如何实现端口转发?  html5的keygen标签为什么废弃_替代方案说明【解答】  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  浅谈redis在项目中的应用  Swift中循环语句中的转移语句 break 和 continue  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何在腾讯云服务器上快速搭建个人网站?  Laravel如何记录自定义日志?(Log频道配置)  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  如何快速搭建二级域名独立网站?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  如何挑选最适合建站的高性能VPS主机?  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  非常酷的网站设计制作软件,酷培ai教育官方网站?  Laravel怎么判断请求类型_Laravel Request isMethod用法  如何快速查询网站的真实建站时间?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  浅谈Javascript中的Label语句  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何在宝塔面板中修改默认建站目录?  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  公司门户网站制作流程,华为官网怎么做?  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  如何打造高效商业网站?建站目的决定转化率  佛山网站制作系统,佛山企业变更地址网上办理步骤?  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  如何快速启动建站代理加盟业务?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  Python制作简易注册登录系统  Laravel PHP版本要求一览_Laravel各版本环境要求对照