`

安卓系统中的几种创建快捷方式的方法

 
阅读更多

 

使用Android的知道,有快捷方式这么一说,可以通过长按桌面来添加,也有的是第一次运行时候询问是否需要安装,有的直接放在桌面(MIUI是直接放在桌面的),那么为了驱动用户使用,有些应用在安装以后便直接安装了快捷方式,还有些应用是在用户第一次进入的时候,询问用户是否安装快捷方式,那么接下来就看看快捷方式的实现。

安装即带

这个实现方法比较简单,直接在AndroidManifest.xml里面就可申明

 1         <activity-alias
 2             android:name="demoAlias"
 3             android:icon="@drawable/logo"
 4             android:label="demoAliasLabel"
 5             android:targetActivity=".MainActivity" >
 6             <intent-filter>
 7                 <action android:name="android.intent.action.MAIN" />
 8 
 9                 <category android:name="android.intent.category.DEFAULT" />
10                 <category android:name="android.intent.category.LAUNCHER" />
11             </intent-filter>
12         </activity-alias>

name表示快捷方式显示的名字

icon表示快捷方式图标

targetActivity表示点击快捷方式启动的活动

这个表情直接申明在Application中即可,有一点需要说明的是从快捷方式进入和从默认桌面Activity进入,对于Application有一些参数是有差异的,例如

getIntent().getComponent().getClassName()

主APP进入:{package}.MainActivity

快捷方式进入:{package}.demoAlias

注意:这种本质上不属于快捷方式,只是在Launcher中添加了一个APP入口的副本,重点在下面的动态创建。

动态创建

方式1:托管给系统桌面的快捷方式来创建

对于Android原生系统,桌面空白处长按可以添加小控件、快捷方式等。点击快捷方式,里面会呈现申明了快捷方式的APP快捷方式列表。

那么如何申明快捷方式呢?这就是第一步

第一步:申明快捷方式

1         <activity-alias

2             android:name="DemoShortCutName"
3             android:icon="@drawable/logo"
4             android:label="DemoShortCutLabel"
5             android:targetActivity=".DynamicShortcut" >
6             <intent-filter>
7                 <action android:name="android.intent.action.CREATE_SHORTCUT"  />
8             </intent-filter>
9         </activity-alias>

快捷方式也是一个Activity,可以看成一个虚拟的Activity不需要实体的承载

name:表示这个Activity的标示,通过getClassName()会获取name属性

icon:在桌面快捷方式列表中的图标

label:在桌面快捷方式列表中的文字

targetActivity:既然说他是一个虚拟的Activity,那么需要制定一个实体,也即快捷方式的启动

通过申明android.intent.action.CREATE_SHORTCUT申明,让这个虚拟的Activity加入到桌面快捷方式列表中。

如果在桌面快捷方式列表中点击这个快捷方式,会发现仅仅是启动了TargetActivity,在桌面上并没有看到这个快捷方式被添加,那么接下来需要在TargetActivity中去实现这个。

第二步:实现快捷方式的添加

 1     private void generateShortcut() {

 2         // 快捷方式要启动的Activity
 3         Intent shortcutIntent = new Intent();
 4         shortcutIntent.setClassName(this, this.getClass().getName());
 5         
 6         // 动态生成快捷方式
 7         Intent intent = new Intent();
 8         intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
 9         intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "test");
10         Parcelable iconResource = Intent.ShortcutIconResource.fromContext(this,  R.drawable.icon0);
11         intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
12         // 将生成的快捷方式递交给系统生成桌面快捷方式
13         setResult(RESULT_OK, intent);
14     }

快捷方式的添加方法和在AndroidManifest中申明远离基本相同。

添加原理知道了,那么在什么时候去触发添加动作

第三步:结合快捷方式列表中点击生成快捷方式

TargetActivity可以是单独为创建快捷方式功能而存在,也可以是应用程序的启动页面。那么来看下在启动页作为TargetActivity的时候,该如何触发添加快捷方式,

代码实现原理是:

1.点击桌面快捷方式

2.启动TargetActivity

3.添加快捷方式到桌面。

期望结果是没有第二步,点击直接添加到桌面,那么在实现的时候,就可以做下处理:

 1     @Override

 2     protected void onCreate(Bundle savedInstanceState) {
 3         super.onCreate(savedInstanceState);
 4         setContentView(R.layout.dynamic_shortcut);
 5 
 6         final String intentAction = getIntent().getAction();
 7         if (Intent.ACTION_CREATE_SHORTCUT.equals(intentAction)) {
 8             generateShortcut();
 9             finish();
10             return;
11         }
12     }

这样的话,就达到了期望的结果,到此为止,快捷方式就添加完毕,如果想做成类似“金山开关,360快捷开关”这样的,可以专门做个Dialog样式的Activity来作为TargetActivity。

方式2:通过代码在任意时刻通过任意方式创建

例如通过点击应用里面的某个Button或者应用程序第一次启动,或者。。。,这里看下原理

 1     private void createShortcut() {

 2         // 快捷方式要启动的Activity
 3         Intent target = new Intent();
 4         target.setClassName(this, this.getClass().getName());
 5         
 6         // 动态生成快捷方式
 7         Intent shortcutIntent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
 8         shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "shortcutName"); 
 9         shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(this,  R.drawable.icon1));
10         shortcutIntent.putExtra("duplicate", false); 
11         shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, target); 
12         
13         // 利用receiver通知系统创建快捷方式
14         sendBroadcast(shortcutIntent); 
15         
16     }

可以看到,和第一种方式实现基本一样,只不过通知系统生成的方式不一样,此处用的是通知。其实第一种方式也可以利用通知来实现。

添加“duplicate”是表示快捷方式不能重复添加,当然这块和第一种实现方式重复添加不冲突。

那么到这里,第二种方式核心实现完成。

扩展

上述仅仅介绍了核心实现,那么对于快捷方式的添加,当然还需要申明创建快捷方式的权限了:

1 <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />

这个当然不能忘掉。

还有对于MIUI这种神奇的rom是没有快捷方式这一说的,大家测试的时候,多用些不同的rom机器试试。

那么既然可以重复创建快捷方式,如果想限制只能有一个快捷方式存在,怎么办,上面设置“duplicate”属性只能限制第二种方式通知添加,而且会有提示,且是系统去判断的,那么我们怎么能自己判断是否已经存在快捷方式了呢,当然可以,来一次看看。

实现思路可以这么想:快捷方式在桌面,那么如果能获取系统桌面的应用程序属性,判断是否我的应用在被放到了桌面就行。

那么来看下代码:

 1     private boolean hasShortcut() {

 2         final String AUTHORITY = "com.android.launcher.settings";
 3         final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/favorites?notify=true");
 4         Cursor c = getContentResolver().query(
 5                 CONTENT_URI,
 6                 new String[] { "title" },
 7                 "title=?",
 8                 new String[] { "test" },
 9                 null);
10         if (c != null && c.moveToNext()) {
11             return true;
12         }
13         return false;
14     }

简单的说明下:

通过Context的getContentResolve获取系统的共享数据,在共享数据中,查找指定Uri的数据,也即launcher中的favorite表,也即快捷方式表。

然后query的参数是筛选表的title列,并且title=“test”的行数据,如果查询有结果,表示快捷方式名为test的存在,也即返回快捷方式已经添加到桌面。

那么如果你时间了,如果你的测试机是MIUI,或者HTC等rom,你会发现c为null,怎么回事,解释下

android系统桌面的基本信息由一个launcher.db的Sqlite数据库管理,里面有三张表,其中一张表就是favorites。这个db文件一般放在data/data/com.android.launcher(launcher2)文件的databases下。但是对于不同的rom会放在不同的地方,例如MIUI放在data/data/com.miui.home/databases下面,htc放在data/data/com.htc.launcher/databases下面,那么如何用程序来找到这个认证标示呢

 1     private String getAuthorityFromPermission(Context context, String permission) {

 2         if (TextUtils.isEmpty(permission)) {
 3             return null;
 4         }
 5         List<PackageInfo> packs = context.getPackageManager().getInstalledPackages(PackageManager.GET_PROVIDERS);
 6         if (packs == null) {
 7             return null;
 8         }
 9         for (PackageInfo pack : packs) {
10             ProviderInfo[] providers = pack.providers;
11             if (providers != null) {
12                 for (ProviderInfo provider : providers) {
13                     if (permission.equals(provider.readPermission) || permission.equals(provider.writePermission)) {
14                         return provider.authority;
15                     }
16                 }
17             }
18         }
19         return null;
20     }

通过Permission来找到这个Authority,那么修改验证方法:

 1     private boolean hasShortcut() {

 2         final String AUTHORITY = getAuthorityFromPermission(getApplicationContext(), "com.android.launcher.permission.READ_SETTINGS");
 3         final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/favorites?notify=true");
 4         Cursor c = getContentResolver().query(
 5                 CONTENT_URI,
 6                 new String[] { "title" },
 7                 "title=?",
 8                 new String[] { "test" },
 9                 null);
10         if (c != null && c.moveToNext()) {
11             return true;
12         }
13         return false;
14     }

这样就可以了,对于某些系统,找不到的话,可能是由于权限原因或者是系统文件顺坏等,你可以通过es explorer工具去找下该文件,并试着用DDMS去读取

DDMS读取文件的时候,我出现了权限问题,参考了http://www.cnblogs.com/zdz8207/archive/2012/08/31/android-file-explore.html

总结

OK,快捷方式通过一天的搜索,试验,找问题,找机器试,总结完毕,把网上出现的一些问题和解决方案都对应的总结了下,希望对大家有帮组。

分享到:
评论

相关推荐

    Android 桌面快捷方式

    创建Android桌面快捷方式通常有以下几种方法: 1. **通过应用抽屉**:当您安装一个新的应用后,Android系统通常会在桌面自动创建一个快捷方式。如果系统没有这样做,你可以打开应用抽屉,找到你需要的应用,长按...

    android系统判断快捷方式是否存在

    这在某些应用场景下是非常有用的,比如为了提高用户体验,当检测到未创建快捷方式时可以引导用户进行创建。然而,在不同版本的Android系统中,这一操作的实现方式有所不同,特别是对于Android 2.3(API级别8)之后的...

    android编程实现为程序创建快捷方式的方法

    本篇文章将深入探讨如何通过编程方式在Android设备上为程序创建快捷方式,并提供一个具体的实例来演示这一过程。 首先,我们需要了解Android系统是如何处理快捷方式的。在Android中,快捷方式是通过Intent来实现的...

    Android 实现界面刷新的几种方法

    本文将详细介绍两种在Android中实现界面刷新的方法:使用Handler和使用`postInvalidate()`。 首先,我们了解Android的UI线程模型。Android应用程序遵循单线程模型,所有的UI操作必须在主线程(也称为UI线程)中执行...

    Android应用源码之快捷图标的创建与移除.zip

    在AndroidManifest.xml中添加必要的权限,用于在用户的主屏幕上创建快捷方式: ```xml &lt;uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /&gt; ``` 2. **创建快捷方式Intent**...

    android程序卸载后无法删除桌面快捷方式的解决办法

    - 对于不同版本的Android系统,可以采用不同的方法来确保快捷方式能够被正确删除。例如,在较旧的Android版本中,可能需要使用`ACTION_DELETE`而非`ACTION_UNINSTALL_SHORTCUT`。 4. **第三方桌面应用适配**: - ...

    android新建桌面快捷方式

    在桌面快捷方式中,我们用它来确保当用户点击快捷方式时,系统能正确启动我们的Activity。创建PendingIntent如下: ```java PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, shortcutIntent, ...

    android 桌面源代码

    本主题将深入探讨“Android桌面源代码”,重点关注`EyeRoom`这一特定的桌面应用,以及如何实现桌面分页滑动、创建快捷方式和源码修改等相关知识点。 一、桌面分页滑动 Android桌面通常采用ViewPager或...

    安卓手机天气预报系统毕业论文

    预报城市设置模块包括自动和手动两种设置方式,自动方式通过GPS定位功能确定用户所在地,手动方式则让用户在预存城市列表中选择。Widget桌面小部件模块则是一个辅助功能,旨在让用户随时了解天气情况,通过添加一个...

    给Android的应用换个图标(桌面快捷图标)sShortcut

    2. 创建快捷方式信息(ShortcutInfo):包含快捷方式的元数据,如图标、标题和描述等。例如: ```java ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(context, shortcutId) .setShortLabel("新图标") ....

    快捷方式桌面+权限是否存在

    请注意,从Android 7.1(API级别25)开始,非系统应用不能在主屏幕上直接创建快捷方式,除非用户通过启动器菜单手动创建。因此,对于新版本的Android,开发者需要考虑其他方式来提供类似的用户体验,如使用自定义...

    Android中英文切换

    - 对于经常需要在中英文间切换的用户,Android还提供了“语言优先级”设置,可以将常用的几种语言放在前面,系统会根据当前输入环境自动选择最合适的语言。 - 这个功能在处理多语言应用时特别有用,比如接收来自...

    android 点餐系统 app 源码 示例

    Android点餐系统是一个基于移动平台的餐饮服务应用程序,其核心功能是为用户提供方便快捷的在线点餐体验。这个系统由开发者花费半个月时间精心制作,不仅具备了完整的功能,而且UI设计精美,易于用户操作。在此,...

    安卓Android源码——完全退出程序的方法.rar

    3. **设置退出应用的快捷方式**:在设置菜单或主界面上提供一个“退出应用”的选项,点击后调用系统提供的`System.exit(0)`方法来强制退出。然而,这种方法不推荐,因为它可能会影响应用的正常生命周期管理,且可能...

    安卓数字提醒气泡提示角标相关-android桌面图标数字提醒一款高仿QQ桌面快捷方式显示未读数量的源代码.zip

    3. **ShortcutManager**: Android 7.1(Nougat)及以上版本引入了ShortcutManager,允许开发者创建动态的快捷方式,这些快捷方式可以显示角标。你可以为快捷方式设置一个count属性来显示未读数量。 4. **自定义View...

    安卓的图书管理系统安卓的图书管理系统

    《安卓的图书管理系统》是一款基于Android平台的软件应用,它主要使用Java编程语言进行开发,旨在为用户提供方便快捷的图书管理服务。在这个系统中,用户可以实现对个人图书馆的全面控制,包括图书的添加、删除、...

    Android动态更新图标

    Android支持创建快捷方式,每个快捷方式可以有自己的图标。开发者可以通过Intent和ShortcutManager API创建一个新的快捷方式,设置新的图标,并将原有的快捷方式替换掉。这种方法需要用户手动操作,但可以在不更新...

    安卓电视盒子设置开机自动启动应用软件

    5. **手动操作**:如果以上方法都不适用,还可以通过创建快捷方式到桌面并设置为启动项来实现。但这种方式可能需要root权限,且不是所有应用都支持这种方式启动。 在进行这些操作时,需要注意以下几点: - **安全...

    使用安卓(Android)系统50大必备秘籍.doc

    11. **多主屏管理**:Android支持创建多个主屏幕,用户可以自由分配应用快捷方式和Widgets,如使用HTC Sense等启动器,可以实现更高效的主屏布局。 12. **手势输入**:Android系统支持手势输入,比如滑动解锁、快捷...

Global site tag (gtag.js) - Google Analytics