Launcher 在配置文件中配置桌面快捷方式->代码分析

在res/xml文件夹下面 default_workspace创建一个资源文件,格式如下:
 
   
<?xml version="1.0" encoding="utf-8"?>
<favorites xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher">
<favorite
launcher:packageName="tv.tur"
launcher:className="tv.tur.HomeActivity"
launcher:screen="3"
launcher:x="0"
launcher:y="0" />
</favorites>
在launcher中的 LauncherProvider的 DatabaseHelper数据库类中 的onCreate方法中进行初始化
代码如下:
 
    
if (!convertDatabase(db)) {
// Populate favorites table with initial favorites
switch (best_versions) {
case 0:
loadFavorites(db, R.xml.default_workspace);
break;
case 1:
loadFavorites(db, R.xml.default_workspace_version_one);
break;
default:
break;
}
}
在该loadFavorites中进行初始化:
 
    
private int loadFavorites(SQLiteDatabase db, int workspaceResourceId) {
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
---------------
...
---------------
//对应的是几个favorite的值
TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.Favorite);
....
String screen = a.getString(R.styleable.Favorite_screen);
String x = a.getString(R.styleable.Favorite_x);
String y = a.getString(R.styleable.Favorite_y);
....
values.clear();
values.put(LauncherSettings.Favorites.CONTAINER, container);
values.put(LauncherSettings.Favorites.SCREEN, screen);
values.put(LauncherSettings.Favorites.CELLX, x);
values.put(LauncherSettings.Favorites.CELLY, y);
....
if (TAG_FAVORITE.equals(name)) {
long id = addAppShortcut(db, values, a, packageManager, intent);
added = id >= 0;
} else if (TAG_SEARCH.equals(name)) {
added = addSearchWidget(db, values);
} else if (TAG_CLOCK.equals(name)) {
....
}
addAppShortcut里面进行添加快捷方式的信息到数据库如下:
 
    
private long addAppShortcut(SQLiteDatabase db, ContentValues values, TypedArray a,
PackageManager packageManager, Intent intent) {
long id = -1;
ActivityInfo info;
String packageName = a.getString(R.styleable.Favorite_packageName);
String className = a.getString(R.styleable.Favorite_className);
try {
ComponentName cn;
try {
cn = new ComponentName(packageName, className);
info = packageManager.getActivityInfo(cn, 0);
} catch (PackageManager.NameNotFoundException nnfe) {
String[] packages = packageManager.currentToCanonicalPackageNames(
new String[] { packageName });
cn = new ComponentName(packages[0], className);
info = packageManager.getActivityInfo(cn, 0);
}
id = generateNewId();
intent.setComponent(cn);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
values.put(Favorites.INTENT, intent.toUri(0));
values.put(Favorites.TITLE, info.loadLabel(packageManager).toString());
values.put(Favorites.ITEM_TYPE, Favorites.ITEM_TYPE_APPLICATION);
values.put(Favorites.SPANX, 1);
values.put(Favorites.SPANY, 1);
values.put(Favorites._ID, generateNewId());
if (dbInsertAndCheck(this, db, TABLE_FAVORITES, null, values) < 0) {
return -1;
}
} catch (PackageManager.NameNotFoundException e) {
Log.w(TAG, "Unable to add favorite: " + packageName +
"/" + className, e);
}
return id;
}

猜你喜欢

转载自blog.csdn.net/bianjiyuyan/article/details/41083799