当前位置:首页 » 操作系统 » launcher3源码

launcher3源码

发布时间: 2022-08-11 04:03:30

‘壹’ Launcher3是什么意思啊

Launcher3的意思:启动器3。

Launcher是安卓系统中的桌面启动器,安卓系统的桌面UI统称为Launcher。Launcher是安卓系统中的主要程序组件之一,安卓系统中如果没有Launcher就无法启动安卓桌面,Launcher出错的时候,安卓系统会出现“进程 com.android.launcher 意外停止”的提示窗口。这时需要重新启动Launcher。

(1)launcher3源码扩展阅读:

Launcher的界面的rootview是DragLayer,它是一个FrameLayout,在它上面workspace(应该说是celllayout)占了绝大部分的空间,celllayout的参数文件是workspace_screen.xml。

workspace既是一个DropTarget又是一个DragSource,可以从AllAppGridView中拖出应用程序放在它上面,也可以把它里面的item拖走删除或者拖到bottombar里面去。

对于想修改launcher的同学,可以自定义DragLayer.java,比如改为AbsoluteLayout等,再修改launcher.xml布局文件,就可以实现各种样式的launcher界面。

‘贰’ 怎么在Android Launcher3源码的主菜单界面中加入menu功能

在Launcher.java:
private static final int MENU_GROUP_WALLPAPER = 1;
/// M: menu group for settings and apps item, add for OP09.
private static final int MENU_GROUP_SETTINGS = 2;
private static final int MENU_GROUP_APPS = 3;

private static final int MENU_WALLPAPER_SETTINGS = Menu.FIRST + 1;
private static final int MENU_MANAGE_APPS = MENU_WALLPAPER_SETTINGS + 1;
private static final int MENU_SYSTEM_SETTINGS = MENU_MANAGE_APPS + 1;
private static final int MENU_HELP = MENU_SYSTEM_SETTINGS + 1;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (isWorkspaceLocked()) {
return false;
}

super.onCreateOptionsMenu(menu);

Intent manageApps = new Intent(Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS);
manageApps.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
Intent settings = new Intent(android.provider.Settings.ACTION_SETTINGS);
settings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
String helpUrl = getString(R.string.help_url);
Intent help = new Intent(Intent.ACTION_VIEW, Uri.parse(helpUrl));
help.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

menu.add(MENU_GROUP_WALLPAPER, MENU_WALLPAPER_SETTINGS, 0, R.string.menu_wallpaper)
.setIcon(android.R.drawable.ic_menu_gallery)
.setAlphabeticShortcut('W');
menu.add(MENU_GROUP_APPS, MENU_MANAGE_APPS, 0, R.string.menu_manage_apps)
.setIcon(android.R.drawable.ic_menu_manage)
.setIntent(manageApps)
.setAlphabeticShortcut('M');
menu.add(MENU_GROUP_SETTINGS, MENU_SYSTEM_SETTINGS, 0, R.string.menu_settings)
.setIcon(android.R.drawable.ic_menu_preferences)
.setIntent(settings)
.setAlphabeticShortcut('P');
if (!helpUrl.isEmpty()) {
menu.add(0, MENU_HELP, 0, R.string.menu_help)
.setIcon(android.R.drawable.ic_menu_help)
.setIntent(help)
.setAlphabeticShortcut('H');
}

return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
/// M: show options menu when in workspace state
if (mState == State.WORKSPACE && !mWorkspace.isInOverviewMode()) {
mWorkspace.enterOverviewMode();
}else if (mState==State.APPS_CUSTOMIZE){
return true;
}
return false;
}

‘叁’ Android Launcher 如何去掉主菜单,所有应用摆在桌面,类似小米桌面

那个桌面就是那样的改不了,你可以下载一个桌面替代他,比如GO桌面,小米桌面我没试过能否下载,你也可以搜索下。应该也是可以的。系统设置里面可以设置默认使用哪个桌面。

