读书人

Shortcut的增添和删除

发布时间: 2012-09-09 09:27:54 作者: rapoo

Shortcut的添加和删除

1.默认的Shortcut操作
[添加]
默认安装后的应用(Launcher属性),图标都会出现在"抽屉面板"中,在里面长按并拖曳图标可以拖动到桌面,实现快捷方式的添加。

[删除]
长按桌面的图标,"抽屉面板"的小箭头会变成一个垃圾箱的图标,然后将图标拖进去就删除了。

2.对Shortcut列表进行添加/删除操作
[添加]
在默认桌面空白处长按,会弹出选择对话框,选择"Shortcut",找到要添加的应用快捷方式进行添加。

首先我们要将应用的选项添加到Shortcut列表里来,直接上代码:

?

[删除]
应用重装/卸载后会自动删除

3.直接对Shortcut进行添加/删除操作(通过代码)
[添加]
要点:
1. 给Intent指定action="com.android.launcher.INSTALL_SHORTCUT"
2. 给定义为Intent.EXTRA_SHORTCUT_INENT的Intent设置与安装时一致的action(必须要有)
3. 在AndroidManifest.xml中添加权限:com.android.launcher.permission.INSTALL_SHORTCUT

?

[删除]
要点:
1. 给Intent指定action="com.android.launcher.UNINSTALL_SHORTCUT"
2. 给定义为Intent.EXTRA_SHORTCUT_INENT的Intent设置与安装时一致的action(必须要有)
3. 在AndroidManifest.xml中添加权限:com.android.launcher.permission.UNINSTALL_SHORTCUT

?

>> 可见添加到Shortcut列表和直接添加到桌面以及删除的操作都是大同小异的,归纳如下:
1. 对应Shortcut的Intent
?? 1)添加到Shorcut列表时,不需要指定action
?? 2)添加到桌面时,需指定action="com.android.launcher.action.INSTALL_SHORTCUT"
?? 3)删除桌面Shortcut时,需要指定action="com.android.launcher.action.UNINSTALL_SHORTCUT"
2. 对应被设为Intent.EXTRA_SHORTCUT_INTENT的Intent
?? 1)添加到Shorcut列表时,不需要指定action
?? 2)直接添加/删除(桌面Shortcut)时,需指定一致的action(可任意)

* 这里有个问题就是:如何创建非自身应用的快捷方式?
必须知道应用的包名,然后通过Context.getPackageManager()获取到PackageManager来进行具体操作,里面提供了丰富的函数来获取应用的信息。例如,获取某个应用的图标:
Drawable getApplicationIcon(String packageName)

?

-------------------------------------
参考资料:
Android 向桌面添加快捷方式
Android桌面快捷方式图标生成与删除,使用Intent与launcher交互
Android创建和删除桌面快捷方式

?

-------------------------------------
最后上一个完整示例代码:




原因是:addShortcutToOptions,addShortcutToDesktop,delShortcutFromDesktop传入的参数className不正确。不应该使用instance.getLocalClassName()获取class名,因为通过它取到的是ShortcutDemo,而不是com.android.shortcut.ShortcutDemo,如果使用class名是ShortcutDemo,那么,当在另外一个程序中startActivity时,就出报出这么个错误:【W/System.err(6003): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.android.shortcut/.ShortcutDemo}; have you declared this activity in your AndroidManifest.xml?】

原因可能是startActivity时,只从这个appliction中查找这个类,所以最终找不到对应的activity.

因此,应该使用instance.getClass().getName()来获取classname.

读书人网 >移动开发

热点推荐