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的更多相关文章

  1. Android开发之InstanceState详解

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  2. 【Android UI】Android开发之View的几种布局方式及实践

    引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理 ...

  3. Android开发之PopupWindow

      /* *  Android开发之PopupWindow * *  Created on: 2011-8-8 *  Author: blueeagle *  Email: liujiaxiang@g ...

  4. Android 开发之旅:深入分析布局文件&又是“Hello World!”

    http://www.cnblogs.com/skynet/archive/2010/05/20/1740277.html 引言 上篇可以说是一个分水岭,它标志着我们从Android应用程序理论进入实 ...

  5. android开发之Animations的使用(二)

    android开发之Animations的使用(二) 本博文主要讲述的是android开发中的animation动画效果的使用,和上一篇博文不同的是,此次四种动画效果,主要使用的是xml文件实现的,提 ...

  6. Android开发之TextView高级应用

    Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大家分享一下TextView的一些使用技巧. A ...

  7. Android开发之InstanceState详解(转)---利用其保存Activity状态

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  8. android开发之Animation(五)

    android开发之Animation的使用(五) 本博文主要讲述的是Animation中的AnimationLisenter的用法,以及此类的一些生命周期函数的调用,代码实比例如以下: MainAc ...

  9. Android开发之Java集合类性能分析

    对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合,今天Android吧(ard8. ...

随机推荐

  1. Redis-Linux安装

    简介 redis是一个开源项目,一种基于hash存储于内存的nosql数据库.和Memcached类似,但很大程度补偿了memcached的不足,它支持存储的value类型相对更多,包括string. ...

  2. js中进行金额计算 parseFloat 会产生精度问题

    在js中进行以元为单位进行金额计算时 使用parseFloat会产生精度问题 var price = 10.99;var quantity = 7;var needPay = parseFloat(p ...

  3. ios学习笔记图片+图片解释(c语言 oc语言 ios控件 ios小项目 ios小功能 swift都有而且笔记完整喔)

    下面是目录其中ios文件夹包括了大部分ios控件的介绍和演示,swift的时完整版,可以学习完swift(这个看的是swift刚出来一周的视频截图,可能有点赶,但是完整),c语言和oc语言的也可以完整 ...

  4. Tasker, Android系统增强神器

    Tasker是一个让系统根据用户定制的”配置文件”(Profiles),在特定的”背景”下(Contexts),执行指定”任务”(Tasks)的软件, 除此之外,它还提供”可供点击”的(Clickab ...

  5. ELM320 OBD(PWM) to RS232 Interpreter

    http://elmelectronics.com/DSheets/ELM320DS.pdf

  6. MYSQL GDB SHELL

    http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201141165216974/

  7. Java Simon--性能瓶颈分析工具

    有了AOP以及Javainstrument之后,Java有很多很好的性能监控工具可以很有效的帮助我们分析系统瓶颈.例如使用jvisualvm的gui连接JVM应用之后可以监控应用的各种状态,可以看到每 ...

  8. jquery hide和show方法

    html 元素的显示和隐藏hide() 如果被选的元素已被显示,则隐藏该元素. show() 如果被选的元素已被隐藏,则显示该元素. <html> <head> <scr ...

  9. POJ 1740:A New Stone Game

    A New Stone Game Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5113 Accepted: 2806 Desc ...

  10. Qt 维护工具MaintenanceTool.exe 使用

    QT如何管理组件(解决“要继续此操作,至少需要一个有效且已启用的储存库”问题) 转载2017-10-26 01:48:46 标签:qt QT的组件管理软件并没有在开始菜单或者桌面添加快捷方式(5.9版 ...