Android Launcher开发添加应用程序的快捷方式

时间:2021-04-16 05:25:49

Launcher就是我们Android系统的手机桌面,这里一直是纷繁手机应用世界的必争之地,几乎每个应用都希望在这里有一席之地。

一个Launcher一般由以下几个部分组成:

Android Launcher开发添加应用程序的快捷方式

今天我们先来做一个最简单的手机应用快捷方式添加。手机应用桌面快捷方式的基本原理是:

  • 采用了 Android 系统的广播机制,发送一个广播“com.android.launcher.action.INSTALL_SHORTCUT”,Android 系统的 Launcher 中的 InstallShortcutReceiver 接收到这个广播之后,快捷图标就会被创建。

手机应用快捷方式的添加总共分成三大步:

  1. 创建一个添加快捷方式的Intent,该Intent的action属性值是“com.android.launcher.action.INSTALL_SHORTCUT”;
  2. 通过该Intent添加Extra属性来设置快捷方式的标题、图标以及快捷方式要启动的应用程序;
  3. 调用sendBroadcast()方法发送广播即可添加快捷方式
另外,创建快捷方式是需要相应权限的,不要忘了
 <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
 <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/>
以下程序实现了对某一应用程序快捷方式的添加,并添加了判断应用程序图标是否已经存在于桌面的判断
package farsight.com.cn.addicon;

import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if(!isExist()) {
                    // 创建添加快捷方式的Intent
                    Intent intent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
                    // 加载快捷方式的应用程序名称
                    String tile = getResources().getString(R.string.app_name);
                    // 加载快捷方式的图标
                    Parcelable icon = Intent.ShortcutIconResource.fromContext(MainActivity.this, R.drawable.ic_launcher);
                    // 创建点击快捷方式后操作Intent,该处当点击创建的快捷方式后,再次启动该程序
                    Intent myIntent = new Intent(MainActivity.this,
                            MainActivity.class);
                    // 设置快捷方式的标题
                    intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, tile);
                    // 设置快捷方式的图标
                    intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
                    // 设置快捷方式对应的Intent
                    intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, myIntent);
                    // 发送广播添加快捷方式
                    sendBroadcast(intent);

                }
            }
        });
    }


    private boolean isExist() {
        boolean isExist = false;
        int version = getSdkVersion();
        Uri uri = null;
        //桌面快捷图标的数据保存在手机的 /data/data/com.android.launcher/databases/launcher.db 中,
        // 同时系统对外提供了一个 LauncherProvider 供外界进行访问。
        // 在 launcher.db 的 favorites 表中保存了具体的数据,
        // 可以通过 LauncherProvider 中的 authorities 加 favorites 的形式来访问 favorites 表;
        // 考虑到程序的兼容性 authorities 的值要根据不同的 SDK 版本来进行设置,
        // 在 SDK 版本 2.0 之前 authorities 的值为:com.android.launcher.settings,
        // 而在 SDK 2.0 之后 authorities 的值为:com.android.launcher2.settings;
        if (version < 2.0) {
            uri = Uri.parse("content://com.android.launcher.settings/favorites");
        } else {
            uri = Uri.parse("content://com.android.launcher2.settings/favorites");
        }
        String selection = " title = ?";
        String[] selectionArgs = new String[] { getResources().getString(R.string.app_name).toString() };
        Cursor cursor = getContentResolver().query(uri, null, selection, selectionArgs, null);

        if (cursor != null && cursor.getCount() > 0) {
            isExist = true;
        }

        if (cursor != null) {
            cursor.close();
        }

        return isExist;
    }

    /**
     * 得到当前系统SDK版本
     */
    private int getSdkVersion() {
        return android.os.Build.VERSION.SDK_INT;
    }



}

AndroidManifest.xml
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="farsight.com.cn.addicon">

    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest></span><span style="font-size:12px;">
</span>