需要在电脑上下载一个SQLite
Database
Browser软件,直接在百度里搜索一下下载就可以了:
二、修改步骤
1、用RE管理器提取launcher.db
在:/data/data/com.android.launcher/databases/launcher.db
com.android.launcher是桌面数据存放的文件夹,而launcher.db主要存放了桌面图标信息。
2、launcher.db是个SQLite数据库文件,所以找一个PC端的SQLite数据库软件打开它,如下图。红框中是这个数据库文件中存在的表,包括三个:android_metadata、favorites、gestures。图标数据存放在
favorites
表中。
3、favorites
表的字段结构:这些字段是对图标进行自定义、批量整理的一些可设置参数。
4、再来看
favorites
表的内容。如果要将桌面上的某个程序图标删除,直接删除这里的相应行即可。
5、把系统自带的“图库”程序图标从桌面上删除:
6、删除后退出程序,将
lanucher.db
上传回手机系统路径
/data/data/com.android.launcher/databases/launcher.db
覆盖原有文件,然后重启。
1、Launcher进程启动过程可以由下面图看到Launcher进程是如何被创建启动:
Activity Manager通过发送Intend来启动Launcher。
Intent intent = new Intent(mTopAction, mTopData != null ?
Uri.parse(mTopData) : null)
intent.setComponent(mTopComponent)
if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL)
{
intent.addCategory(Intent.CATEGORY_HOME)
}
startActivityLocked(null, intent, null, null, 0, aInfo,
null, null, 0, 0, 0, false, false)
复制代码
因此,如果你要开机启动一个替换Launcher的程序,只要在程序<intent-filter>里面加入action.MAIN 、
category.HOME、category.DEFAULT就可以。如果出现多个程序都加入这种intent,系统会d出让你选择
哪个作为启动器。
2、Launcher初始化——LauncherApplication。
Application类,我想大部分做Android应用的朋友都用过,每个Android应用默认都有一个Application类,
你也可以继承Application类,然后加入自己代码。Application是一个全局的应用类,在AndroidManifest.xml
我们也可以找到Application标签。
<application
android:name="com.android.launcher2.LauncherApplication"
android:label="@string/application_name"
android:icon="@drawable/ic_launcher_home"
android:hardwareAccelerated="@bool/config_hardwareAccelerated"
android:largeHeap="@bool/config_largeHeap"
android:configChanges="locale">
</application>
复制代码
Android四大组件的声明都需要放到application标签里面,默认使用的是系统的Application类,如果你在项目里面重载了它。就需要在标签,name属性下写上你的新的Application类名。Launcher里面就是继承了Application为LauncherApplication。应用启动的时候首先会加载Application。我们可以看到Launcher主类Launcher.java的onCreate函数里面,第一个就是获取Application的实例。
LauncherApplication app = ((LauncherApplication)getApplication())
复制代码
接下来我们看看LauncherApplication里面初始化,LauncherApplication大部分工作就是在初始化完成,剩下都是一些返回接口。
@Override
public void onCreate()
{
super.onCreate()
//获取屏幕大小,主要用来区分手机还是平板
final int screenSize = getResources().getConfiguration().screenLayout &
Configuration.SCREENLAYOUT_SIZE_MASK
sIsScreenLarge = screenSize == Configuration.SCREENLAYOUT_SIZE_LARGE ||
screenSize == Configuration.SCREENLAYOUT_SIZE_XLARGE
//屏幕密度
sScreenDensity = getResources().getDisplayMetrics().density
//IconCahe里面保存了界面所有应用图标的绘画需要的数据,这个到时候具体分析再说。
//加入这东西的主要原因是为了提高绘画界面的效率
mIconCache = new IconCache(this)
//数据库加载类,LauncherModel是Launcher里面非常重要的一个类,相当于MVC模式里面的
//Model功能,管理数据和初始化数据
mModel = new LauncherModel(this, mIconCache)
//下面注册了一些监听器,主要包含APK文件更新删除等数据变化的时候接收的通知
//接收通知后,主要是用来更新Launcher里面的数据库。因为桌面应用图标数据,只会加载一次
IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED)
filter.addAction(Intent.ACTION_PACKAGE_REMOVED)
filter.addAction(Intent.ACTION_PACKAGE_CHANGED)
filter.addDataScheme("package")
registerReceiver(mModel, filter)
filter = new IntentFilter()
filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE)
filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE)
filter.addAction(Intent.ACTION_LOCALE_CHANGED)
filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED)
registerReceiver(mModel, filter)
filter = new IntentFilter()
filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED)
registerReceiver(mModel, filter)
filter = new IntentFilter()
filter.addAction(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED)
registerReceiver(mModel, filter)
//contentresolver则是用于管理所有程序的contentprovider实例
ContentResolver resolver = getContentResolver()
//注册内容观察者,监听application数据库变化,回调
resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true, mFavoritesObserver)
}
复制代码
上面是LauncherApplication最主要的工作,初始化整个Launcher的一些关键类,和注册一些监听器。主要都是用来监听应用的安装更新删除等导致Launcher数据库变化的 *** 作。Launcher数据都是使用contentprovider来提供数据。其中注册的监听接口是
private final ContentObserver mFavoritesObserver = new ContentObserver(new Handler())
{
@Override
public void onChange(boolean selfChange)
{
//重新加载界面数据
mModel.startLoader(LauncherApplication.this, false)
}
}
复制代码
LauncherSettings.Favorites.CONTENT_URI里面数据发生变化的时候,都会调用mModel.startLoader()接口,
重新加载Launcher的数据。startLoader的具体 *** 作,我后面分析LauncherModel类的时候会分析。这一块涉及
Launcher所有数据加载。剩下的接都是返回初始化时候创建的对象或者获取屏幕密度、获取是否大屏幕。
后面很多处理都需要判断是否是大屏幕,4.0以后手机平板都共用一套系统,导致多了很多处理。 3、Launcher.java初始化Launcher.java是Launcher里面最主要的类,是一个Activity。启动的第一个组件。既然是Activity,我们要分析它初始化,毫无疑问,需要找到onCreate()里面分析。把主要一些分析用注释方式写在代码里面,这样比较方便阅读。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)