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

本文实例讲述了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程序设计有所帮助。

(0)

相关推荐

  • Android控件AppWidgetProvider使用方法详解

    介绍 AppWidgetProvider是Android中提供的用于实现桌面小工具的类,其本质是一个广播,即BroadcastReceiver,在实际的使用中,把AppWidgetProvider当成一个BroadcastReceiver即可 1. 为AppWidget提供一个文件定义小控件的基本配置信息 在资源文件夹res目录下新建xml文件夹,添加app_widget_provider_info.xml文件内容为: <?xml version="1.0" encoding=&

  • 基于Android AppWidgetProvider的使用介绍

    AppWidgetProvider 用来在HOME页面显示插件 实现步骤:1.为AppWidget提供一个元布局文件AppWigdetProvider_Provider.xml,用来显示Widget的界面.2.创建一个类继承自AppWidgetProvider,并覆写里面的相关的方法.3.为WidgetProvider创建一个引用的布局文件,或者直接用main.xml.4.在程序中注册Manifest.xml. 代码如下: 1.在res/xml/文件夹下创建AppWigdetProvider_P

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

    本文实例讲述了Android编程之桌面小部件AppWidgetProvider用法.分享给大家供大家参考,具体如下: /** * 桌面小部件 AppWidget配置 * * @description: * @author ldm * @date 2016-5-16 下午1:57:16 */ public class ExampleAppWidgetConfigure extends Activity { static final String TAG = "ExampleAppWidgetCon

  • Android编程图片操作类定义与用法示例【拍照,相册选图及裁剪】

    本文实例讲述了Android编程图片操作类定义与用法.分享给大家供大家参考,具体如下: 主界面类:拍照及选择相册图片 import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import androi

  • Android之AppWidget(桌面小部件)开发浅析

    什么是AppWidget AppWidget 即桌面小部件,也叫桌面控件,就是能直接显示在Android系统桌面上的小程序,先看图: 图中我用黄色箭头指示的即为AppWidget,一些用户使用比较频繁的程序,可以做成AppWidget,这样能方便地使用.典型的程序有时钟.天气.音乐播放器等.AppWidget 是Android 系统应用开发层面的一部分,有着特殊用途,使用得当的化,的确会为app 增色不少,它的工作原理是把一个进程的控件嵌入到别外一个进程的窗口里的一种方法.长按桌面空白处,会出现

  • Android编程创建桌面快捷方式的常用方法小结【2种方法】

    本文实例讲述了Android编程创建桌面快捷方式的常用方法.分享给大家供大家参考,具体如下: Android在桌面上生成快捷方式有两种情况,一种是直接在桌面直接生成;一种是长按桌面,在弹出的快捷菜单中生成. 谈谈在桌面上直接生成.个人觉得这个比较爽快,既然都是快捷方式了干嘛还要再隐藏一层呢?当然喜欢桌面干净的就比较喜欢第二个了. 第一个是通过广播(Broadcast)的形式向Luncher发送请求生成快捷方式的. 在网上找到关于这方面的注册信息. <!--设置wallpapaer的activit

  • Android编程开发之TextView控件用法(2种方法)

    本文实例讲述了Android编程开发之TextView控件用法.分享给大家供大家参考,具体如下: 这里我们会讲讲常用控件的使用. 在今后的大多数章节里面也是一样的,我们会具体的说说某些控件的用法.因为只要把这些控件组合在一起它们就是一个应用了. 好吧我们直接看看这个控件怎么用. 细心的同学会发现,其实这个控件的内容是定义在values文件夹里面的strings.xml中的. 那么我们只需要给它加一段代码: 复制代码 代码如下: <string name="test">Wel

  • Android编程布局控件之AbsoluteLayout用法实例分析

    本文实例讲述了Android编程布局控件之AbsoluteLayout用法.分享给大家供大家参考,具体如下: AbsoluteLayout是绝对布局管理器,指的是指定组件的左上角绝对坐标来指定组件的布局 <?xml version="1.0" encoding="utf-8"?> <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"

  • Android编程开发中ListView的常见用法分析

    本文实例讲述了Android编程开发中ListView的常见用法.分享给大家供大家参考,具体如下: 一.ListView的使用步骤 ListView的使用通常有以下三个要素: (1)ListView中每个条目的布局; (2)填充进入ListView中的内容; (3)将内容与页面进行整合的Adapter. 因此,使用ListView也通常有以下三个步骤: (1)创建ListView条目的布局文件(或使用Android SDK提供的布局); (2)创建填充进入ListView中的内容,如字符串.图片

  • Android编程之匿名内部类与回调函数用法分析

    本文实例讲述了Android编程之匿名内部类与回调函数用法.分享给大家供大家参考,具体如下: 我们Android开发中经常用到一些匿名内部类,及其其中的回调函数,例如,我们给Button设置监听器时候通常要实现OnCLickListener接口,并重写其中的Onclick()方法,这就是匿名内部类与回调函数,那么你对Java匿名内部类以及回调函数又理解多少呢?这篇文档给予比较详细的解释. 首先应该知道,内部类是JAVA语言的主要附加部分.内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同

  • Android编程开发之Spinner控件用法实例分析

    本文实例讲述了Android编程开发之Spinner控件用法.分享给大家供大家参考,具体如下: 下拉列表 Spinner,Spinner是一个每次只能选择所有项的一个项的控件.它的项来自于与之相关联的适配器中. Spinner的使用,可以极大提高用户的体验性.当需要用户选择的时候,可以提供一个下拉列表将所有可选的项列出来.供用户选择. 一.使用数组作为数据源 布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/ap

  • Android编程绘图操作之弧形绘制方法示例

    本文实例讲述了Android编程绘图操作之弧形绘制方法.分享给大家供大家参考,具体如下: /** * 绘制弧形图案 * @description: * @author ldm * @date 2016-4-25 下午4:37:01 */ public class ArcsActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedIns

随机推荐