本文实例讲述了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
相关文章:
如何通过万网虚拟主机快速搭建网站?
广平建站公司哪家专业可靠?如何选择?
制作网站外包平台,自动化接单网站有哪些?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
建站主机CVM配置优化、SEO策略与性能提升指南
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
如何在Golang中指定模块版本_使用go.mod控制版本号
建站主机解析:虚拟主机配置与服务器选择指南
如何在IIS中新建站点并解决端口绑定冲突?
公司网站设计制作厂家,怎么创建自己的一个网站?
C++中引用和指针有什么区别?(代码说明)
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
建站之星24小时客服电话如何获取?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
css网站制作参考文献有哪些,易聊怎么注册?
如何通过VPS建站实现广告与增值服务盈利?
如何在阿里云通过域名搭建网站?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
如何高效完成独享虚拟主机建站?
建站之星2.7模板:企业网站建设与h5定制设计专题
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
如何通过宝塔面板实现本地网站访问?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
高端网站建设与定制开发一站式解决方案 中企动力
如何高效利用亚马逊云主机搭建企业网站?
c# await 一个已经完成的Task会发生什么
如何用免费手机建站系统零基础打造专业网站?
如何安全更换建站之星模板并保留数据?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
Python如何创建带属性的XML节点
大连 网站制作,大连天途有线官网?
如何在IIS管理器中快速创建并配置网站?
名字制作网站免费,所有小说网站的名字?
,巨量百应是干嘛的?
香港服务器WordPress建站指南:SEO优化与高效部署策略
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
建站主机服务器选型指南与性能优化方案解析
子杰智能建站系统|零代码开发与AI生成SEO优化指南
一键网站制作软件,义乌购一件代发流程?
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
如何快速搭建虚拟主机网站?新手必看指南
如何设置并定期更换建站之星安全管理员密码?
建站上市公司网站建设方案与SEO优化服务定制指南
如何正确选择百度移动适配建站域名?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
打鱼网站制作软件,波克捕鱼官方号怎么注册?
*请认真填写需求信息,我们会在24小时内与您取得联系。