首页 文章 精选 留言 我的

精选列表

搜索[文件分享],共10042篇文章
优秀的个人博客,低调大师

Android技术分享| Context浅析

类继承图 我们来看下关于 Context 的类继承图,我们通过查看源码得知,Context 是一个抽象类,所以它肯定有其实现类,查阅得知它的实现类为 ContextWrapper 和 ContextImpl ,所以它的继承图如下: 以上的 Context 类继承关系清晰简洁,可以得知,Application 、 Service 、Activity 都是继承的 Context 类,所以从这里我们可以得知: Context 数量 = Activity 数量 + Service 数量 + 1 另外,我们可以看到 Application 和 Service 都是直接继承 ContextWrapper 的而 Activity 却是继承 ContextThemeWrapper 的,这是为何?其实 ContextThemeWrapper 是关于主题类的,Activity 是有界面的,而 Application 和 Service 却没有。接下来我们来详细看下它们的源码实现。 ContextWrapper 我们进入到 ContextWrapper 源码中可以发现,它其实调用了 mBase 里面的方法,而 mBase 其实是 ContextImpl ,所以最终还是得调用它的实现类 ContextImpl 类里面的方法。 public class ContextWrapper extends Context { Context mBase; public ContextWrapper(Context base) { mBase = base; } protected void attachBaseContext(Context base) { if (mBase != null) { throw new IllegalStateException("Base context already set"); } mBase = base; } //其余的都是覆盖Context里面的方法 } 我们可以按照上面的类的继承图进行依次分析,由上面可以知道 ContextWrapper 其实是调用 ContextImpl 里面的方法,所以 Application 和 Service 还有 Activity 它们应该都跟 ContextImpl 有关的。到底是不是这样的呢?我们追踪源码进行分析。 Application 类似于 Java 的 main 启动方法程序,Android 也有一个类似的方法,那就是在 ActivityThread 类中也有一个 main ,这是开始的地方,我们从这里进行一点一点跟踪: ActivityThread#main //省略部分代码... Looper.prepareMainLooper(); ActivityThread thread = new ActivityThread(); thread.attach(false); //省略部分代码... Looper.loop(); //省略部分代码... 我们找到 ActivityThread 的 main 方法,省略无关代码,这个 main 方法就是不断的从消息队列中获取消息,然后进行处理。我们本次不分析 Looper 相关的东西,只分析跟 Context 有关的内容,继续进入 attach 方法, Android 分析源码,不能一头扎进去,我们应该主要分析它的流程。 ActivityThread#attach //省略部分代码... mInstrumentation = new Instrumentation(); ContextImpl context = ContextImpl.createAppContext( this, getSystemContext().mPackageInfo); //Application的实例创建 mInitialApplication = context.mPackageInfo.makeApplication(true, null); //调用Application里面的生命周期方法onCreate mInitialApplication.onCreate(); //省略部分代码... 这里面出现了 ContextImpl ,所以下面应该会跟 Application 扯上关系,所以进入到 makeApplication 方法中继续往下追踪, LoadedApk#makeApplication //省略部分代码... Application app = null; ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this); app = mActivityThread.mInstrumentation.newApplication( cl, appClass, appContext); appContext.setOuterContext(app); //省略部分代码... 最终又进入到 Instrumentation#newApplication 方法里面 Instrumentation#newApplication static public Application newApplication(Class<?> clazz, Context context) throws InstantiationException, IllegalAccessException, ClassNotFoundException { Application app = (Application)clazz.newInstance(); app.attach(context); return app; } Application#attach /** * @hide */ /* package */ final void attach(Context context) { attachBaseContext(context); mLoadedApk = ContextImpl.getImpl(context).mPackageInfo; } 走到这里就很明清晰了,最终将会调用 ContextWrapper 的 attachBaseContext 方法。从上面到这里,如预料的一样,分析到这里,记住了多少?是不是只知道 Application 里面最终会调用 attachBaseContext 这个方法?这样的话就对了,不能一头扎进代码的海洋里,到处遨游,那样会迷失方向的,Android 源码那么大,那么多,一一细节分析根本是不大可能的,所以只能把握流程,然后再针对性的分析实现过程。接着分析 Service 里面相关的方法。 Service 对于 Service ,我们在 ActivityThread 中可以发现有个方法叫 handleCreateService ,这里面有关于 Service 和 ContextImpl 之间的联系。 ActivityThread#handleCreateService Service service = null; ContextImpl context = ContextImpl.createAppContext(this, packageInfo); context.setOuterContext(service); Application app = packageInfo.makeApplication(false, mInstrumentation); service.attach(context, this, data.info.name, data.token, app, ActivityManager.getService()); service.onCreate(); 对于 Application 的那段代码我们可以发现,这两者及其类似,我们进入到 attach 方法中查看相关代码,发现 /** * @hide */ public final void attach( Context context, ActivityThread thread, String className, IBinder token, Application application, Object activityManager) { //调用attachBaseContext方法 attachBaseContext(context); mThread = thread; // NOTE: unused - remove? mClassName = className; mToken = token; mApplication = application; mActivityManager = (IActivityManager)activityManager; mStartCompatibility = getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.ECLAIR; } 代码很简单,就是这样跟 ContextImpl 扯上关系的。因为 Service 和 Application 都是继承的 ContextWrapper 类,接下来我们来分析一下关于 Activity 的代码。 Activity 在这里说明一下为什么 Service 和 Application 都是继承的 ContextWrapper 类而 Activity 却是继承 ContextThemeWrapper 那是因为 Activity 是带有界面显示的,而 Service 和 Application 却没有,所以从名字我们可以看到 ContextThemeWrapper 包含主题的信息,同时 ContextThemeWrapper 却又是继承自 ContextWrapper ,分析 ContextThemeWrapper 源码我们可以看到,里面基本都是关于 theme 的方法,同时它也覆盖了 attachBaseContext 方法。 我们进入 Activity 源码也发现它也有和 Service 类似的 attach 方法 final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token, int ident, Application application, Intent intent, ActivityInfo info, CharSequence title, Activity parent, String id, NonConfigurationInstances lastNonConfigurationInstances, Configuration config, String referrer, IVoiceInteractor voiceInteractor, Window window, ActivityConfigCallback activityConfigCallback) { //省略部分代码... attachBaseContext(context); 接下来我们来分析一下 Activity 在哪里和这个扯上关系的。 ActivityThread#performLaunchActivity performLaunchActivity 这个方法其实就是启动 Activity 的方法 ,我们以后再来学习关于这个方法的内容,现在先分析 Context 的内容。我们进入到这个方法查看: //省略部分代码... ContextImpl appContext = createBaseContextForActivity(r); Activity activity = null; //省略部分代码... activity.attach(appContext, this, getInstrumentation(), r.token, r.ident, app, r.intent, r.activityInfo, title, r.parent, r.embeddedID, r.lastNonConfigurationInstances, config, r.referrer, r.voiceInteractor, window, r.configCallback); //省略部分代码... 首先通过 createBaseContextForActivity 方法创建ContextImpl 然后直接有 Activity attach 进去。到此为止,关于 Application 、Service 和 Activity 关于Context 的源码基本就差不多了。接下来我们来解决一些实际的内容。 实例理解 既然 Application、Service 和 Activity 都有 Context 那么它们之间到底有啥区别呢?同时 getApplicationContext 和 getApplication() 又有什么区别呢?接下来我们通过代码进行验证。 我们现在的项目一般都有自定义 Application 的类进行一些初始化操作,本例中也新建一个 MyApplication 的类继承自 Application,然后在Manifest.xml中进行注册,代码如下: public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); Log.d("androidos_analysis", "getApplicationContext()——> " + getApplicationContext()); Log.d("androidos_analysis", "getBaseContext() ——> " + getBaseContext()); } } 打印结果如下: getApplicationContext()——> com.ihidea.androidosanalysis.MyApp@9831cf9 getBaseContext() ——> android.app.ContextImpl@13d643e 我们发现当我们通过 getApplicationContext 获取的是我们申明的 Application 实例,而通过 getBaseContext 获取到的却是 ContextImpl 这是为什么呢?我们查看它们的实现发现 ContextWrapper#getBaseContext /** * @return the base context as set by the constructor or setBaseContext */ public Context getBaseContext() { return mBase; } 其实在上文我们已经分析过了它们的源码,我们知道其实这个mBase就是 ContextImpl 了。而 getApplicationContext ContextWrapper#getApplicationContext @Override public Context getApplicationContext() { return mBase.getApplicationContext(); } 通过上面分析我们知道 其实 Application 它本身也是一个 Context 所以,这个们返回的就是它自己了。所以这里获取getApplicationContext()得到的结果就是MyApplication本身的实例。 有时候我们代码里面也会有关于 getApplication 的用法,那么 这个跟 getApplicationContext 又有什么区别呢?我们再来log一下就知道了。 我们创建一个 MainActivity 然后在里面打印两行代码: MainActivity#onCreate Log.d("androidos_analysis", "getApplicationContext()——> " + getApplicationContext()); Log.d("androidos_analysis", "getApplication() ——> " + getApplication()); 我们可以发现 这两个返回的结果都是 一样的,其实不难理解, Activity#getApplication /** Return the application that owns this activity. */ public final Application getApplication() { return mApplication; } 其实 getApplication 返回的就是 Application 所以这两者是一样的了。但是都是返回的 Application ,Android 为什么要存在这两个方法呢?这就涉及到作用域的问题了,我们可以发现使用 getApplication 的方法的作用范围是 Activity 和 Service ,但是我们在其他地方却不能使用这个方法,这种情况下我们就可以使用 getApplicationContext 来获取 Application 了。什么情况下呢?譬如:BroadcastReceiver 我们想在Receiver 中获取 Application 的实例我们就可以通过这种方式来获取: public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { MyApplication myApp = (MyApplication) context.getApplicationContext(); //... } }

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

常用优质编程语言分享

我们的需要、欲望和需求是在机器的帮助下大大增强,全球市场也是如此,因此被包裹在一个数字网络或社区。我们被淹没在技术与被包围的小工具-所有这些都是由编程或编码。没有卫星、电视、手机生活、证券交易所或机器学习和人工智能是难以想象的,因此具有良好技能的程序员始终处于需求。案例:www.fengshandai.com计算机编程的重要性 编程语言是一种正式语言, 它指定一组可用于生成各种输出的指令。让我们理解为什么编码是必要的。为了分析和解决一个问题, 人类提出了自己的算法--发现问题并找出解决方法 (即使用一组有限的输入来产生所需的输出)。 算机或机器能够处理相同的过程。它可以遵循指令并产生解决方案。只有一组指令需要借助编程语言来提供。 对于那里的所有技术专家来说,通过学习以下任何编程语言来囊括最好的工作。 Java Java 在1991年发明的一种用于智能电视的编程语言, 但目前是900万多名开发人员使用最广泛的语言。TIOBE 编程社区已经指出, Java 是最常用的编程语言。 Android 平台和应用程序的最近出现, 使 Java 开发人员的需求激增。除了 Android 智能手机之外, Java 还在电视、atm、自动售货机和游戏控制台实现。由于这种面向对象的语言用于开发移动应用程序、视频游戏和各种服务器端应用程序, 因此它仍然是任何原生 Android 应用程序中最重要的元素之一。 C 这种面向结构的编程语言由Dennis Ritchie于1972年在贝尔实验室开发。 C语言的一些特性来源于B语言或基本组合编程语言-BCPL。 C语言是强大的编程语言之一。 它广泛用于在Linux,UNIX和Windows等操作系统上开发系统应用程序。 它也用于其他平台,如数据库系统,解释器,操作系统开发,文本编辑器,打印假脱机程序,图形包,电子表格,编译器和汇编程序,语言解释器,实用程序,文字处理器和网络驱动程序。 因此,您可以观察这种通用语言如何被用于这些不同领域。 C是最流行的语言,因为它的可靠性,可移植性,灵活性,交互性,模块性,效率和有效性等特性。 而且,许多成熟的程序员现在正转向C。 C++ C ++是一种基于C的通用编程语言,通常被称为C的后代或超集,开源语言基于面向对象编程系统或OOPS。 主要的软件解决方案,驱动程序和固件包都有C ++实现。 C ++具有高级和低级编程语言的特点。 因此,它被视为一种中级语言。 但是当谈到低级别,硬核编程时,C ++是首选。 C ++被用于超越游戏的复杂性,特别是3D。它还用于基于图形用户界面(GUI)的应用程序、Web浏览器、高级计算和图形、编译器、数据库软件、操作系统、企业软件解决方案以及高端CAD、CAM系统等应用程序。 Python 以Monty Python命名,这种高级编程语言创建于20世纪80年代。 这是一种非常简单的语言,语法简单,即使是初学者也能快速提取。 Python有几个用于构建Web应用程序的库。 该语言本身非常适合处理HTTP协议。 但是当你想要更多的时候,Flask,Pyramid和Django都是很好的选择。 Python被谷歌,雅虎和IBM等科技巨头所使用,同时也为Instagram,Reddit和Venmo等平台提供动力。 按照Coding Dojo的说法,来自Dice和Indeed网站的投入,Python在2017年成为最受欢迎的编程语言之一。 C# 由微软设计和开发的C#(发音为C-sharp)是一种面向对象的编程语言。 由.NET Framework支持的Microsoft应用程序需要C#执行。 顾名思义,这种语言是基于C和C ++的,所以如果你有C或C ++的基本知识,那么学习C#对你来说不应该太难。 在1亿个网站中,超过16%的网站由ASP.NET框架提供支持,这意味着为什么你必须学习C#。 考虑两个因素。 首先,C#是由微软开发的在他们的平台上开发应用程序的。 因此,微软将确保C#在未来的时间内相关并更新。 其次,C#通常是通过Unity Game引擎制作游戏时推荐的语言。 虚拟现实和独立游戏开发 - 两者都在这里逗留很长时间,并且由于Unity在这两个领域都发挥着重要作用,因此受过C#培训的专业人士拥有乐观的未来。 PHP 对于现代Web应用程序,PHP是最关键的编程语言。 由于它为几乎所有的全球在线系统提供了稳定性和强大的功能,因此使用这种语言。 这个开源软件很容易学习,因此也有很好的未来。 网络行业中的一些大公司如WordPress,雅虎,Twitter,Flickr和Facebook以及维基百科和苹果等公司都使用PHP,而一些程序员也喜欢使用PHP。 Stack Overflow的联合创始人Jeff Atwood曾经说过:“PHP与其说是一种语言,倒不如说是任意事物的随机集合,是关键字和函数工厂的虚拟爆炸。” Visual Basic .NET (VB.NET) 这是一个Microsoft面向对象编程(OOP)语言。该语言是在VisualBasic 6(VB6)的基础上发展而来的,它是为了融合Web服务和Web开发的需要而创建的。 用比尔·盖茨的话来说,随着编程从DOS向基于Windows的编程转变,微软开发,部署和使用应用程序的方式将会压倒一切,而Visual Basic.NET将为构建这些解决方案奠定基础。 JavaScript 为什么学习JavaScript? 因为它在那里。案例:www.meihuadian.com,不要将它与Java混淆。 JavaScript是构建交互式网站的语言。 随着HTML和CSS,JavaScript是大多数浏览器实现JavaScript时必不可少的语言。 它的使用不仅限于前端和后端Web开发。 事实上,JavaScript被广泛用于游戏开发,桌面应用和移动应用开发。 它越来越受欢迎,需要一个优秀的JavaScript程序员。 Go 该开源编程语言用于以可靠,简单和高效的方式构建软件。 使用Go或GoLang编写的代码易于维护,因为它使用整洁干净的语法。 Go有goroutines,而Goroutines有可扩展的分段堆栈,它会在需要时使用更多的内存。 Go几乎和C / C ++一样高效,并且得到了Google的支持 - 所有正确的理由让我们现在了解它。 R 在R统计计算基金会的支持下,这种开放源码的编程语言和软件环境被用于统计计算和图形,因此通常被称为“Lingua Franca of Statistics”。 R是数据可视化、分析、机器学习和科学计算的重要工具。由于数据科学家的高度普及,R开发人员的需求将一直在增长。 Perl Perl是一种稳定的,跨平台的,通用的,解释型的,动态的和高级的编程语言。 它是为文本操作而开发的,但现在主要用于Web开发,GUI开发,网络编程,系统管理等。 与C或C ++不同,Perl不会直接编译为与机器相关的格式。 Perl是一种开源软件,以其艺术许可证或GNU通用公共许可证(GPL)许可。 Swift 成为一名优秀的iOS和Mac OS应用程序开发人员与学习Swift成正比。 在Xcode的帮助下,Apple的Swift易于维护和使用,追踪错误变得更容易。 xCode在构建应用程序之前检查您的代码。 Swift使用自动引用计数(ARC),它实时管理和跟踪应用程序的内存使用情况。多片锯网站案例:www.xtkh.net 这些语言之所以能够在这份名单中脱颖而出,是因为它们的学习者数量在过去几年里大幅增加。 此外,微软,谷歌,苹果,雅虎,IBM,WordPress,Twitter和Flickr等大公司都实施了这些编程语言。 所有这一切意味着学习这些可以在那里为你腾出空间。

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

好物分享——JavaScript编程

小笨笨给大家发福利啦!阿里云云栖社区:小笨笨qaqcnblogs:小笨笨的世界,希望大家支持1.https://files.cnblogs.com/files/sillyben/javascript-tower-platformer-master.zip2.https://files.cnblogs.com/files/sillyben/javascript-tiny-platformer-master.zip3.https://files.cnblogs.com/files/sillyben/javascript-racer-master.zip4.https://files.cnblogs.com/files/sillyben/javascript-boulderdash-master.zip 本文来自作者cnblogs同步小笨笨的世界,欢迎下载,喜欢的就点个关注哦!

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

微服务实战分享

导语喜欢踢球的同学一般知道这样的一个段子,当年有好事的记者问风头正盛的球王马拉多纳,在他进球中,哪个踢得最精彩?马拉多纳想了想就说:“一个吧”所以,努力追求“下一个”是一个普通球员到天才球员的必备品质,那么在快速互联网行业中同样如此,每一次的技术更新变革也意味着无数个追求“下一个”的互联网从事着的日日夜夜的辛勤劳动。 第一章 软件架构演进按照不同阶段使用的软件架构来排序:单体架构,垂直架构,服务化架构,微服务架构以及未来可能出现的无服务架构(ServiceLess)以及服务网格(Service Mesh)。1.单体架构单体架构在初创的小微企业比较常见,典型代表就是一个应用、一个数据库、一个Web容器就可以跑起来,但现在实际的。特点:所有功能集中在一个项目工程中,所有的功能在一个war包中,然后部署到服务上,并且可以通过集群来提高系统

资源下载

更多资源
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等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册