首页 Android-launcher源码全面分析

Android-launcher源码全面分析

举报
开通vip

Android-launcher源码全面分析========================Launcher学习========================-1-一、Launcher默认界面配置(default_workspace)--------------------------------------------2-1、界面默认配置文件----------------------------------------------------------------------------2-2、LauncherProvider.java的loadFa...

Android-launcher源码全面分析
========================Launcher学习========================-1-一、Launcher默认界面配置(default_workspace)--------------------------------------------2-1、界面默认配置文件----------------------------------------------------------------------------2-2、LauncherProvider.java的loadFavorites 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 --------------------------------------------3-二、Icon修改、界面布局调整、壁纸设置-------------------------------------------------------5-1、图标大小和标题大小-------------------------------------------------------------------------5-2、Launcher图标加入默认背景--------------------------------------------------------------5-3、更换Launcher默认壁纸---------------------------------------------------------------------7-4、壁纸设置过程:-------------------------------------------------------------------------------8-三、Launcher启动和初始化--------------------------------------------------------------------------9-1、Launcher进程启动过程---------------------------------------------------------------------9-2、Launcher初始化――LauncherApplication---------------------------------------------10-3、Launcher.java初始化------------------------------------------------------------------------12-1、Callbacks接口--------------------------------------------------------------------------------15-2、数据加载流程---------------------------------------------------------------------------------16-3、startLoader()------------------------------------------------------------------------------------16-4、LoaderTask的run()方法--------------------------------------------------------------------16-5、workspace加载数据-------------------------------------------------------------------------17-6、workspace绑定数据-------------------------------------------------------------------------20-7、ALLAPP数据加载绑定--------------------------------------------------------------------22-五、HotSeat分析---------------------------------------------------------------------------------------24-1、Hotseat配置文件-----------------------------------------------------------------------------24-2、Hotseat构造函数-----------------------------------------------------------------------------26-3、Hotseat加载数据-----------------------------------------------------------------------------26-4、Hotseat绑定数据-----------------------------------------------------------------------------27-5、Hotseat类--------------------------------------------------------------------------------------28-6、总结----------------------------------------------------------------------------------------------29-六、页面滑动(PagedView)----------------------------------------------------------------------------29-七、AllApp全部应用列 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf (AppsCustomizeTabHost)-------------------------------------------37-1、AllApp列表配置文件-----------------------------------------------------------------------37-2、AppsCustomizeTabHost分析--------------------------------------------------------------39-3、Tab变化时执行onTabChanged-----------------------------------------------------------40-八、AllApp界面拖拽元素----------------------------------------------------------------------------41-1、触摸拦截---------------------------------------------------------------------------------------41-2、handleTouchEvent方法---------------------------------------------------------------------42-4、拖曳按钮---------------------------------------------------------------------------------------43-九、Launcher启动APP流程------------------------------------------------------------------------44-1、WorkSpace触摸------------------------------------------------------------------------------44-2、CellLayout的onInterceptTouchEvent()方法-------------------------------------------45-3、WorkSpace的onTouch()事件-------------------------------------------------------------46-4、BubbleTextView------------------------------------------------------------------------------46-5、onClick()方法----------------------------------------------------------------------------------48-6、总结----------------------------------------------------------------------------------------------49-========================Launcher学习========================-2-一、Launcher默认界面配置(default_workspace)1、界面默认配置文件在第一次运行Launcher的时候,会读取一个配置xml文件来进行布局,这个配置文件在Launcher目录下,路径是:Launcher/res/xml/default_workspace.xml。default_workspace。xml里面可以配置APP快捷方式、Widget、Search搜索栏等。下面就常用的这几个属性进行解析:<favorite//程序快捷键属性标签launcher:className="com.apical.radio.radioMainActivity"//点击图标时,需要启动的类launcher:packageName="com.apical.radio"//该应用的包名launcher:screen="1"//第1屏,0-4屏共5屏launcher:x="0"//图标X位置,左上角第一个为0,向左递增,0-4共5个l0auncher:y="0"/>//图标Y位置,左上角第一个为0,向下递增,0-2共3个Launcher默认是有5个分屏,不过这个可以配置。同样,每行每列有多少图标也是可以配置的。这里按我修改的是3行5列的界面排布(对应上面的效果图)。一般配置APP的快捷方式,使用上面的属性标签就可以。<appwidget//插件launcher:className="de.dnsproject.clock_widget_main.Clock1AppWidgetProvider"//该应用的类launcher:packageName="de.dnsproject.clock_widget_main"//该应用的包名launcher:screen="1"//第1屏,0-4屏共5屏launcher:x="2"//图标X位置,左上角第一个为0,向左递增,0-4共5个launcher:y="1"//图标Y位置,左上角第一个为0,向下递增,0-2共3个launcher:spanX="3"//在x方向上所占格数launcher:spanY="2"/>//在y方向上所占格数桌面Widget跟桌面快捷方式属性类型,不过这里需要注意launcher:spanX和launcher:spanY这两个属性是说明Widget多大的,这个和Widget的最小宽高配置有关。我们在编写桌面Widget的时候,需要在XML配置文件里面指定Widget最小的宽和高,一般最小宽高计算 公式 小学单位换算公式大全免费下载公式下载行测公式大全下载excel公式下载逻辑回归公式下载 是(minWidth=72*占用格数-2)计算出来,最小高度也是一样。(上面那个模拟时钟是MIUI的时钟)minWidth=72*占用格数-2里面的占用格数就是上面launcher:spanX和launcher:spanY配置的数目。针对上面的效果图,就是占用了3个横向的格子,2个竖向的格子。MinWidth应该等于214。<search//搜索栏launcher:screen="1"//第2屏launcher:x="0"//图标X位置launcher:y="1"/>//图标Y位置这个是搜索栏的配置。至于文件夹,在4.0的Launcher里面是支持的,分析加载函数里面,========================Launcher学习========================-3-可以找到解析文件夹标签的方法。default_workspace.xml中,支持的标签有:favorite:应用程序快捷方式。shortcut:链接,如网址,本地磁盘路径等。search:搜索框。clock:桌面上的钟表Widget//支持的属性有:launcher:title:图标下面的文字,目前只支持引用,不能直接书写字符串;launcher:icon:图标引用;launcher:uri:链接地址,链接网址用的,使用shortcut标签就可以定义一个超链接,打开某个网址。launcher:packageName:应用程序的包名;launcher:className:应用程序的启动类名;launcher:screen:图标所在的屏幕编号;launcher:x:图标在横向排列上的序号;launcher:y:图标在纵向排列上的序号;2、LauncherProvider.java的loadFavorites分析Launcher里面负责解析default_workspace.xml文件的方法是LauncherProvider.java里面的loadFavorites方法。//传入default_workspace文件的资源ID和数据库实例,把xml里面数据解析,保存到Launcher数据库。privateintloadFavorites(SQLiteDatabasedb,intworkspaceResourceId){//.........inttype;while(((type=parser.next())!=XmlPullParser.END_TAG||parser.getDepth()>depth)&&type!=XmlPullParser.END_DOCUMENT){if(type!=XmlPullParser.START_TAG){continue;}booleanadded=false;finalStringname=parser.getName();TypedArraya=mContext.obtainStyledAttributes(attrs,R.styleable.Favorite);longcontainer=LauncherSettings.Favorites.CONTAINER_DESKTOP;if(a.hasValue(R.styleable.Favorite_container)){container=Long.valueOf(a.getString(R.styleable.Favorite_container));}Stringscreen=a.getString(R.styleable.Favorite_screen);Stringx=a.getString(R.styleable.Favorite_x);Stringy=a.getString(R.styleable.Favorite_y);========================Launcher学习========================-4-//Ifweareaddingtothehotseat,thescreenisusedasthepositioninthe//hotseat.Thisscreencan'tbeatposition0becauseAllAppsisinthe//zerothposition.if(container==LauncherSettings.Favorites.CONTAINER_HOTSEAT&&Integer.valueOf(screen)==allAppsButtonRank){thrownewRuntimeException("Invalidscreenpositionforhotseatitem");}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);//解析xml里面的标签,从这里可以找到支持的标签类型和相关属性参数。if(TAG_FAVORITE.equals(name)){longid=addAppShortcut(db,values,a,packageManager,intent);added=id>=0;}elseif(TAG_SEARCH.equals(name)){added=addSearchWidget(db,values);}elseif(TAG_CLOCK.equals(name)){added=addClockWidget(db,values);}elseif(TAG_APPWIDGET.equals(name)){added=addAppWidget(parser,attrs,type,db,values,a,packageManager);}elseif(TAG_SHORTCUT.equals(name)){longid=addUriShortcut(db,values,a);added=id>=0;}elseif(TAG_FOLDER.equals(name)){//.........//folder属性里面的参数要多于2个,才能形成文件夹。if(folderItems.size()<2&&folderId>=0){//WejustdeletethefolderandanyitemsthatmadeitdeleteId(db,folderId);if(folderItems.size()>0){deleteId(db,folderItems.get(0));}added=false;}}if(added)i++;a.recycle();}========================Launcher学习========================-5-//.........returni;}其实就是一个分析XML和写入数据库的过程,LauncherProvider.java是整个Launcher的数据来源,十分重要。二、Icon修改、界面布局调整、壁纸设置1、图标大小和标题大小Android原生图标大小都是通过配置文件设置,配置文件路径是/res/values/dimens.xml。需要注意的是,values对应的文件夹很多,因为是多国语言支持。而dimens.xml在默认的values文件夹下面或者values-land和values-port(针对不同分辨率和平板类型,需要根据你运行情况找对应的dimens修改,如果需要使用多种分辨率,最好所有dimens都修改好)。下面是配置workspace的按钮属性配置。下面是针对values-land修改的cell大小。<!--Workspacecellsize--><dimenname="workspace_cell_width_land">88dp</dimen><dimenname="workspace_cell_width_port">96dp</dimen><dimenname="workspace_cell_height_land">88dp</dimen><dimenname="workspace_cell_height_port">96dp</dimen><dimenname="workspace_width_gap_land">32dp</dimen><dimenname="workspace_width_gap_port">0dp</dimen><dimenname="workspace_height_gap_land">0dp</dimen><dimenname="workspace_height_gap_port">24dp</dimen><!--Folders--><dimenname="folder_preview_size">68dp</dimen><dimenname="folder_cell_width">86dp</dimen><dimenname="folder_cell_height">90dp</dimen><dimenname="folder_width_gap">3dp</dimen><dimenname="folder_height_gap">3dp</dimen><dimenname="folder_padding">6dp</dimen>2、Launcher图标加入默认背景Launcher默认图标是各自应用程序 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 的,这也导致了,界面图标看上去大小不同意,有点凌乱的感觉。如果整个系统是自己修改的,内置应用图标可以设置统一风格大小。如果是第三方程序就很难保证,所以一个折中办法是给所有图标加入一个背景,看上去风格一致。========================Launcher学习========================-6-Launcher图标的获取处理是在Utilities.java类里面,我们可以从里面找到BitmapcreateIconBitmap(Drawableicon,Contextcontext)方法。这个方法就是返回应用图标的。默认createIconBitmap里面有个加入五颜六色背景的方法,不过是屏蔽了,我们可以参考这个方法,加入一个默认背景图。staticBitmapcreateIconBitmap(Drawableicon,Contextcontext){//...............finalintleft=(textureWidth-width)/2;finalinttop=(textureHeight-height)/2;//测试用,加入彩色背景边框if(false){//drawabigboxfortheiconfordebuggingcanvas.drawColor(sColors[sColorIndex]);if(++sColorIndex>=sColors.length)sColorIndex=0;PaintdebugPaint=newPaint();debugPaint.setColor(0xffcccc00);canvas.drawRect(left,top,left+width,top+height,debugPaint);}//增加图标背景图片OWLif(true){BitmapbackBitmap=BitmapFactory.decodeResource(context.getResources(),R.drawable.apical_icon_bg);intbackWidth=backBitmap.getWidth();intbackHeight=backBitmap.getHeight();if(backWidth!=sIconWidth||backHeight!=sIconHeight){Matrixmatrix=newMatrix();matrix.postScale((float)sIconWidth/backWidth,(float)sIconHeight/backHeight);canvas.drawBitmap(Bitmap.createBitmap(backBitmap,0,0,backWidth,backHeight,matrix,true),.0f,0.0f,null);}else{canvas.drawBitmap(backBitmap,0.0f,0.0f,null);}}//................returnbitmap;========================Launcher学习========================-7-}}如图上面代码,加入了R.drawable.apical_icon_bg一张默认的背景图作为背景,这样所有图标看上去大小都是一致的。而且风格也比较接近。对于做系统应用的人来说体验比较好。如果需要一些比较炫的效果,其实可以在这里给图标做倒影或者其他效果。3、更换Launcher默认壁纸Launcher默认的壁纸配置是放在framework下的res下面配置的,图片也是放在framework下面。对于需要做独立Launcher的项目,这个不能离开framework,非常不方便。所以就在Launcher自身实现一个默认壁纸设置的功能。默认壁纸,只能在Launcher第一次运行或者恢复默认设置时才需要设置显示。因此我把默认壁纸设置放在Launcher.java类的onCreate()方法下的showFirstRunWorkspaceCling()执行。showFirstRunWorkspaceCling()方法,只有Launcher第一次启动或者清除数据,恢复设置。才会运行。在showFirstRunWorkspaceCling()里面调用下面的方法privatevoidsetDefaultWallPaper(){//修改默认背景OWLtest,可以在Framework替换默认静态图default_wallpaperWallpaperManagermwallpaerManager;mwallpaerManager=WallpaperManager.getInstance(this);try{mwallpaerManager.setResource(R.drawable.launcher_default_bg);}catch(IOExceptione){Log.e(TAG,"setdefaultwallpapererror");e.printStackTrace();}}Launcher的壁纸都是调用系统WallpaperManager操作的,具体有兴趣可以查看源码。android的静态壁纸,默认是frameworks/base/core/res/res/drawable/default_wallpaper.jpg。如果是做系统的,可以替换这张jpg图片也可以达到替换默认壁纸功能。至于默认动态壁纸,这个要修改/framework/base/core/res/res/values/config.xml。<stringname="default_wallpaper_component">@null</string>//把null修改为具体程序名,如下<stringname="default_wallpaper_component"translatable="false">包名/动态壁纸服务名</string>========================Launcher学习========================-8-另外Launcher自身自带了一些默认壁纸,在Launcher的res/drawable文件夹下,不同分辨率文件夹放了大小不一样。这些默认壁纸在Launcher下values/wallpapers.xml下有配置。<resources><string-arrayname="wallpapers"translatable="false"><item>wallpaper_01</item><item>wallpaper_02</item><item>wallpaper_03</item><item>wallpaper_04</item><item>wallpaper_05</item><item>wallpaper_06</item><item>wallpaper_07</item><item>wallpaper_08</item><item>wallpaper_09</item><item>wallpaper_10</item><item>wallpaper_11</item><item>wallpaper_12</item></string-array></resources>不过系统默认最多是支持24张图片。可以修改壁纸名字或者新增壁纸都是可以的。壁纸名字跟图片名字一一对应。4、壁纸设置过程:具体壁纸操作其实都是在WallpaperChooserDialogFragment这个Fragment里面实现,查找默认壁纸:privatevoidfindWallpapers(){mThumbs=newArrayList<Integer>(24);mImages=newArrayList<Integer>(24);finalResourcesresources=getResources();//Context.getPackageName()mayreturnthe"original"packagename,//com.android.launcher2;Resourcesneedstherealpackagename,//com.android.launcher.SoweaskResourcesforwhatitthinksthe//packagenameshouldbe.finalStringpackageName=resources.getResourcePackageName(R.array.wallpapers);addWallpapers(resources,packageName,R.array.wallpapers);addWallpapers(resources,packageName,R.array.extra_wallpapers);}其中R.array.wallpapers就是上面说的默认壁纸名字的xml配置文件。通过这个文件加载========================Launcher学习========================-9-所有默认壁纸。除了wallpapers还有一个extra_wallpapers。这两个功能原理是一样的。设置壁纸比较简单,跟我们设置默认壁纸一样privatevoidselectWallpaper(intposition){try{WallpaperManagerwpm=(WallpaperManager)getActivity().getSystemService(Context.WALLPAPER_SERVICE);wpm.setResource(mImages.get(position));//设置壁纸Activityactivity=getActivity();activity.setResult(Activity.RESULT_OK);activity.finish();}catch(IOExceptione){Log.e(TAG,"Failedtosetwallpaper:"+e);}}主要还是调用WallpaperManager的setResource方法。三、Launcher启动和初始化开机启动Launcher,Launcher是由ActivityManager启动的,而ActivityManager是由systemserver启动。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);因此,只要在程序<intent-filter>里面加入action.MAIN、category.HOME、category.DEFAULT就可以。========================Launcher学习========================-10-2、Launcher初始化――LauncherApplicationApplication类,我想大部分做Android应用的朋友都用过,每个Android应用默认都有一个Application类,也可以继承Application类,然后加入自己代码。Application是一个全局的应用类,在AndroidManifest.xml我们也可以找到Application标签。<applicationandroid: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的实例。LauncherApplicationapp=((LauncherApplication)getApplication());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);========================Launcher学习========================-11-//下面注册了一些监听器,主要包含APK文件更新删除等数据变化的时候接收的 通知 关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知 //接收通知后,主要是用来更新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的具体操作,我后面分========================Launcher学习========================-12-析LauncherModel类的时候会分析。这一块涉及Launcher所有数据加载。剩下的接都是返回初始化时候创建的对象或者获取屏幕密度、获取是否大屏幕。3、Launcher.java初始化Launcher.java是Launcher里面最主要的类,是一个Activity。启动的第一个组件。既然是Activity,我们要分析它初始化,毫无疑问,需要找到onCreate()里面分析。把主要一些分析用注释方式写在代码里面,这样比较方便阅读。@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);//获取Application实例LauncherApplicationapp=((LauncherApplication)getApplication());//LauncherModel类里面获取Launcher的对象引用mModel=app.setLauncher(this);//获取IconCache,IconCache在Application里面初始化mIconCache=app.getIconCache();mDragController=newDragController(this);mInflater=getLayoutInflater();mAppWidgetManager=AppWidgetManager.getInstance(this);//监听widget改变,以后在Model里面回调处理的结果mAppWidgetHost=newLauncherAppWidgetHost(this,APPWIDGET_HOST_ID);mAppWidgetHost.startListening();//这个是设置Launcher的跟踪调试文件,下面很多信息会写到这个文件里面。if(PROFILE_STARTUP){android.os.Debug.startMethodTracing(Environment.getExternalStorageDirectory()+"/launcher");}//读取本地配置,保存更新配置,清空IconCachecheckForLocaleChange();setContentView(R.layout.launcher);//对所有的UI控件进行加载和配置setupViews();//显示操作提示,第一次启动的时候才会显示showFirstRunWorkspaceCling();//注册监控Launcher数据库变化========================Launcher学习========================-13-registerContentObservers();//锁住APP,初始化不能操作。lockAllApps();mSavedState=savedInstanceState;restoreState(mSavedState);//Updatecustomizationdrawer_after_restoringthestatesif(mAppsCustomizeContent!=null){mAppsCustomizeContent.onPackagesUpdated();}if(PROFILE_STARTUP){android.os.Debug.stopMethodTracing();}//加载启动数据,所有界面数据(快捷方式、folder、widget、allApp)等在loader里面加载,这部分后面我会详细分析。if(!mRestoring){mModel.startLoader(this,true);}if(!mModel.isAllAppsLoaded()){ViewGroupappsCustomizeContentParent=(ViewGroup)mAppsCustomizeContent.getParent();mInflater.inflate(R.layout.apps_customize_progressbar,appsCustomizeContentParent);}//ForhandlingdefaultkeysmDefaultKeySsb=newSpannableStringBuilder();Selection.setSelection(mDefaultKeySsb,0);IntentFilterfilter=newIntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);registerReceiver(mCloseSystemDialogsReceiver,filter);//下面这几个就是Android原生界面上的Market、搜索、声音输入按钮的默认图标显示。booleansearchVisible=false;booleanvoiceVisible=false;//Ifwehaveasavedversionofth
本文档为【Android-launcher源码全面分析】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_399269
暂无简介~
格式:pdf
大小:428KB
软件:PDF阅读器
页数:49
分类:互联网
上传时间:2018-01-27
浏览量:160