。。。。。。晕原来你是搞开发的呀,你可以把所有图标都放到workspace上,把应用列表屏蔽了,workspace的数据来源于LauncherModler类,里面会读一个数据库得到一个列表,然后再数据绑定把这个列表啪啪啪显示到workspace上,你可以去修改那个读数据库的方法,想办法把所有应用都加到那个列表上去。

‘肆’ android源码中有launcher2launcher3,用的是哪个

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,系统会弹出让你选择
哪个作为启动器。

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()里面分析。把主要一些分析用注释方式写在代码里面,这样比较方便阅读。

‘伍’ 有没有人分享一下修改launcher的历程

我自己总结的,ubuntu和windows下几种不同的修改Launcher的方法:

总共有三大类:
#################
第一类,改签名:
#################
前面几个步骤ubuntu和windows通用:
=====================================================================================================
1 eclipse中新建android project,选择create project from existing source,去android源码目录下的packages/apps下找到相应的文件夹。(直接修改的是源码,所以需要先打包备份一下)然后选择build target之后finish,可能会等待一段时间。

2 导入完成后,src全是错误,由于在Android源码中,很多方法、成员、类、包都被打上@hide标签,这些成员在SDK中没有公开,以至于在编译Launcher源码时最常遇到的类android.view.View的成员mScrollX无法访问
。以Launcher2为例,我们用到的有:(生成的包的路径为out/target/common/obj/JAVA_LIBRARIES)
1)framework_intermediates/classes.jar :这个主要是android的框架类
2)android-common_intermediates/classes.jar :这个包含com.android.common.Search这个类
3)core_intermediates/classes.jar :这个包包含dalvik.system.VMRuntime这个类
右键工程名称然后选择Build Path->Configure Build Path...->Libraries->Add Library->User Library->User Libraries...->New...
然后将上面3个依赖的包一个个的加入进来,分别命名为android_framework,android_common,android_core.
将3个包加入进来后,然后还需要将它们放到android2.3.3这个包的前面,可以在Build Path配置中选择Order and Export
这时候就会发现Launcher2工程以及没有错误了,也可以编译了。(其他的模块可能需要别的jar包,都在out/target/common/obj/JAVA_LIBRARIES下能找到).
=====================================================================================================

然后:
===================================================================================================
windows环境下:工程现在是不能直接运行的,因为eclipse默认的debug签名跟模拟器中的系统签名不相符合。因此,因此,需要手动签名。

3 用eclipse导出没有签名的版本,右键工程,android tools->export unsigned application package,得到未签名的apk包。

4 在build\target\proct\security下都是一些公钥和密钥,system版本的公钥和密钥是platform.pk8和platform.x509.pem两个文件,shared版本的公钥和密钥是shared.pk8和shared.x509.pem两个文件。模块应用是什么版本的可以查看AndroidManifest.xml文件,android:sharedUserId="android.uid.system" 表示是system版android:sharedUserId="android.uid.shared"是shared版。除了公钥密钥之外,还需要签名的包即signapk.jar,它在out/host/linux-x86/framework下。

5 将这些工具准备好后,就能打出签名包了。比如我的为签名apk是Launcher.apk并且是shared版本。因此java -jar signapk.jar share.x509.pem shared.pk8 Launcher.apk Launcher-signed.apk(system版本就用platform.pk8和platform.x509.pem相应的替换一下)

6 得到了签名包之后,adb install -r Lancher-signed.apk就行了,直接替换掉原来的Launcher。
=====================================================================================================
ubuntu环境下:利用android源码提供的工具自动签名
3 编译源码

4 gedit .bashrc 最后面添加
export PATH=$PATH:/home/xxx/android/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT=/home/xxx/android/out/target/proct/generic
其中的/home/xxx/android是源码目录

5 然后启动模拟器,命令为emulator

