Launcher就是我们Android系统的手机桌面,这里一直是纷繁手机应用世界的必争之地,几乎每个应用都希望在这里有一席之地。
一个Launcher一般由以下几个部分组成:
今天我们先来做一个最简单的手机应用快捷方式添加。手机应用桌面快捷方式的基本原理是:
- 采用了 Android 系统的广播机制,发送一个广播“com.android.launcher.action.INSTALL_SHORTCUT”,Android 系统的 Launcher 中的 InstallShortcutReceiver 在接收到这个广播之后,快捷图标就会被创建。
手机应用快捷方式的添加总共分成三大步:
- 创建一个添加快捷方式的Intent,该Intent的action属性值是“com.android.launcher.action.INSTALL_SHORTCUT”;
- 通过该Intent添加Extra属性来设置快捷方式的标题、图标以及快捷方式要启动的应用程序;
- 调用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>