首页 文章 精选 留言 我的

精选列表

搜索[默认启用],共10000篇文章
优秀的个人博客,低调大师

Android系统默认Home应用程序(Launcher)的启动过程源代码分析(4)

Step 17.LoaderTask.loadAndBindAllApps 这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中: [java] view plain copy publicclassLauncherModelextendsBroadcastReceiver{ ...... privateclassLoaderTaskimplementsRunnable{ ...... privatevoidloadAndBindAllApps(){ ...... if(!mAllAppsLoaded){ loadAllAppsByBatch(); if(mStopped){ return; } mAllAppsLoaded=true; }else{ onlyBindAllApps(); } } ...... } ...... } 由于还没有加载过应用程序,这里的mAllAppsLoaded为false,于是就继续调用loadAllAppsByBatch函数来进一步操作了。 Step 18.LoaderTask.loadAllAppsByBatch 这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中: [java] view plain copy publicclassLauncherModelextendsBroadcastReceiver{ ...... privateclassLoaderTaskimplementsRunnable{ ...... privatevoidloadAllAppsByBatch(){ ...... finalIntentmainIntent=newIntent(Intent.ACTION_MAIN,null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); finalPackageManagerpackageManager=mContext.getPackageManager(); List<ResolveInfo>apps=null; intN=Integer.MAX_VALUE; intstartIndex; inti=0; intbatchSize=-1; while(i<N&&!mStopped){ if(i==0){ mAllAppsList.clear(); ...... apps=packageManager.queryIntentActivities(mainIntent,0); ...... N=apps.size(); ...... if(mBatchSize==0){ batchSize=N; }else{ batchSize=mBatchSize; } ...... Collections.sort(apps, newResolveInfo.DisplayNameComparator(packageManager)); } startIndex=i; for(intj=0;i<N&&j<batchSize;j++){ //Thisbuildstheiconbitmaps. mAllAppsList.add(newApplicationInfo(apps.get(i),mIconCache)); i++; } finalbooleanfirst=i<=batchSize; finalCallbackscallbacks=tryGetCallbacks(oldCallbacks); finalArrayList<ApplicationInfo>added=mAllAppsList.added; mAllAppsList.added=newArrayList<ApplicationInfo>(); mHandler.post(newRunnable(){ publicvoidrun(){ finallongt=SystemClock.uptimeMillis(); if(callbacks!=null){ if(first){ callbacks.bindAllApplications(added); }else{ callbacks.bindAppsAdded(added); } ...... }else{ ...... } } }); ...... } ...... } ...... } ...... } 函数首先构造一个CATEGORY_LAUNCHER类型的Intent: [java] view plain copy finalIntentmainIntent=newIntent(Intent.ACTION_MAIN,null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 接着从mContext变量中获得PackageManagerService的接口: [java] view plain copy finalPackageManagerpackageManager=mContext.getPackageManager(); 下一步就是通过这个PackageManagerService.queryIntentActivities接口来取回所有Action类型为Intent.ACTION_MAIN,并且Category类型为Intent.CATEGORY_LAUNCHER的Activity了。 我们先进入到PackageManagerService.queryIntentActivities函数中看看是如何获得这些Activity的,然后再回到这个函数中来看其余操作。 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966530,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android系统默认Home应用程序(Launcher)的启动过程源代码分析(3)

Step 13. ActivityStack.startActivityLocked 这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中,具体可以参考Android应用程序启动过程源代码分析一文,这里就不详述了,在我们这个场景中,调用这个函数的最后结果就是把com.android.launcher2.Launcher启动起来,接着调用它的onCreate函数。 Step 14.Launcher.onCreate 这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/Launcher.java文件中: [java] view plain copy publicfinalclassLauncherextendsActivity implementsView.OnClickListener,OnLongClickListener,LauncherModel.Callbacks,AllAppsView.Watcher{ ...... @Override protectedvoidonCreate(BundlesavedInstanceState){ ...... if(!mRestoring){ mModel.startLoader(this,true); } ...... } ...... } 这里的mModel是一个LauncherModel类型的成员变量,这里通过调用它的startLoader成员函数来执行加应用程序的操作。 Step 15.LauncherModel.startLoader 这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中: [java] view plain copy publicclassLauncherModelextendsBroadcastReceiver{ ...... publicvoidstartLoader(Contextcontext,booleanisLaunching){ ...... synchronized(mLock){ ...... //Don'tbothertostartthethreadifweknowit'snotgoingtodoanything if(mCallbacks!=null&&mCallbacks.get()!=null){ //Ifthereisalreadyonerunning,tellittostop. LoaderTaskoldTask=mLoaderTask; if(oldTask!=null){ if(oldTask.isLaunching()){ //don'tdowngradeisLaunchingifwe'realreadyrunning isLaunching=true; } oldTask.stopLocked(); } mLoaderTask=newLoaderTask(context,isLaunching); sWorker.post(mLoaderTask); } } } ...... } 这里不是直接加载应用程序,而是把加载应用程序的操作作为一个消息来处理。这里的sWorker是一个Handler,通过它的post方式把一个消息放在消息队列中去,然后系统就会调用传进去的参数mLoaderTask的run函数来处理这个消息,这个mLoaderTask是LoaderTask类型的实例,于是,下面就会执行LoaderTask类的run函数了。 Step 16. LoaderTask.run 这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中: [java] view plain copy publicclassLauncherModelextendsBroadcastReceiver{ ...... privateclassLoaderTaskimplementsRunnable{ ...... publicvoidrun(){ ...... keep_running:{ ...... //secondstep if(loadWorkspaceFirst){ ...... loadAndBindAllApps(); }else{ ...... } ...... } ...... } ...... } ...... } 这里调用loadAndBindAllApps成员函数来进一步操作。 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966529,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android系统默认Home应用程序(Launcher)的启动过程源代码分析(2)

Step 10. ActivityManagerService.systemReady 这个函数是在上面的Step 6中的ServerThread.run函数在将系统中的一系列服务都初始化完毕之后才调用的,它定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中: [java] view plain copy publicfinalclassActivityManagerServiceextendsActivityManagerNative implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{ ...... publicvoidsystemReady(finalRunnablegoingCallback){ ...... synchronized(this){ ...... mMainStack.resumeTopActivityLocked(null); } } ...... } 这个函数的内容比较多,这里省去无关的部分,主要关心启动Home应用程序的逻辑,这里就是通过mMainStack.resumeTopActivityLocked函数来启动Home应用程序的了,这里的mMainStack是一个ActivityStack类型的实例变量 Step 11. ActivityStack.resumeTopActivityLocked 这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中: [java] view plain copy publicclassActivityStack{ ...... finalbooleanresumeTopActivityLocked(ActivityRecordprev){ //Findthefirstactivitythatisnotfinishing. ActivityRecordnext=topRunningActivityLocked(null); ...... if(next==null){ //Therearenomoreactivities!Let'sjuststartupthe //Launcher... if(mMainStack){ returnmService.startHomeActivityLocked(); } } ...... } ...... } 这里调用函数topRunningActivityLocked返回的是当前系统Activity堆栈最顶端的Activity,由于此时还没有Activity被启动过,因此,返回值为null,即next变量的值为null,于是就调用mService.startHomeActivityLocked语句,这里的mService就是前面在Step 7中创建的ActivityManagerService实例了。 Step 12.ActivityManagerService.startHomeActivityLocked 这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中: [java] view plain copy publicfinalclassActivityManagerServiceextendsActivityManagerNative implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{ ...... booleanstartHomeActivityLocked(){ ...... Intentintent=newIntent( mTopAction, mTopData!=null?Uri.parse(mTopData):null); intent.setComponent(mTopComponent); if(mFactoryTest!=SystemServer.FACTORY_TEST_LOW_LEVEL){ intent.addCategory(Intent.CATEGORY_HOME); } ActivityInfoaInfo= intent.resolveActivityInfo(mContext.getPackageManager(), STOCK_PM_FLAGS); if(aInfo!=null){ intent.setComponent(newComponentName( aInfo.applicationInfo.packageName,aInfo.name)); //Don'tdothisifthehomeappiscurrentlybeing //instrumented. ProcessRecordapp=getProcessRecordLocked(aInfo.processName, aInfo.applicationInfo.uid); if(app==null||app.instrumentationClass==null){ intent.setFlags(intent.getFlags()|Intent.FLAG_ACTIVITY_NEW_TASK); mMainStack.startActivityLocked(null,intent,null,null,0,aInfo, null,null,0,0,0,false,false); } } returntrue; } ...... } 函数首先创建一个CATEGORY_HOME类型的Intent,然后通过Intent.resolveActivityInfo函数向PackageManagerService查询Category类型为HOME的Activity,这里我们假设只有系统自带的Launcher应用程序注册了HOME类型的Activity(见packages/apps/Launcher2/AndroidManifest.xml文件) [html] view plain copy <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.launcher" android:sharedUserId="@string/sharedUserId" > ...... <application android:name="com.android.launcher2.LauncherApplication" android:process="@string/process" android:label="@string/application_name" android:icon="@drawable/ic_launcher_home"> <activity android:name="com.android.launcher2.Launcher" android:launchMode="singleTask" android:clearTaskOnLaunch="true" android:stateNotNeeded="true" android:theme="@style/Theme" android:screenOrientation="nosensor" android:windowSoftInputMode="stateUnspecified|adjustPan"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.HOME"/> <categoryandroid:name="android.intent.category.DEFAULT"/> <categoryandroid:name="android.intent.category.MONKEY"/> </intent-filter> </activity> ...... </application> </manifest> 因此,这里就返回com.android.launcher2.Launcher这个Activity了。由于是第一次启动这个Activity,接下来调用函数getProcessRecordLocked返回来的ProcessRecord值为null,于是,就调用mMainStack.startActivityLocked函数启动com.android.launcher2.Launcher这个Activity了,这里的mMainStack是一个ActivityStack类型的成员变量。 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966528,如需转载请自行联系原作者

优秀的个人博客,低调大师

网络还差两个月启用,芯片和平台已经准备好了

随着可穿戴、车联网、智能抄表等新兴市场的开启,万物互联的时代正加速到来,物与物的连接已经进入增长快车道。 据GSMA预测,到2020年全球互联设备将会到达270亿,其中100亿为移动连接设备。其中,基于具备覆盖优势和成本优势的蜂窝网络,火热的NB-IoT技术未来将覆盖25%的物联网连接。 NB-IoT为何物? NB-IoT,基于蜂窝的窄带物联网(Narrow Band Internet of Things, NB-IoT),就是一种专门用于物联网的通讯技术(比如GSM、WCDMA、LTE都是不同的通讯技术)。 物联网的无线通信技术很多,主要分为两类:一类是Zigbee、WiFi、蓝牙等短距离通信技术;另一类是LPWAN(低功耗广域网),即广域网通信技术,NB-IoT便是其中之一。 由上图可知,全球M2M/IoT的高速率业务主要使用3G、4G技术;中等速率业务主要使用GPRS技术,而低速率业务虽然拥有丰富的应用场景,却缺乏具有针对性的技术。 于是,NB-IoT来了!从技术层面上来讲,NB-IoT有4大技术优势。 首先是覆盖广,相比传统GSM,一个基站可以提供10倍的面积覆盖,还能覆盖到地下;其次是海量连接,200KHz的带宽可以提供10万个联接;第三是低功耗,使用AA电池便可以工作十年,无需充电;第四是低成本,模组成本小于5美金。 未来随着市场发展带来的规模效应和技术演进,NB-IoT的功耗和成本还有望进一步降低。同时,NB-IoT也具有传统蜂窝网技术及蓝牙、Wi-Fi等短距离传输技术无法比拟的优势:在支持大数据方面,NB-IoT可以将连接所收集的数据直接上传云端。 为此,越来越多厂商开始涌入NB-IoT市场,智能抄表、生态农业、智慧停车、智能小区、智能建筑等多样化场景都能找到NB-IoT应用。在市政的路灯和垃圾管理、环境监测和畜牧养殖灌溉等领域,NB-IoT的部署亦日益增多。 从运营商处得到的数据,可以把NB-IoT分为7个目前应用广泛,或马上可以落地的大类: 那么面对全球物联网千亿级的连接,如何抓住NB-IoT技术下的物联网机会呢? 共建NB-IoT生态,拥抱万物互联! 一项技术由纸面到商用离不开一个强大生态系统的支撑,而物联网生态的核心或基础设施就包括以下方面:芯片(含传感器、算法)商、NB-IoT技术提供方、网络运营商、云计算及云服务等。 对于NB-IoT,目前正在逐渐形成包括底层芯片、模组、终端、通讯设备、平台、运营商以及应用的完整产业链。如今,围绕NB-IoT的生态已初步成型,并在持续扩大中,拥抱万物互联的条件开始成熟。 其中,芯片在NB-IoT整个产业链中处于基础核心地位,现在几乎所有主流的芯片和模组厂商都有明确的NB-IoT支持计划,华为、高通、海思、联发科在其中扮演着十分重要的角色。就模组而言,目前华为、中兴已有商用模块,但所有厂家要在四季度才能实现大规模商用、量产。 运营商层面,中国移动、中国联通、中国电信以及沃达丰、德国电信、AT&T等全球顶尖运营商皆就NB-IoT发布了各自的发展计划,并展开试点。就国内而言,目前运营商都在一线城市试点,预计到今年6月,针对NB-IoT的全国运营商网络都会起来,规划到今年年底完成一线城市全覆盖,而中国电信将于今年第二季度完成NB-IoT 全网覆盖。 在终端环节中,各终端厂商摩拳擦掌,2017年无疑是NB-IoT 商用元年,热度持续发酵!由于低功耗广域网络通信技术是大量行业、消费终端所需要的,而终端的种类多种多样,无法形成少数企业拥有大规模终端的市场。 通讯设备供应商层面,华为、中兴、爱立信等领导者均已推出了基于NB-IoT的端到端解决方案。与此同时,NB-IoT亟需为产业链服务的开放云平台,比如万物云,以打破数据收集与处理的碎片化,帮助实现与未来“千亿”的连接。 万物云——因物联网而生,为NB-IoT而用。作为智能硬件大数据免费托管平台,万物云可无限承载海量的物联网和智能设备数据。通过使用多种协议,各种智能设备将安全地向万物云提交产生的设备数据,在服务平台上进行存储和处理,并通过数据应用编程接口向各种物联网应用提供可靠的跨平台的数据查询和调用服务。 其中,万物云提供快捷方便的硬件接入服务,支持HTTP、MQTT、TCP等主流物联网数据通信协议,支持JSON及二进制数据结构格式,以及高并发、低延迟设备数据的提交,数据上报使用了间断式连接,大大降低了设备上的代码足迹和及数据带宽和流量。 对于各种数据,万物云严格按照数据分离的原则在云端存放,可针对智能传感器的数据特点进行存储和查询,无论是上报数据还是数据访问,都必须通过安全验证。同时,万物云的分级缓存入库存储机制,方便高速查询应用和数据,平台也内置数值类数据常用的数值统计和计算功能,还可为设备和数据预设报警机制。 此外,万物云应用编程接口和应用开发包支持 Java、Python,并提供HTTP设备数据快捷访问接口。对于具体操作应用,万物云通过清晰简明的编程实例和接口文档,丰富的案例样本代码、任务向导、视频教程,在线设备和数据调试工具,以及社区论坛、微信和微博等社交平台为开发者提供全方位技术支持。 总的来说,万物云可为开发者提供实用的智能硬件接入服务、分布式存储和处理以及应用编程接口等服务。 近日,万物云正式发布了设备地理位置管理系统,帮助用户掌握设备的实时位置,或进行移动设备的轨迹跟踪。用户在登录后,点开某一个接入设备,通过应用管理-设备管理-设备分布,就可以清晰查看设备的地理位置和分布情况(以蓝色方块作为标识),还可进一步点开【查看详情】查看该设备的全部数据。 可以说,NB-IoT降低了物联网终端的接入门槛,而万物云则帮助解决了NB-IoT应用中数据采集与处理的难题,在大幅度降低物联网数据应用的技术门槛及运营成本的同时,也满足了物联网产品原型开发、商业运营和规模发展各阶段需求。为此,万物云用户已经将近1600,入库数据超过55亿条。 至于应用环节,NB-IoT面对成千上万多样化的应用需求,这些物联网的应用没法形成如传统通信时代数亿级同质化应用业务,而是碎片化特点突出,即时同一行业中也有千差万别的需求。 截至目前,蜂窝网络覆盖了全球超过50%的地理面积,90%的人口,是一张覆盖最为完整的网络。基于蜂窝网络,NB-IoT将结合万物云等物联网服务平台,快速满足“物-物”互联的连接需求,孵化新的商业机会点,成为物联网时代“拥有巨大潜力的商业蓝海”,同时带来物联网产业的爆发式发展。 作者:佚名 来源:51CTO

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册