6 在eclipse中修改好源码模块比如Launcher2之后,将工程放到android源码目录下的packages/apps下,删除掉自动生成的一些文件,比如bin,assets,gen等等。跟其他模块文件保持一致。

7 android源码目录下执行 . build/envsetup.sh 这个时候多出mm,mmm等命令,进入修改过后的那个模块目录下,比如packages/apps/Launcher2/下,执行mm,会自动生成已经签名过的apk文件,放在out/target/proct/generic/system/app下。

8直接adb install -r out/target/proct/generic/system/app/Launcher2.apk即可。

=====================================================================================================
注意:以上的签名跟源码相关,如果源码只是generic的也就是模拟器版,那么编译出来的也只能在模拟器上跑,若要在真机上跑,则需要真机的签名库,可惜没有- -,所以需要:

##################
第二类,改包名。
##################

照常理说,应该很简单,直接在src下的包上F2,然后修改。但是我的机器这个eclipse很奇怪,总有各种问题,现在总结下:
1.导入工程,备份一下AndroidManifest.xml,原因下面有。F2修改包名,修改的时候下面四个选项都选上。

2.修改AndroidManifest.xml
将备份的AndroidManifest.xml换回来,然后ctrl+f,替换全部的原来包名为你现在的,比如之前是com.android.launcher2,现在换成com.pqrs.launcherEx。然后将android:sharedUserId="XXX"这句话删掉。(这么做的原因是,在第一步中可能已经自动的替换了一些这个xml文件的东西,但是我这eclipse乱七八糟的,缺字或者其他什么的,此时文件已经损坏了。所以第一步之前,需要备份一下AndroidManifest.xml,在这个步骤中替换回来,然后ctrl+f进行替换。)

3.保存后会有提示,说这个文件变化了,是否作出其他变更,点击yes。然后res下可能会有一些错误,打开那些xml文件,一般都是有些资源引用还是之前的com.android.launcher2,相应的都该成com.pqrs.launcherEx.
比如<favorites xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher2">改为<favorites xmlns:launcher="http://schemas.android.com/apk/res/com.pqrs.launcherEx">

4.由于AndroidManifest.xml中的包名改了,gen目录下的自动生成文件也会跟着变化,但是src下的java文件引用的R文件路径还没便过来,还需要更正过来。方法:包名上ctrl+h,选择file search,在Containing text下输入之前的import语句,比如是import com.android.launcher2.R;在File name patterns:中填入*.java(表示搜索java文件)scope下选择Selected resources,然后点击Replace进行全局替换。

5.如果都顺利的话,现在这就是一个新的工程了,直接在eclipse中修改运行即可,而且不限操作系统。

====================================================================================================

#############################################
第三类,网上流传的,最传统的方法,只限于ubuntu下。
##############################################

1、建立基本的Android开发环境
请参考官方文档或<<Android模拟器在Ubuntu8.10的安装>>

2、编译Android源码
Android源码根目录下通过make进行编译,请注意一些配置,具体可参考<<android源码的编译>>

3、把eclipse工程配置文件复制到Android源码根目录下
cp development/ide/eclipse/.classpath ./
chmod u+w .classpath # Make the writable
4、修改eclipse程序的配置
1)、增大eclipse内存设置
把eclipse.ini(在eclipse软件的安装目录下)的3个值改为下面的值:
-Xms128m
-Xmx512m
-XX:MaxPermSize=256m
2)、把Android-formatting.xml和android.importorder导入eclipse(可选)
Android-formatting.xml、.classpath和android.importorder都放在development/ide/eclipse/下
Android-formatting.xml用来配置eclipse编辑器的代码风格;android.importorder用来配置eclipse的import的顺序和结构。
在window->preferences->java->Code style->Formatter中导入Android-formatting.xml
在window->preferences->java->Code style->Organize Imports中导入Android.importorder
3)、安装anyedit插件(可选)
在http://andrei.gmxhome.de/anyedit/下载并导入eclipse中

