September 15, 2013

安卓开发创建桌面快捷方式

在安卓开发中,我们可能需要做一个这样的功能,那就是为了方便用户在安装该应用的时候给当前安卓系统的桌面创建该应用的快捷方式,这个要如何实现呢?本文提供解决方法

在安卓系统中一般来说要给桌面添加快捷方式,主要有以下两种方式:

1.在launcher的应用程序列表上,长按某一应用程序图标创建快捷方式到桌面

       2.在桌面上长按在弹出框中选择快捷方式->应用程序->将添加快捷方式的程序

如何在开发中就设置好在用户安装了应用后就直接给桌面创建快捷方式呢?一般的说Android系统桌面是由launcher来控制的,所以我们可以通过下面两种方式来实现快捷方式的自动创建:

1.通过向launcher发送Broadcast让launcher创建快捷方式

2.为应用程序的组件注册某一个符合特定条件的IntentFilter,然后可以直接在Launcher的桌面添加启动该组件的快捷方式。

第一种方式:

 /**

        * 添加快捷方式到桌面需要注意的几点: 

        * 1.添加权限:com.android.launcher.permission.INSTALL_SHORTCUT

        * 2.给Intent指定action="com.android.launcher.INSTALL_SHORTCUT"

        * 3.给定义为Intent.EXTRA_SHORTCUT_INENT的Intent设置与安装时一致的action(必须要有)

        */ private void addShortcutToDesktop() {

        Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); 

        // 不允许重复创建 

        shortcut.putExtra("duplicate", false);

        // 设置快捷方式的名字 

        shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,this.getString(R.string.app_name));

        // 设置快捷方式的图标

        shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,

Intent.ShortcutIconResource.fromContext(this,R.drawable.ic_launcher));

        // 设置意图和快捷方式关联程序 

        shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,new Intent(this, this.getClass()).setAction(Intent.ACTION_MAIN)); 

        // 发送广播 

        sendBroadcast(shortcut);

        }

一般的应用程序的当快捷方式创建成功后,launcher会通过toast的方式提示快捷方式创建成功,如果快捷方式已经创建则提示快捷方式已经创建



   第二种方式和第一种有些类似,不过我们不用广播的方式让给launcher创建,而是通过注册IntentFilter,由于“添加快捷方式”Action是 由Launcher通过startActivity-ForResult这一方法发出的,在Activity启动后把初始化的快捷方式 Intent返回给Launcher应用程序,设置结果值为RESULT_OK表示正常返回。



   主要代码如下:

   首先在xml中设置IntentFilter

 <intent-filter> <action android:name="android.intent.action.CREATE_SHORTCUT" /> </intent-filter>
if (Intent.ACTION_CREATE_SHORTCUT.equals(action)) {

         Intent shortcut = new Intent(Intent.ACTION_CREATE_SHORTCUT);

         // 不允许重复创建

         shortcut.putExtra("duplicate", false); 

         // 设置快捷方式的名字

         shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,this.getString(R.string.app_name));

         // 设置快捷方式图标

         shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,

Intent.ShortcutIconResource.fromContext(this,R.drawable.ic_launcher)); 

         // 设置意图和快捷方式关联的程序

         shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,new Intent(this, this.getClass()));

         //将结果返回到launcher

         setResult(RESULT_OK, intent);

         }

在launcher中我们运行程序就可以将快捷方式创建在桌面上。

通过上述方式可以自动将快捷方式创建到桌面上,但是每次运行程序时都会将快捷方式创建到桌面上,下面我们将通过程序判断快捷方式是否已经创建到桌面上了,基本思路是:由于快捷方式launcher管理的,我们可以通过查看launcher中是否已经有此快捷方式数据,如果有就不在创建。

/** 

        * 添加权限:<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/> 

        */ 

        private boolean hasInstallShortcut() { 

            boolean hasInstall = false; 

            final String AUTHORITY = "com.android.launcher.settings";

            Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY+ "/favorites?notify=true");

            Cursor cursor = this.getContentResolver().query(CONTENT_URI,new String[] { "title", "iconResource" },

             "title=?",new String[] { this.getString(R.string.app_name) }, null);

             if (cursor != null && cursor.getCount() > 0) {

             hasInstall = true;

             }

         return hasInstall;

         }

上述查询操作,需要具有以下权限:

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

注意通过程序创建的快捷方式不会随着程序卸载而自动删除。