launcher3源码_launcher3安装

hacker|
119

文章目录:

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().screenLayoutConfiguration.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来提供数据。其中注册的监听接口是privatefinalContentObservermFavoritesObserver=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()里面分析。把主要一些分析用注释方式写在代码里面,这样比较方便阅读。

请问如何在Eclipse中编译Launcher源码?

不要瞎搞,lanuch的编译是不能在eclipse下完成的。除了SDK中将部分framework代码隐藏导致编译出错以外,lanuch在编译后需要使用系统签名文件进行签名。这个在eclipse下是无法完成的。因此编译lanuch等系统应用,需要在命令行使用mmm或者make来根据android.mk进行编译。

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

3条大神的评论

  • avatar
    访客 2022-07-14 上午 10:23:33

    ication标签。applicationandroid:name="com.android.launcher2.LauncherApplication"android:label="@string/application_na

  • avatar
    访客 2022-07-14 上午 12:56:30

    听接口是privatefinalContentObservermFavoritesObserver=newContentObserver(newHandler())

  • avatar
    访客 2022-07-14 上午 08:20:48

    在代码里面,这样比较方便阅读。

发表评论