5、把Android源码作为一个工程导入eclipse
导入前先检查.classpath里的文件在Android源码中是否有相应的文件(文件夹),否则也会破坏android源码(一般是多添加文件/文件夹),.classpath里多余的路径可删除
新建Java Project(不是Android project,否则会破坏android源码),www.linuxidc.com选择从已存在的工程导入,工程名任意,完成。
导入时,eclipse要build工程,比较慢。导完后,一般都没有错误。
这里也就回答了第4个问题

6、eclipse上调试Android里的程序。
为了不让其它版本的Android工具和android文件系统影响下面的编译和调试,需要从环境变量中去除android工具和android文件系统的路径:
vim ~/.bashrc
看看有没有在PATH变量中加入Android工具和android文件系统的路径,如果加有,则注释它。通过下面的方法,我们是不需要在.bashrc中添加android工具和android文件系统的路径的
执行:
cd Android源码目录
. build/envsetup.sh #设了环境变量之后,会多出mmm等命令,可以通过输入help来查看
lunch 1 # 把emulator等工具和ramdisk.img等文件的路径对应起来,就可以直接调用emulator等工具,也解决了第3个问题
emulator &
ddms &
注意,先启动ddms,再启动eclipse,这样eclipse中就不会说端口冲突
然后在eclipse中配置调试类型和端口:
在Run->Debug Configurations->Remote java application上双击,然后,”Host:”设为localhost,”Port:”设为8800,”Connection Type”为Standard(Socket Attach)
然后“Apply”
注意,上面设置的端口要与DDMS中设置的端口一致,ADT插件使用了8700端口,因此上面设置的端口是8800。如果出现连不到VM的错误时,请注意,要先在DDMS中选中某一进程(对应某一应用程序),才能在eclipse执行 Debug。
在eclipse调试时,可以设断点、单步调试。估计google团队也是这样开发、调试Android应用程序的

7、编译Android源码
执行:
cd Android源码目录
. build/envsetup.sh
那 么就会多出mm/mmm等命令,mm/mmm用来编译模块(包括C、C++、JAVA程序)。我们也可以直接在 Android源码根目录下执行“make 模块名”来编译模块(模块名可以在.mk文件中找到)。模块编译后会在out/target/proct/generic/system/app下生 成对应的.apk包。但是,用mm/mmm来编译生成的.apk并不会打包到system.img中,需要我们手动通过make snod把 system文件夹打包为system.img,不过这就得重新运行模拟器了,这也是很麻烦了。对于我们开发者来说,我们可以这样做:
1)把需要修改、调试的模块(比如AlarmClock.apk)从/system/app下移除,然后make snod,这样system.img就没有AlarmClock.apk了。
2)运行模拟器,就看不到AlarmClock了
3)修改AlarmClock源码并用mm/mmm来编译,在/system/app下生成AlarmClock.apk
4)通过adb把AlarmClock.apk安装到Android文件系统中,安装方法有两个:
A、通过adb install xxx/AlarmClock.apk
B、通过adb push xxx/AlarmClock.apk /data/app
两 种方法都可以把 AlarmClock安装到/data/app下,Android会自动把它显示在主菜单中(只要AlarmClock.apk中有一Activity包 含android.intent.category.LAUNCHER属性),不过A方法在/data/app生成 com.android.alarmclock.apk,B方法则是 AlarmClock.apk。用A方法时,如果原来已经安装了 AlarmClock,你还得先adb uninstall 它,而B方法则不用。推荐使用B方法。同样,卸载可以通过adb uninstall或adb shell rm xxx/xxx.apk来,也推荐用删除的方法来卸载

‘陆’ 如何在Eclipse中调试Launcher源码

要在eclipse中运行launcher代码首先要有launcher源码以及相关的运行库文件,
下载完了之后将其解压,里面有两个文件夹,一个是Launcher源码,另一个是Launcher的运行库,
将Launcher源码导入eclipse

