Android开发之Shortcuts, LiveFolder, Widget
2013-07-05
桌面组件包括:快捷方式(Shortcuts),实时文件夹(Live Folder),桌面插件(Widget)。
快捷方式用于启动应用程序的某个组件,例如Activity, Service等。
在桌面上添加快捷方式:长按桌面(或点击MENU->ADD按键)就可以弹出添加桌面组件的选项对话框。
在代码中将应用程序添加到Shortcuts列表中
在AndroidManifest.xml文件中注册Activity时添加android.intent.action.CREATE_SHORTCUT的IntentFilter,然后在Shortcuts列表中就会出现该应用的图标和名字了。
为快捷方式设置名字,图标,事件等
在Activity的onCreate方法中
public void onCreate(Bundle savedInstanceState) {
// 判断该Activity是否要允许添加快捷方式
if(getIntent().getAction().equals(Intent.ACTION_CREATE_SHORTCUT)) {
Intent it = new Intent();
// 设置名字
it.putExtra(Intent.EXTRA_SHORTCUT_NAME, “发生邮件”);
// 设置图标,使用系统的图标
Parcelable icon = Intent.ShortcutIconResource.fromContext(this, R.drawable.mail_edit);
it.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
// 设置事件
Intent mailIt = new Intent(Intent.ACTION_SENDTO, Uri.parse(“mailto:xxx@xxx.com”));
it.putExtra(Intent.EXTRA_SHORTCUT_INTENT, mailIt);
setResult(RESULT_OK, it);
} else {
setResult(RESULT_CANCELED);
}
finish();
}
实时文件夹(Live Folder)是一个查看你的手机中所有电子书,电子邮件,RSS订阅,播放列表的快捷方式,并且这些内容都是实时更新的。
LiveFolder本身不存储任何信息,都是以映射的方式查看ContentProvider所指向的数据信息,并可以自定义显示格式,所以当源数据发生变化时,LiveFolder可以实时更新显示。
在开发时,我们要保证指定数据的URI的ContentProvider支持LiveFolder的查询。
通过LiveFolder调用电话薄的联系人,点击其中一条数据时,便执行呼叫该联系人的动作。
首先在Activity注册时添加Action为android.intent.action.ACTION_CREATE_LIVE_FOLDER的IntentFilter。
然后我们要在代码中设置LiveFolder的数据源,图标,名字等信息,可以通过intent.setData方法来设置。
在onCreate方法中实现
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(getIntent().getAction.equals(LiveFolders.ACTION_CREATE_LIVE_FOLDER)) {
Intent it = new Intent();
// 设置数据
it.setData(Uri.parse(“content://contacts/live_folders/people”));
// 设置单击事件
it.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_BASE_INTENT, new Intent(Intent.ACTION_CALL, Contacts.People.CONTENT_URI));
// 设置名字
it.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_NAME, “电话薄”);
// 设置图标
it.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_ICON, Intent.ShortcutIconResource.fromContext(this, R.drawable.contacts));
// 设置显示模式
it.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE, LiveFolders.DISPLAY_MODE_LIST);
setResult(RESULT_OK, it);
} else {
setResult(RESULT_CANCELED);
}
finish();
}
Widget开发
Widget是一种很小的应用程序,主要作为Web2.0服务或互联网内容的前端。当Widget被拖到桌面上时,指定一个保留的空间来显示应用提供的自定义内容。用户可以通过这个Widget来和应用交互,例如暂停或切换歌曲。
每个Widget就是一个BroadcastReceiver,它们用XML metadata来描述Widget的细节。AppWidget Framework通过Broadcast intents和Widget通信,Widget的更新使用RemoteViews来发送。RemoteViews被包装成一个layout和特定内容显示到桌面上。
开发Widget步骤:
1. 创建布局文件res/layout/appwidget_provider.xml,用来显示桌面布局。
2. 创建一个描述Widget属性的文件res/xml/xmlappwidget_provider.xml。
在这个文件中,只有一个标签:<appwidget-provider />
属性说明:
android:minWidth, android:minHeight分别指定Widghet的最小宽度和最小高度。
android:updatePeriodMillis是自动更新的时间间隔。
android:initialLayout是Widget的布局描述文件。
android:configure是可选的,在启动Widget启动之前启动。
3. 创建一个继承自AppWidgetProvider的子类。
在AppWidgetProvider提供几个方法:
onUpdate, onDeleted, onEnabled, onDisabled
public class TxrjAppWidgetProvider extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int n = appWidgetIds.length;
for(int i=0; i<n; i++) {
updateAppWidget(context, appWidgetManager, appWidgetId, titlePrefix);
}
}
public void onDeleted(Context context, int[] appWidgetIds) {
final int n = appWidgetIds.length;
for(int i=0; i<n; i++) { }
}
// 第一个Widget创建时调用
public void onEnabled(Context context) {
PackageManager packageManager = context.getPackageManager();
packageManager.setComponentEnabledSetting(new ComponentName(“xxx”), “.TxrjBoradcastReceiver”,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
}
// 最后一个Widget创建时调用
public void onDisabled(Context context) {
PackageManager pm = context.getPackageManager();
packageManager.setComponentEnabledSetting(new ComponentName(“xxx”), “.TxrjReceiver”,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
}
// 在updateAppWidget方法中,我们构建了一个RemoteViews对象来对Widget进行更新,
// setTextViewText用来更新一个TextView的内容
// updateAppWidget提供给AppWidget使其更新到桌面
public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, String titlePrefix) {
RemoteViews views = new RemoteViews(context.getPackagetName, R.layout.appwidget_provider);
views.setTextViewText(R.id.appwidget_text, titlePrefix);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
4. 创建一个BroadcastReceiver来接收更新的信息,收到更新的信息之后就更新Widget。
public class TxrjBoradcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals(Intent.ACTION_TIMEZONE_CHANGED) || action.equals(Intent.ACTION_TIME_CHANGED)) {
AppWidgetManager widgetManger = AppWidgetManager.getInstance(context);
ArrayList<Integer> appWidgetIds = new ArrayList<Integer>();
ArrayList<String> texts = new ArrayList<String>();
// loadAllTitleTitlePrefs(context, appWidgetIds, texts);
}
}
}
5. 处理android:configure设定的Activity。当点击按钮之后,创建一个AppWidgetManager实例,然后调用TxrjAppWidgetManager.updateAppWidget方法来更新Widget。
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
6. 在AndroidManifest.xml文件中注册Widget, BroadcastReceiver, Activity
// 注册Widget
<receiver android:name=”.widget.TxrjAppWidgetProvider”>
<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>
// 注册BroadCastReceiver
<receiver android:name=”.receiver.TxrjAppWidgetProvider” android:enabled=”false”>
<intent-filter>
<action android:name=”android.intent.ACTION_TIMEZONE_CHANGED” />
<action android:name=”android.intent.ACTION_TIME_CHANGED” />
</intent-filter>
</receiver>
// 注册Activity
<activity android:name=”.activity.TxrjActivity”>
<intent-filter>
<action android:name=”android.appwidget.action.APPWIDGET_CONFIGURE” />
</intent-filter>
</activity>
Android开发之Shortcuts, LiveFolder, Widget的更多相关文章
- Android开发之InstanceState详解
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- 【Android UI】Android开发之View的几种布局方式及实践
引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理 ...
- Android开发之PopupWindow
/* * Android开发之PopupWindow * * Created on: 2011-8-8 * Author: blueeagle * Email: liujiaxiang@g ...
- Android 开发之旅:深入分析布局文件&又是“Hello World!”
http://www.cnblogs.com/skynet/archive/2010/05/20/1740277.html 引言 上篇可以说是一个分水岭,它标志着我们从Android应用程序理论进入实 ...
- android开发之Animations的使用(二)
android开发之Animations的使用(二) 本博文主要讲述的是android开发中的animation动画效果的使用,和上一篇博文不同的是,此次四种动画效果,主要使用的是xml文件实现的,提 ...
- Android开发之TextView高级应用
Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大家分享一下TextView的一些使用技巧. A ...
- Android开发之InstanceState详解(转)---利用其保存Activity状态
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- android开发之Animation(五)
android开发之Animation的使用(五) 本博文主要讲述的是Animation中的AnimationLisenter的用法,以及此类的一些生命周期函数的调用,代码实比例如以下: MainAc ...
- Android开发之Java集合类性能分析
对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合,今天Android吧(ard8. ...
随机推荐
- JDK源码(1.7) -- java.util.Iterator<E>
java.util.Iterator<E> 源码分析(JDK1.7) ----------------------------------------------------------- ...
- Codeforces Beta Round #7 D. Palindrome Degree hash
D. Palindrome Degree 题目连接: http://www.codeforces.com/contest/7/problem/D Description String s of len ...
- Codeforces Round #304 (Div. 2) C. Soldier and Cards 水题
C. Soldier and Cards Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/546 ...
- 如何判断c语言的变量类型
变量三要素: 一个变量有三个基本的要素,变量的名称,变量的类型,变量的值.所以int a = 10; 变量名为a,变量的存储类型为int型,变量的值为10. 变量还有一些属性如作用范围和存储类型. 变 ...
- Java---ConcurrentHashMap分析
这是第二次分析concurrentHashMap 先回顾一下 1.concurrentHashMap是在jdk1.5版本之后推出的,位于java.util.concurrent包中. 2.基于Hash ...
- 为什么TCP连接需要三次握手分开需要四次握手?
TCP的三次握手和四次断开TCP是一个面向连接的服务,面向连接的服务是电话系统服务模式的抽象,每一次完整的数据传输都必须经过建立连接,数据传输和终止连接3个过程,TCP建立连接的过程称为三次握手,下面 ...
- C语言跟内存分配方式-alloc malloc calloc
转载:http://blog.csdn.net/ubuntulover/article/details/7581317 (1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整 ...
- 应对Memcached缓存失效,导致高并发查询DB的几种思路
原文地址: http://blog.csdn.net/hengyunabc/article/details/20735701 当Memcached缓存失效时,容易出现高并发的查询DB,导致DB压力骤然 ...
- Ruby:字符集和编码学习总结
背景 Ruby直到1.9版本才很好的支持了多字节编码,本文简单总结了今天学习的关于Ruby编码方面的知识. 字符串可以使用不同的编码 在.NET中字符串的编码是一致的,Ruby允许字符串有不同的编码, ...
- .NET:在C#中模拟Javascript的setTimeout方法
背景 每种语言都有自己的定时器(Timer),很多人熟悉Javascript中的setInterval和setTimeout,在Javascript中为了实现平滑的动画一般采用setTimeout模拟 ...