环境是高通8909平台,默认使用Launcher3作为主应用。
众所周知,当删除一个apk后,图标会消失,但是位置还是留着的,这种现象非常正常,我觉得没有什么反人类的。
但是,骁龙相机有一个功能,收到开机广播会检测是否有相机模组,没有就会自动删除图标。
这样就会导致一个问题,每次恢复出厂设置,没有操作,桌面就会有一块空缺,甚至用户会看到图标消失的过程。
我目前的修改方案并不能让用户体验拔群,也是会有消失的过程,并且还会闪一下,图标全部消失,重新排列。
这个鸡肋功能我也头痛了2天,根本没有相关的解答,偶然解看到一篇描述Launcher3方法的详解:
Android Launcher分析和修改4——初始化加载数据
里面有一个方法描述:
startBinding():通知Launcher开始加载数据。清空容器数据,重新加载
我Peter Tingle了一下,想了这个方案:
Index: packages/odm/apps/Launcher3N/src/com/android/launcher3/LauncherModel.java
===================================================================
--- packages/odm/apps/Launcher3N/src/com/android/launcher3/LauncherModel.java (版本 735)
+++ packages/odm/apps/Launcher3N/src/com/android/launcher3/LauncherModel.java (工作副本)
@@ -125,10 +125,6 @@
// need to do a requery. These are only ever touched from the loader thread.
private boolean mWorkspaceLoaded;
private boolean mAllAppsLoaded;
+ private static final String SNAPCAM = "org.codeaurora.snapcam";
private boolean mSyncIsPending = false;
private int mSyncBindPage;
@@ -1478,17 +1474,6 @@
return false;
}
+ boolean isPackageNeedForceReload(String pkgName) {
+ switch (pkgName) {
+ case SNAPCAM:
+ return true;
+ }
+ return false;
+ }
@@ -3124,17 +3109,6 @@
Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
if (callbacks == cb && cb != null) {
callbacks.bindComponentsRemoved(removedPackageNames, removedApps);
+ for (AppInfo a : removedApps) {
+ if (isPackageNeedForceReload(a.componentName.getPackageName())) {
+ Log.d(TAG, "removedApps = " + a.componentName.getPackageName() + " and force to reload!");
+ callbacks.startBinding();
+ resetLoadedState(true, true);
+ startLoader(true, PagedView.INVALID_RESTORE_PAGE,
+ LauncherModel.LOADER_FLAG_CLEAR_WORKSPACE);
+ }
+ }
}
}
});