下面开始导库,我们刚刚下载来那个文件有个叫做“classes库”的文件夹,里面装的就是库了,注意哪些文件夹的名字,等一下要用的哦。

在eclipse中右键项目名选择Properties,这时会出现这个东西

点击Java Build Path

从下面的这步开始就是添加每个库的操作了,等一下需要将以下的步骤重复:


这里填的名字就写下载来的库对应文件夹的名称,比如:android-common_intermediates

找到android-common_intermediates文件夹里面的classes.jar文件

这时已经成功添加完了一个库

重复以上步骤,将所有的库都添加完,

然后点击OK

点击Finish

点击Order and Export

把刚才添加的3个都选中,再点击Top

点击OK

这时项目已经不再报错

如果你项目还报错的话,请Clean一下你的项目,Clean项目应该懂吧,点击eclipse的Project选择Clean,再把你要Clean的项目勾选上点击OK。

如果我们此时运行项目的话,很多情况下都是安装不了的,因为你的项目现在的包名是“com.android.launcher2”,而你设备上launcher的包名也很有可能是这个包名,由于包名一样而签名不同,所以会安装失败。那么我们就要把现在项目的包名改一下。

下面介绍一种改包名的方法,可以将整个项目中用到包名的地方都改到,而且还是一种比较快的方式(我以把“com.android.launcher2”改成“com.android.li.launcher2”为例):

鼠标右键包名--->Refactor--->Raname

把这个地方改了

改成“com.android.li.launcher2”

这里的包名已经改好了,不过还要将整个项目中用到包名的地方都替换成现在的包名。

点击“Search”--->“File”

勾选上“Enclosing projects”,点击“Replace”

看看项目还有没有报错,如果项目还有报错的话,Clean一下项目就可以的了(怎样Clean项目前面已经说过了),如果你Clean了之后还有报错的话,那很有可能就是你在操作上有问题了,仔细找找看哪里弄错了吧。

这是没有做过修改的launcher4.2,看看它在4.2模拟器上的运行效果吧:

到此为止launcher4.2已经完美的跑起来了,和自己说声辛苦啦,呵呵!

‘柒’ Android的Launcher3源码中,FocusIndicatorView有什么作用

1、Launcher进程启动过程可以由下面图看到Launcher进程是如何被创建启动:ActivityManager通过发送Intend来启动Launcher。Intentintent=newIntent(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的程序,只要在程序里面加入action.MAIN、category.HOME、category.DEFAULT就可以。如果出现多个程序都加入这种intent,系统会弹出让你选择哪个作为启动器。2、Launcher初始化——LauncherApplication。Application类,我想大部分做Android应用的朋友都用过,每个Android应用默认都有一个Application类,你也可以继承Application类,然后加入自己代码。Application是一个全局的应用类,在AndroidManifest.xml我们也可以找到Application标签。复制代码Android四大组件的声明都需要放到application标签里面,默认使用的是系统的Application类,如果你在项目里面重载了它。就需要在标签,name属性下写上你的新的Application类名。Launcher里面就是继承了Application为LauncherApplication。应用启动的时候首先会加载Application。我们可以看到Launcher主类Launcher.java的onCreate函数里面,第一个就是获取Application的实例。LauncherApplicationapp=((LauncherApplication)getApplication());复制代码接下来我们看看LauncherApplication里面初始化,LauncherApplication大部分工作就是在初始化完成,剩下都是一些返回接口。@OverridepublicvoidonCreate(){super.onCreate();//获取屏幕大小,主要用来区分手机还是平板finalintscreenSize=getResources().getConfiguration().screenLayout&Configuration.SCREENLAYOUT_SIZE_MASK;sIsScreenLarge=screenSize==Configuration.SCREENLAYOUT_SIZE_LARGE||screenSize==Configuration.SCREENLAYOUT_SIZE_XLARGE;//屏幕密度sScreenDensity=getResources().getDisplayMetrics().density;//IconCahe里面保存了界面所有应用图标的绘画需要的数据,这个到时候具体分析再说。//加入这东西的主要原因是为了提高绘画界面的效率mIconCache=newIconCache(this);//数据库加载类,LauncherModel是Launcher里面非常重要的一个类,相当于MVC模式里面的//Model功能,管理数据和初始化数据mModel=newLauncherModel(this,mIconCache);//下面注册了一些监听器,主要包含APK文件更新删除等数据变化的时候接收的通知//接收通知后,主要是用来更新Launcher里面的数据库。因为桌面应用图标数据,只会加载一次IntentFilterfilter=newIntentFilter(Intent.ACTION_PACKAGE_ADDED);filter.addAction(Intent.ACTION_PACKAGE_REMOVED);filter.addAction(Intent.ACTION_PACKAGE_CHANGED);filter.addDataScheme("package");registerReceiver(mModel,filter);filter=newIntentFilter();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=newIntentFilter();filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);registerReceiver(mModel,filter);filter=newIntentFilter();filter.addAction(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED);registerReceiver(mModel,filter);//contentresolver则是用于管理所有程序的contentprovider实例ContentResolverresolver=getContentResolver();//注册内容观察者,监听application数据库变化,回调resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI,true,mFavoritesObserver);}复制代码上面是LauncherApplication最主要的工作,初始化整个Launcher的一些关键类,和注册一些监听器。主要都是用来监听应用的安装更新删除等导致Launcher数据库变化的操作。Launcher数据都是使用contentprovider来提供数据。其中注册的监听接口是=newContentObserver(newHandler()){@OverridepublicvoidonChange(booleanselfChange){//重新加载界面数据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()里面分析。把主要一些分析用注释方式写在代码里面,这样比较方便阅读。

‘捌’ android 7.0 launcher3 编译报错:

编译过程中报错提示如下:
make: *** No rule to make target `out/target/common/obj/JAVA_LIBRARIES/libprotobuf-Java-2.3.0-nano_intermediates/javalib.jar', needed by `out/target/common/obj/APPS/Launcher3_intermediates/classes-full-debug.jar'. Stop.

原生的SDK居然报错,没办法只能着手分析了。从字面分析来看是编译需要的protobuf jar包没有build进去导致的,先看看是哪个相关的包。
host-libprotobuf-java-2.3.0-nano.jar这个jar包没编译出来,看了下源码的mk文件,是有相关的编译配置的,于是想想是不是有编译依赖包相关的指令,
网上一找,还真有mma,于是mma一敲,哗啦啦的过了。
网上有很多介绍的文章是在eclips中导入应用进行编译的,此处就不作分析了。回头有空研究下这些个编译指令。。。

‘玖’ launcher3已停止运行是什么意思怎么修复

launcher3是android系统中谷歌做 的桌面,其他厂商改源码改出问题来了。

1、官网下载固件刷机。
2、找客服。

热点内容
安卓网络编程怎么用 发布:2025-01-16 03:04:45 浏览:899
湖南it服务器怎么样 发布:2025-01-16 03:01:01 浏览:248
图中两种配置哪个好 发布:2025-01-16 02:59:28 浏览:582
如何解开密保密码 发布:2025-01-16 02:57:44 浏览:23
中国银行查询密码是什么 发布:2025-01-16 02:33:20 浏览:794
坚果pro录音文件夹 发布:2025-01-16 02:31:46 浏览:942
支付宝的登录密码忘记了如何改 发布:2025-01-16 02:30:30 浏览:224
解压作业泥 发布:2025-01-16 02:28:02 浏览:810
我的世界rpg服务器空岛 发布:2025-01-16 02:26:49 浏览:93
ps脚本函数 发布:2025-01-16 02:15:28 浏览:484