【澳门威斯尼人平台登陆】Android 面试题体系一

by admin on 2019年9月8日

1.socket编制程序,socke的干活原理,以及怎么开创乞请?

.NET面试题类别[6],.net面试题种类

1. 哪些是正规广播?

专门的学业广播是一种截然异步奉行的播报,在播报发出之后,全数的广播接收器差十分的少都在一样时刻接收到那条广播发出的音讯,因而它们中间平昔不别的前后相继的各类。这种广播的成效比较高,但同有的时候间也意味着它是无力回天被截断的。

1.activity的生命周期

从网络找到一些面试题,以及和睦想的一对面试题,迎接补充和吐嘈。

答:大家平日把socket翻译为套接字,socket是在应用层和传输层之间的二个抽象层,它把TCP/IP层复杂的操作抽象为多少个轻便的接口供应用层调用已兑现进程在网络中通讯。大家明白互连网层的ip地址能够独一标示主机,而传输层TC合同和端口号能够独一标示主机的八个历程,这样大家能够使用ip地址+合同+端口号独一标示网络中的二个进程。能够独一标示互连网中的进度后,它们就可以利用socket进行通讯了。socket是一种”展开—读/写—关闭”方式的达成,服务器和客商端各自维护一个”文件”,通过对方的ip和端口号创制socket,
创建后,能够向友好文件写入内容供对方读取恐怕读取对方内容,通信截止时关闭文件。

反射 – 定义,实例与优化

在面试中,平日会考查反射的概念(操作元数据),能够用反射做什么样(得到程序集及其各样部件),反射有哪些使用意况(ORM,体系化,反类别化,值类型相比等)。假使答得好,还有也许会问一下什么样优化反射(Emit法,委托法)。

反射的习性远远低于直接调用,但对此必须求运用的景观,它的属性实际不是不可接受。对于“反射料定是产生性能差的机要缘由”这种说法,要冷静客观的深入分析。

.NET平台能够行使元数据完全的叙说类型(类,结构,委托,枚举,接口)。大多.NET手艺,譬如WCF或类别化都亟待在运行时开掘项目格式。在.NET中,查看和操作元数据的动作称为反射(也叫做元编程)。

 

澳门威斯尼人平台登陆 1

 

反射正是和程序集打交道。上图彰显了程序集的阶层关系。通过反射我们得以:

运用反射时,叁个主要的项目是System.Type类,其会回来加载堆上的花色对象(包含静态成员和方法表)。当我们要反射二个类的措施时,首先要赢得它的门类对象,然后再选用GetMethods方法获得某些方法。得到方式之后,能够动用Invoke实行办法。

反射带来了拾叁分有力的元编制程序技巧,举个例子动态变化代码。如Ruby的元编制程序手艺,它的ORM能够从数据库的Schema中一向“挖出”字段,而类本人差不离无需定义任何内容,那正是元编程的威力表现之一。

2. 怎么着是铁定的事情广播?

长久以来广播则是一种共同实施的播报,在播报发出之后,同偶然刻只会有贰个广播接收器能够承受到那条广播新闻。

方法

起码程序员

2.IntentService和Service的关系,Activity之间怎么传递数据,

反射有怎样应用场景?

在多数时候反射是独一的挑选

当大家必要动态加载某些程序集(并不是在前后相继开头时就加载),要求使用反射。但反射最常见的场馆是,对象是未知的,或缘于外界,或是三个通用的模子比如ORM框架,其针对性的对象足以是其余类型。比如:对象的类别化和反连串化。

干什么我们会选取使用反射?因为我们从不主意在编写翻译期通过静态绑定的法子来规定大家要调用的对象。例如二个ORM框架,它要直面的是通用的模子,那时不论方法也好属性也罢都以随应用场景而改动的,这种完全须求动态绑定的场景下本来必要运用反射。还举个例子插件系统,在一丝一毫不明了外界插件毕竟是什么事物的情事下,是早晚不可能在编写翻译期明确的,因而只可以选拔动态加载进行加载,然后经过反射探查其格局,并反射调用方法。 

描述

一、Java

答:IntentService是Service的子类。IntentService在进行onCreate的主意的时候,开了一个线程HandlerThread,并拿走了日前线程队列管理的looper,何况在onStart的时候,把音讯置入了音信队列,在消息被handler接受况且回调的时候,实施了onHandlerIntent()方法,该措施的贯彻是子类去做的。那一个点子里能够推行耗费时间操作。

传递数据形式:

播音方式 AIDL 接口回调
分享文件(如SharedPreference,注意同期不能够而且读写)
Handler的Messager交互

.NET中的反射一例

当大家相比五个援引类型的变量是不是等于时,我们比较的是那四个变量所指向的是还是不是堆上的同八个实例(内部存款和储蓄器地址是或不是一律)。而当大家比较五个结构体是不是等于时,如何是好啊?因为变量本人富含了结构体全体的字段(数据),所以在可比时,就必要对五个结构体的字段进行每个的一定的比较,看看每一种字段的值是或不是都等于,若是其他三个字段的值不等,就回去false。

实际上,实行那样的一个相比并不须求大家和好编辑代码,Microsoft已经为大家提供了贯彻的方法:全体的值类型承接自System.ValueType,ValueType和全部的品类都继承自System.Object,Object提供了一个Equals()方法,用来判定多个对象是不是等于。可是ValueType覆盖了Object的Equals()方法。当咱们相比几个值类型变量是或不是等于时,能够调用承接自ValueType类型的Equals()方法。那些复写的格局内部使用了反光,获得值类型全体的字段,然后开展相比。

可被杀死

1. ”==”和equals方法毕竟有哪些差异?

3.ContentProvieder的理解

加载程序集(最2020时期绑定)

先写一个用来演示的门类:

public class Class1
    {
        public int aPublicField;
        private int aPrivateField;
        public int aPublicProperty { get; set; }
        private int aPrivateProperty { get; set; }

        public event EventHandler aEvent;

        //Ctor
        public Class1()
        {

        }

        public void HelloWorld()
        {
            Console.WriteLine("Hello world!");
        }

        public int Add(int a, int b)
        {
            return a + b;
        }
    }

开始的一段时代绑定正是价值观的办法:CL奥迪Q5在运作代码从前,扫描任何恐怕的体系,然后营造项目对象。最终一段时代绑定则相反,在运行时才确立项目对象。笔者们能够用System.Reflection中的Assembly类型动态加载程序集。(在急需的时候加载三个外表的程序集)

要是得以选用早期绑定,那么自然是开始的一段时代绑定越来越好。因为CL纳瓦拉在前期绑按期会检查项目是还是不是错误,实际不是在运作时才看清。

当试图动用前期绑定期,你是在援用一个在运营时不曾加载的程序集。你需求先使用Assembly.Load或LoadFrom方法找到程序集,然后您能够应用GetType得到该程序集的一个种类,最终,使用Activator.CreateInstance(你拿走的档期的顺序对象)创立该类型的二个实例。

专一,那样创造的类型实例是Object类型。(C#
4引入了动态类型之后,也得以用dynamic修饰这连串型的实例)那个项目对象的章程都不可知,假若要运用它的方式,只好选择反射(举例使用GetMethods获得艺术音讯,然后再Invoke)。那是反光最广大的应用场景。

道理当然是那样的,你不应有援用该程序集,不然,就成为最早绑定了。假如大家将上边的身体力行类型放在多个class
library中,然后,在另一个工程中伸开中期绑定。此时我们不将该class
library出席参照他事他说加以考察,而是选用反射的法子,咱们筹划拿走演示类,并成立三个实例,就象是大家投入了参照同样。

class Program
    {
        static void Main(string[] args)
        {
            Assembly a = null;

            try
            {
                a = Assembly.LoadFile(@"C:\CSharpBasic\ReflectionDemoClass\bin\Debug\ReflectionDemoClass.dll");
            }
            catch (Exception ex)
            {
                //Ignore
            }

            if (a != null)
            {
                CreateUsingLateBinding(a);
            }
            Console.ReadLine();
        }

        static void CreateUsingLateBinding(Assembly asm)
        {
            try
            {
                // 获得实例类型,ReflectionDemoClass是命名空间的名字
                Type t = asm.GetType("ReflectionDemoClass.Class1");

                // 晚期绑定建立一个Class1类型的实例
                object obj = Activator.CreateInstance(miniVan);

                // 获得一个方法
                MethodInfo mi = t.GetMethod("HelloWorld");

                // 方法的反射执行(没有参数)
                mi.Invoke(obj, null);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }

应用动态类型可以简化最终一段时代绑定。

 

下一个

2. GC是怎么样? 为何要有GC?

Android四大组件之一,为存款和储蓄和获取数据提供联合的接口,可以在分歧的应用程序之间分享数据。把具有数据组织成表,提供增加和删除改查,用U帕杰罗I来统一标记财富。

获取类型成员

获得类型成员须求先具备二个品类。我们司空眼惯通过typeof(那是GetType方法的简写)得到类型对象,然后再利用各个艺术取得类型的分子:

GetMembers:暗许只得到公开的成员,满含团结和等级次序全体父类的驾驭成员。成员包涵字段,属性,方法,构造函数等。若想获得一定的成员,可以传入BindingFlags枚举,能够流传多少个枚举值:

  • Static:静态成员
  • Instance:实例成员
  • Public:公开成员
  • NonPublic:非公开成员
  • DeclaredOnly:只回去本身类型内的积极分子,不回去父类的成员

BindingFlags枚举被Flags性格修饰,Flags特性极其适合这种类型的枚举:每一趟传入的成员数是不定的。从概念上得以看来,每一种枚举对应贰个数字,其都以2的整数幂:

 

Default = 0,

IgnoreCase = 1,

DeclaredOnly = 2,

Instance = 4,

Static = 8,

Public = 16,

NonPublic = 32,

……

 

这种做法有二个特征,正是尽管你钦定大肆四个非负的数字,它都足以独一的象征成上边各种成员的和,并且唯有一种象征方法。例如3能够当做IgnoreCase加上DeclaredOnly,12得以当作Instance加上Static。所以假若您传入Static
+
Instance(得到静态恐怕实例成员),实际上你传入的是数字12,编写翻译器将您的数字拆成基本成员的和。

有关缘何只可以采用2的整数幂,那是因为2进制中,全体的数字都由0大概1整合。借使大家将下面的列表转化为2进制:

 

Default =         00000000,

IgnoreCase =    00000001,

DeclaredOnly = 00000010,

Instance =        00000100,

Static =           00001000,

Public =           00010000,

NonPublic =      00100000,

……

 

此间做了伍人,实际上位数的长短由最终二个成员明显。那么对于随便一个非负整数,它的每一人还是是1照旧是0。大家将1看作开,0看作关,则每个中央成员都一定于展开了一个一定的位,输入中的每种人如若是1,它就等效于对应的分子处于展开状态。比如取下边包车型地铁输入00011001,它的第4,5和8位是开发的,也等于说,它等于Public

  • Static
    +IgnoreCase。那样大家就能够将它表示为着力成员的相加了。总之,这种相加独有一种艺术,子虚乌有第三种艺术了。

若想行使Flags特性,你要求团结将值赋予各类成员。值必需是2的整数幂,不然Flags个性将失去意义。

固然只想获取方式照旧性质,也得以考虑不利用GetMembers+BindingFlags枚举的艺术,直接采取GetMethods或GetProperties方法。以下列出了有的拿走某种特定项目成员的方式:

ConstructorInfo[]  GetConstructors()

获取指定类型包含的所有构造函数

EventInfo[]   GetEvents();

获取指定类型包含的所有事件

FieldInfo[]   GetFields();

获取指定类型包含的所有字段

MemberInfo[]   GetMembers();

获取指定类型包含的所有成员

MethodInfo[]   GetMethods();

获取指定类型包含的所有方法

PropertyInfo[]   GetProperties();

获取指定类型包含的所有属性

 

获得成员之后,我们可以通过相呼应的Info类中的成员,来博取成员的值,类型,以及另外音信。亟待小心的是,纵然成员是私家或受保证的,通过反射相同能够赢得其值,以致能够对其值进行改造。那是ORM的兑现基础。这里的言传身教大家就省去末尾时期绑定,直接将演示类型写在同贰个文书中,比方:

 class Program
    {
        public static void Main(string[] args)
        {
            ReflectionDemoClass r = new ReflectionDemoClass();
            //不能在外界访问私有字段
            //r.APrivateField = "1";

            var t = typeof(ReflectionDemoClass);
            FieldInfo[] finfos =
                t.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);

            //通过反射获得私有成员的值 
            foreach (FieldInfo finfo in finfos)
            {
                //甚至修改私有成员的值
                if (finfo.Name == "APrivateField")
                {
                    finfo.SetValue(r, "12345");
                }
                Console.WriteLine("字段名称:{0}, 字段类型:{1}, 值为:{2}", finfo.Name, finfo.FieldType, finfo.GetValue(r));
            }
            Console.ReadKey();
        }
    }

    public class ReflectionDemoClass
    {
        private string APrivateField;

        private string AProperty { get; set; }

        public string AnotherProperty { get; set; }

        public void AMethod()
        {
            Console.WriteLine("I am a method.");
        }

        public void AnotherMethod(string s)
        {
            Console.WriteLine("I am another method, input is " + s);
        }

        public ReflectionDemoClass()
        {
            APrivateField = "a";
            AProperty = "1";
            AnotherProperty = "2";
        }
    }

花色成员除了字段,还会有属性,方法,构造函数等。能够通过Invoke调用方法。

//调用方法
            var method = t.GetMethod("AMethod");
            //方法没有输入变量
            method.Invoke(r, null);

            //方法有输入变量
            method = t.GetMethod("AnotherMethod");
            object[] parameters = { "Hello world!" };
            method.Invoke(r, parameters);

onCreate()

3. Integer与int的区别?

4.TCP、UDP的区别

措施反射调用有多慢

格局的调用能够分成两种艺术:直接调用,委托调用和反光调用。

上边包车型大巴例子表明了点子的反光调用。假使大家要因此反射改造某些属性的值,那必要呼叫属性的setter。

public static void Main(string[] args)
        {
            var r = new ReflectionDemoClass();
            var t = typeof(ReflectionDemoClass);

            //获得属性的setter
            var pinfo = t.GetProperty("AnotherProperty");
            var setMethod = pinfo.GetSetMethod();

            Stopwatch sw = new Stopwatch();
            sw.Start();

            for (int i = 0; i < 1000000; i++)
            {
                setMethod.Invoke(r, new object[] { "12345" });
            }

            sw.Stop();
            Console.WriteLine(sw.Elapsed + " (Reflection invoke)");

            sw.Restart();

            //直接调用setter
            for (int i = 0; i < 1000000; i++)
            {
                r.AnotherProperty = "12345";
            }
            sw.Stop();
            Console.WriteLine(sw.Elapsed + " (Directly invoke)");
        }

00:00:00.2589952 (Reflection invoke)

00:00:00.0040643 (Directly invoke)

合计调用了一百万次,从结果来看,反射消耗费时间间是直接调用的60多倍。

在activity第二次被成立的时候调用。这里是你做有所开首化设置的地点──创造视图、设置布局、绑定数据至列表等。假若已经有情况记录(参阅后述Saving
Activity State。),则调用此办法时会传入贰个包罗着此activity从前状态的包对象做为参数。

4. 怎么是java种类化,怎么着落到实处java系列化?

TCP传输调整公约,是一种提供有限支撑数据传输的通用公约。

UDP客户数量报公约,是一个面向无连接的磋商。如广播

措施反射调用为啥慢

反射速度慢有如下多少个原因:

  • 反射首先要操作和索求元数据,而直接调用查找元数据这一步是在编写翻译(jit)时
  • 反射调用方法时,未有通过编写翻译器jit的优化。而直白调用的代码是经jit优化后的地方代码
  • 反射调用方法须求检讨输入参数的种类,那是在运行时技艺成就的,而直白调用的代码检查项目是在编写翻译时
  • 即使可以通过前边所讲的二种方法优化反射,反射的品质依然远远不比直接调用

资料:

行使反射调用方法比一向调用慢上数十倍。反射优化的有史以来方法只有一条路:避开反射。可是,避开的不二秘诀可分为二种:

  1. 用委托和表明式树去调用。(绕弯子)

2.
生成直接调用代码,代替反射调用。能够采纳System.Reflection.Emit,但要是措施过于复杂,须要充裕熟练IL才干够写出科学的代码。

那二种办法的快慢平分秋色,增添阅读中,有利用委托调用加强反射品质的例证。我们由此表达式树来创设强类型的委托,达到调用方法的指标(调用方法也是二个表明式)。那能够大大收缩耗费时间,提升质量。

总继之以onStart()。

5. String和StringBuffer有如何差距?在怎么着处境下利用它们?

5. OOM百般是什么 ,OOM现象怎么处理

焚薮而田方案1:System.Reflection.Emit

简言之来讲,正是您一丝一毫能够创造七个动态程序集,有和好的类,方法,属性,以至以直接写IL的法子来做。

精通C#第6版第18章对Emit有详细的解说。Emit命名空间提供了一种机制,允许在运作时组织出新的品类或程序集。那足以看成是反光的一种等级次序,但又当先反射(反射只是操作,而Emit能够创立)。

贰个周围的Emit的利用场景是Moq,它应用Emit在运转时,动态的创始三个新的品类,完毕全体的措施,但都以空方法,进而完毕创设多少个假的门类的目标。

应用Emit营造新的类别(以及它的质量和方法)必要对IL有必然认知。因为Emit的好多主意是间接被更动为IL的。营造新的类型一般须求以下步骤:

比如,假若大家要组织上面方法的IL代码(使用Emit):

        public void AMethod()
        {
            Console.WriteLine("I am a method.");
        }

下面是身体力行:

 public static MethodInfo EmitDemo()
        {
            //创建程序集
            AssemblyName name = new AssemblyName { Name = "MyFirstAssembly" };

            //获取当前应用程序域的一个引用
            AppDomain appDomain = System.Threading.Thread.GetDomain();

            //定义一个AssemblyBuilder变量
            //从零开始构造一个新的程序集
            AssemblyBuilder abuilder = appDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run);

            //定义一个模块(Module)
            ModuleBuilder mbuilder = abuilder.DefineDynamicModule("MyFirstModule");

            //创建一个类(Class)
            TypeBuilder emitDemoClass = mbuilder.DefineType("EmitDemoClass", TypeAttributes.Public | TypeAttributes.Class);

            Type ret = typeof(void);

            //创建方法
            MethodBuilder methodBuilder = emitDemoClass.DefineMethod("AMethod", MethodAttributes.Public | MethodAttributes.Static, ret, null);

            //为方法添加代码
            //假设代码就是ReflectionDemoClass中AMethod方法的代码
            ILGenerator il = methodBuilder.GetILGenerator();
            il.EmitWriteLine("I am a method.");
            il.Emit(OpCodes.Ret);

            //在反射中应用
            Type emitSumClassType = emitDemoClass.CreateType();
            return emitSumClassType.GetMethod("AMethod");
        }

从下边包车型客车例证能够见见,大家须求和IL打交道,本领在il.Emit中写出不错的代码。大家能够透过ildasm查看IL代码,但只要IL非常短,则代码很难写对,并且相当特别不便精通。有意思味的同桌能够参照:

以及 

一文中有利用Emit对setter的贯彻。从结果来看,其速度比不上委托快。对于供给多量用到反射的景色,比方ORM需求经过反射为属性三个三个赋值,那么它一般也会选拔类似的机制来增加品质。

6. LinkedList和ArrayList的区别?

OOM全称为Out of Memory,内部存款和储蓄器溢出。常见导致OOM场景有

加载超大的Bitmap (通过降低性能,且使用完注意recycle

查询数据库未关门游标

组织Adapter 时,未有利用缓存的convertView

由此可见对利用完的财富,注意及时放出。

缓慢解决方案2:委托

要是需求和谐写一个ORM框架,则为属性赋值和获得属性的值显明是不可转换局面的操作。大家得以由此Delegate.CreateDelegate创设贰个寄托,其指标函数是性质的setter,故它有三个输入变量,未有重回值。当Invoke委托时,就调用了setter。编写代码时,目的在于构造贰个和对象措施签字同样的寄托。

代码如下:

 public static void Main(string[] args)
        {
            var r = new ReflectionDemoClass();
            var t = typeof(ReflectionDemoClass);

            //获得属性的setter
            var pinfo = t.GetProperty("AnotherProperty");
            var setMethod = pinfo.GetSetMethod();

            Stopwatch sw = new Stopwatch();
            sw.Start();

            for (int i = 0; i < 1000000; i++)
            {
                setMethod.Invoke(r, new object[] { "12345" });
            }

            sw.Stop();
            Console.WriteLine(sw.Elapsed + " (Reflection invoke)");

            sw.Restart();

            //直接调用setter
            for (int i = 0; i < 1000000; i++)
            {
                r.AnotherProperty = "12345";
            }
            sw.Stop();
            Console.WriteLine(sw.Elapsed + " (Directly invoke)");

            //委托调用
            //建立一个DelegateSetter类型的委托
            //委托的目标函数是ReflectionDemoClass类型中AnotherProperty属性的setter
            DelegateSetter ds = (DelegateSetter) Delegate.CreateDelegate(typeof(DelegateSetter), r,
                    //获得属性的setter
                    typeof(ReflectionDemoClass).GetProperty("AnotherProperty").GetSetMethod());

            sw.Reset();
            sw.Start();
            for (int i = 0; i < 1000000; i++)
            {
                ds("12345");
            }

            sw.Stop();

            Console.WriteLine(sw.Elapsed + " (Delegate invoke)");

            Console.ReadKey();
        }

结果:

00:00:00.3690372 (Reflection invoke)

00:00:00.0068159 (Directly invoke)

00:00:00.0096351 (Delegate invoke)

能够见见委托调用远远赶过反射调用,尽管它如故不及直接调用赶快。对于贰个通用的减轻方案,大家需求定义贰个最最相似品种的嘱托

  • Func<object, object[],
    object>(接受七个object类型与object[]类别的参数,以及重回三个object类型的结果)。

因为任何事物都是表达式,所以本来也足以通过表达式来实行三个委托。即便应用表明式比较复杂,但我们得以令表明式接受相似项指标信托,幸免每一回委托调用都要表明差别的寄托。

该文章使用委托+表达式树法,给出了七个相似的减轻方案。它的结果证明,委托的速度略慢于直接调用,但远快过反射。

onStart()

二、UI层

6.什么样监听动画点击事件

反射:增加阅读

推而广之阅读中,详细的介绍了委托+表明式树法对反射的优化。可以动用合适的数据结构实行缓存,进而进一步提升品质。对于利用何种数据结构,扩大阅读中有详实的解说和代码。这个内容远远超过了貌似公司(纵然是BAT)的面试水平,假诺不是有付出要求,没有须求对那地点拓宽长远研商。

 

反射 –
定义,实例与优化
在面试中,平日会考查反射的概念(操作元数据),能够用反射做哪些(得到程…

   

1. 请介绍下Android中常用的二种布局以及他们的特色

  1. FrameLayout是最简便易行的布局格局,放置的控件都只好罗列到左上角,控件会有臃肿,不能够举办复杂的布局。
  2. LinearLayout能够通过orientation属性设置线性排列的趋向是垂直仍然纵向的,每行或每列独有二个成分,能够张开复杂的布局。AbsoluteLayout能够让子成分钦赐准确的x、y坐标值,并显示在屏幕上。
  3. AbsoluteLayout未有页边框,允许成分之间相互重叠。它是纯属坐标,所以在实质上中不提倡使用。
  4. RelativeLayout允许子成分拟定他们针锋相对于任何因素或父成分的任务(通过ID拟定)。因而,你能够以右对齐,或左右,或置于显示器主旨的花样来排列五个成分。
  5. TableLayout将以子成分的职位分配到行或列。

监听当前试行动画的View就能够

onRestart()

2. ListView如何提升其成效?

  1. 选取分页加载,不要一回性加载全部数据。
  2. 复用convertView。在getItemView中,决断converView是还是不是为空,如若不为空,可复用。
  3. 异步加载图片。Item中只要带有有web image,那么最佳异步加载。
  4. 立刻滑动时,不出示图片。当火速度滑冰动列表(SCROLL_STATE_FLING),item中的图片或猎取须求成本能源的view,能够不显得出来;而远在其余二种情景(SCROLL_STATE_IDLE和SCROLL_STATE_澳门威斯尼人平台登陆,TOUCH_SCROLL),则将那些view显示出来。

7.Android第四次全国代表大会组件以及对四大组件的骨干认识

在activity停止后onStop(),在再一次启航以前被调用。

3. Padding和Margin有如何界别?

Padding是控件的从头到尾的经过相对控件的边缘的边距,而Margin是控件边缘相对于其余控件的边距。

Activity:承载页面与顾客交互,管理操作

Service:后台运维,比较于Activity是无分界面包车型客车

布罗兹Cast: 异步广播

ContentProvider: 提供联合的对数据集正式,可用于应用程序之间数据分享

总继之以onStart()。

4. 请描述一下Activity生命周期

  1. onCreate:
    创设Activity时调用,设置在该方法中,还以Bundle的样式提供对原先存款和储蓄的别样情状的寻访。
  2. onStart: Activity变为在荧屏上对客商可见时调用。
  3. onResume:
    Activity起首与顾客交互时调用,无论是运营依旧重新启航三个运动,该办法总是被调用。
  4. onPause:
    Activity被中止或吊销cpu和别的国资本源时调用,该措施顾客珍重活动状态的,也是维护现场。
  5. onStop: Activity被截至并转为不可知阶段及后续的生命周期事件时调用。
  6. onRestart:
    Activity被重新运转时调用。该运动照旧在栈中,实际不是运转新的Activity。
  7. onDestroy: Activity被灭绝时调用。

8.谈谈对视图渲染的规律

5. 四个Activity之间跳转时,旧Activity和新Activity分别施行怎么着生命周期的不二法门

CPU在图像绘制此前向GPU输入指令这一经过通过OpenGL-ES也便是说在显示器绘制UI对象的时候都亟待在CPU中间转播化成多边形再传递GPU进行格栅化操作,格栅化操作达成的格栅化将字符串,按键,路线或许形状的有些高档对象拆分到分化的像素上在荧屏上开展体现

onStart()

6. 五个Activity之间怎么传递数据

9.View的事件传递机制

onStart()

7. Intent传递数据时,能够传递哪些类型数据,哪些数据无法用Intent传递

Bitmap不宜用Intent传输。

万一View的层级关系如下

<ViewGroup1>

<ViewGroup2>

<View>

</ViewGroup2>

</ViewGroup1>

View事件传递顺序ACTION_DOWN

由最上层ViewGroup通过dispathcTouchEvent,假设事件未有被花费(dispatchTouchEventreturn
true),只怕阻止(onInterceptTouch伊芙ntreturn
true),就能逐层传往下递到最底部View,如下所示

Activity.dispatchTouchEvent–>ViewGroup1.dispatchTouchEvent–>ViewGroup1.onInterceptTouchEvent–>ViewGroup2.dispatchTouchEvent–>ViewGroup2.onInterceptTouchEvent–>View.dispatchTouchEvent

要是事件尚无被花费(onTouchEventreturn
true),会逐层往上调用onTouchEvent,如下所示

View.onTouchEvent()->ViewGroup1.onTouchEvent()->ViewGroup1.onTouchEvent()->Activity.onTouchEvent();

当activity正要变得为客商所见时被调用。

8. 请描述一下Intent 和 Intent Filter

10.ART和Dalvik的区别

当activity转向前台时继以onResume(),在activity变为隐敝时继以onStop()。

9. px、dp、sp的区别

Dalvik Android 4.4 会同以下平台应用的设想机;

ART Android4.4以上平台运用的虚构机本事;

在应用程序运行时,JIT通过扩充两次三番的性格剖析来优化程序代码的推行,在程序运维的历程中,Dalvik虚构机在不停的拓宽将字节码编写翻译成机器码的做事。

ART引进了AOT这种预编写翻译技能,在应用程序安装的经过中,ART就已经将有着的字节码重新编写翻译成了机器码。应用程序运维进度中没有必要进行实时的编写翻译职业,只要求展开直接调用.由此,ART不小的增加了应用程序的运行功效,同临时间也缩减了手提式有线电话机的电量消耗,升高了活动设备的续航手艺,在废品回收等体制上也可以有了相当大的升迁。

相对于Dalvik设想机形式,ART格局下Android应用程序的设置要求消耗越来越多的时间,同一时候也会据有更加大的积存空间(指内部积累,用于储存编译后的代码),但节省了重重Dalvik设想机用于实时编写翻译的日子

三、数据层

11.Listview怎么着优化

onResume()
or
onStop()

1. 请介绍下ContentProvider是怎么促成多中国少年共产党享的

复用convertView、ViewHolder的利用、图片滑动中不加载、item
view布局优化、getView尽量少逻辑

   

2. 请介绍下Android的数码存款和储蓄情势

  1. 应用Shared
    Preferences存款和储蓄数据,用来积累key-value,pairs格式的数据,它是三个轻量级的键值存款和储蓄机制,只好够储存核心数据类型。
  2. 采用文件存款和储蓄数据,通过FileInputStream和FileOutputStream对文件进行操作。在Android中,文件是三个应用程序私有的,一个应用程序不可能读写别的应用程序的文本。
  3. 行使SQLite数据库存款和储蓄数据,Android提供的二个典型数据库,协理SQL语句。
  4. 应用Content
    Provider存款和储蓄数据,它的作用便是驱动种种应用程序之间完结数据分享。

近年来提出利用RecycleView来取代

onResume()

3. 事情的意思以及Sqlite中什么贯彻专业

12.若是应用webView在JS中调用java方法

在activity开始与顾客进行互动在此以前被调用。此时activity位于货仓顶上部分,并收受客商输入。

四、网络层

Activity注册Scheme,重写WebViewClient,在shouldOverrideUrlLoading做阻止,管理逻辑就能够。

继之以onPause()。

1. TCP和UDP的区别

13.品种开荒使用什么工具

2. HTML和HTTP的区别

Android
Studio是IDE、Git是版本调节工具、真机测验工具等其余扶助开辟工具,如图片压缩管理的Tinypng

onPause()

3. 在浏览器中输入www.baidu.com后实行的满贯历程

14.安卓热修复,插件化

onPause()

五、多线程

热修复:运维时落实对dex的轮换,已到达动态修复的目标

插件化:通过ClassLoader以及hook技艺完毕的apk的动态拔插

当系统就要运转另一个activity时调用。此办法主要用以将未保存的浮动进行长久化,甘休类似动画这样消耗CPU的动作等。这全体动作应该在长时间内到位,因为下二个activity必需等到此方法再次回到后才会接二连三。

1. 进程与线程之间的牵连与分化

15.怎么样成立线程,线程池及线程池的规律

当activity重新回来前台是继以onResume()。当activity变为顾客不可知时继以onStop()。

2. AsyncTask的意义以及怎么样使用

始建线程: new Thread(new Runnable)

创制线程池: Executors.newCachedThreadPool();

Java通过Executors提供各类线程池,分别为:

newCachedThreadPool成立八个可缓存线程池,假设线程池长度当先管理须求,可灵活回收空闲线程,若无可回收,则新建线程。

newFixedThreadPool
制造叁个定长线程池,可调整线程最大并发数,赶过的线程会在队列中伺机。

newScheduledThreadPool 成立叁个定长线程池,协助定时及周期性职责实践。

newSingleThreadExecutor
成立三个单线程化的线程池,它只会用独一的劳作线程来进行任务,保险全部职分依照钦赐顺序(FIFO,
LIFO, 优先级)实施。

3. 什么样新建线程以及截至线程

16.Android跨进度通信都有这一个形式

onResume()
or
onStop()

4. 线程同步的功效以及有如何同步的不二秘诀

Intent、ContentProvider、BroadCast、Binder

onStop()

5. sleep和wait的作用以及界别

17.互连网央浼用什么框架

当activity不再为客户可知时调用此办法。那说不定发生在它被灭绝恐怕另三个activity(也许是现有的仍然是新的)回到运营情况并隐藏了它。

6. Message、Handler、Message Queue、Looper之间的界别以及涉嫌

三回封装Volley,Volley的Http完成用Okhttp替代。即为Volley+Okhttp

一经activity重回前台跟客商交互则继以onRestart(),假使关闭activity则继以onDestroy()。

7. 什么是ANEnclave以及怎么着防止它?

18.假使防止Viewpage的预加载数据

高级中学级技术员

假定是与Fragment结合使用则经过setUserVisibleHint修改可知度来决定加载

也得以修改Android-support-v4包的源码把viewpager.setOffscreenPageLimit能够安装优先加载的页面个数,暗中同意允许最小是1,能够改为0

onRestart()
or
onDestroy()

一、Java

19.Activity.Fragment,Service生命周期

onDestroy()

1. String.valueof的效能和意义

Activity:OnCreate()->onStart()->onResume()->onPause()->onStop->onDestory

Fragment:onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume->onPause->onStop->onDestroyView->onDestroy->onDetach

Service:

startService() ->onCreate()- >onStartCommand()->Service
running–调用stopService() ->onDestroy()

bindService()->onCreate()->onBind()->Service
running–调用>onUnbind() -> onDestroy()

在activity销毁前调用。那是activity接收的终极三个调用。那大概发生在activity结束(调用了它的
finish()
方法)或然因为系统须求空间所以目前的绝迹了此acitivity的实例时。你能够用isFinishing()
方法来差距这二种状态。

2. SoftReference和WeakReference的区别?

20.什么是Acitivity

二、Android

承继以及突显页面,与客户交互,管理操作

nothing

1. activity的启航情势有啥样?是怎么意思?

21. Service是或不是在main thread
中实践,Service里面是或不是能施行耗费时间的操作?

2.横竖屏切换时候activity的生命周期

2. activity的开发银行格局有哪些?其意思?

核心的Intent Flag有:

  • FLAG_ACTIVITY_NEW_TASK
  • FLAG_ACTIVITY_CLEAR_TOP
  • FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
  • FLAG_ACTIVITY_SINGLE_TOP
  • FLAG_ACTIVITY_NEW_TASK

Service不是独自的经过,亦非独自的线程,它是重视于应用程序的主线程的。所以不能够张开耗费时间操作。如若想做相应单独开线程恐怕使用IntentService

1.不设置Activity的android:configChanges时,切屏会重新调用各种生命周期,切横屏时会推行一遍,切竖屏时会施行三回.
2.设置Activity的android:configChanges=”orientation”时,切屏照旧会重复调用各样生命周期,切横、竖屏时只会实践叁次.
3.设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各种生命周期,只会奉行onConfigurationChanged方法.

3. 什么样启用Service,怎么样停用Service,几时使用瑟维斯

22. 说说Activity、Intent、Service是怎么着关联

3.android中线程与线程,进程与经过之间怎么着通讯

4. Android的经过间通讯机制

intent是activity和service的大桥,通讯员,activity首要操作呈现分界面,service在后台运营,适合长日子运作,如下载,听歌等

1、八个 Android 程序初步运行时,会独自运维四个Process。
暗许景况下,全部那么些程序中的Activity也许Service都会跑在那一个Process。
暗中同意情状下,三个Android程序也唯有多个Process,但二个Process下却得以有那一个个Thread。
2、两个 Android 程序初叶运维时,就有二个主线程Main
Thread被创造。该线程首要担任UI分界面包车型客车显得、更新和控件交互,所以又叫UI
Thread。
叁个Android程序创立之初,多个Process显示的是单线程模型–即Main
Thread,所有的职分都在八个线程中运作。所以,Main
Thread所调用的每四个函数,其耗费时间应该越短越好。而对此比较费力的干活,应该设法交给子线程去做,以幸免阻塞主线程(主线程被打断,会招致程序假死
现象)。 

5. View的onMeasure、onLayout、onDraw的作用

23. 请介绍一下Android的多寡存款和储蓄格局

3、Android单线程模型:Android
UI操作并非线程安全的同时那个操作必需在UI线程中奉行。固然在子线程中一向修改UI,会产生非常。

6. 简述事件分发机制

1、使用SharedPreferences存款和储蓄数据;

2、文件存款和储蓄数据;

3、SQLite数据仓库储存款和储蓄数据;

4、使用ContentProvider存款和储蓄数据;

5、互联网存款和储蓄数据;

4.在android中mvc的现实性呈现

7. Bitmap加载进度中OOM了怎么做?

24. Listview怎么着实现分页加载

Android 的官方提议应用程序的开支应用MVC 形式。MVC
是Model,View,Controller 的缩写,MVC 富含多少个部分:

8. 不等模块间怎么样通讯以及其规律?

伊夫ntBus类似的逻辑

1.定义分页接口,关键七个字段。总量量count,当前页数pageIndex,每页大小pageSize。

2.概念一个分子变量list来保卫安全数据,得到分页数据后使用addAll
把新数据增加进去,adapter文告数据集有更新就能够

..
模型(Model)对象:是应用程序的大旨部分,全部的工作逻辑都应有写在该层。

9. APK打包流程?

  • 包装能源文件,生成帕杰罗.java文件(打包工具aapt)
  • 处理AIDL文件,生成对应的Java文件。
  • 编写翻译工程源代码,生成对应的class文件。
  • 改造全部的class文件,生成classes.dex文件。
  • 打包生成APK文件
  • 对APK包举行签订契约

25. Java中援用类型都有这个

.. 视图(View)对象:是应用程序中承担生成客商分界面包车型客车部分。也是在漫天MVC
框架结构中客商唯一能够看来的一层,接收客商的输入,呈现处理结果。

10. 代码混淆的意义,以及哪些运用?

1.强引用

那是选取最遍布的援引。假若三个目的具有强援引,这就
类似于至关重要的生活用品,垃圾回收器绝不会回收它。当内部存款和储蓄器空
间不足,Java设想机宁愿抛出OutOfMemoryError错误,使程序极其终止,也不会靠随便回收具备强援引的靶子来缓和内部存款和储蓄器不足难点。

2.软引用(SoftReference)

纵然一个目的只持有软援引,那就就像于可有可物的生活用品。借使内部存款和储蓄器空间丰富,垃圾回收器就不会回收它,假使内部存款和储蓄器空间不足了,就能回收那一个指标的内部存款和储蓄器。只要垃圾回收器未有回收它,该目的就足以被前后相继采用。软援用可用来落到实处内部存款和储蓄器敏感的高速缓存。软援用能够和二个援用队列(ReferenceQueue)联合利用,若是软援引所引述的靶子被垃圾回收,Java设想机就能够把这几个软引用投入到与之提到的援引队列中。

3.弱引用(WeakReference)

万一八个对象只具有弱引用,那就类似于可有可物的生活用品。
弱援用与软援用的界别在于:只具备弱援用的目的具有越来越短命的生命周期。在垃圾堆回收器线程扫描它
所管辖的内部存款和储蓄器区域的经过中,一旦发觉了只享有弱引用的目的,不管当前内存空间丰富与否,都会回收它的内存。可是,由于废品回收器是三个预先级异常的低的线程,
因而不必然会神速开掘那个只具备弱引用的指标。弱引用能够和二个引用队列(ReferenceQueue)联合使用,假使弱援用所援用的指标被垃圾回收,Java虚构机就能够把那些弱引用参加到与之提到的引用队列中。

4.虚引用(PhantomReference)

“虚援用”从名称想到所富含的意义,便是形同虚设,与另外三种引用都不可同日而语,虚引用并不会操纵对象的生命周期。借使一个对象仅具备虚援用,那么它就和尚未别的引用同样,在其余时候都大概被垃圾回收。

..
调控器(Control)对象:是基于顾客的输入,调控客商界面数据显示及立异Model
对象意况的有些,调整器更主要的一种导航功用,想用客商出发的相干事件,交给M
哦得了拍卖。

三、网络层

26. Serializable和Parcelable的界别是?

Android 鼓舞弱耦合和零部件的任用,在Android 中MVC 的现实性突显如下

1. HTTPS如何保管安全

Serializable:Serializable是体系化的情致,表示将一个目的调换到可存储或可传输的情况。类别化后的靶子可以在互联网上进展传输,也能够储存到地点。

Parcelable(android
专项使用):除了Serializable之外,使用Parcelable也足以完毕平等的效劳,不过不一致于将目的开展系列化,Parcelable形式的贯彻原理是将一个完好无缺的指标实行讲明,

1)视图层(view):一般选用xml文件进行分界面包车型客车呈报,使用的时候可以拾贰分便于的引入,当然,如何你对android领悟的比较的多了话,就必将能够想开在android中也可以行使javascript+html等的点子作为view层,当然这里需求开展java和javascript之间的通讯,幸运的是,android提供了它们之间充足方便的通讯完毕。
2)调控层(controller):android的调节层的重
任常常落在了非常多的acitvity的肩上,那句话也就暗含了不用在acitivity中写代码,要经过activity交割model业务逻辑层管理,
这样做的别的一个缘由是android中的acitivity的响应时间是5s,要是耗费时间的操作放在这里,程序就很轻便被回收掉。
3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面管理,当然对事情总括等操作也是必需放在的该层的。

2. 顾客端向服务器发起HTTP哀告,客商端和服务器全数推行的流程

27. Fragment和Activity之间怎么广播发表?

5.Android常用控件的音信

四、质量优化

1.Fragment从来调用Activity中的public方法

2.使用接口回调格局

3.广播格局

4.EventBus事件总线

5.文件分享

单选框(RadioButton与RadioGroup):

1. 形成App卡顿的缘由有怎么着?如何定位及修复?

  • 双重生成过多指标,变成频仍GC
  • CPU过高,导致UI层不能够即时的刷新
  • 布局复杂
  • 紧接绘制

28. Android属性优化

RadioGroup用于对单选框实行分组,同样组内的单选框独有四个单选框被选中。

2. Java层的内部存款和储蓄器泄漏的原因及怎么着定位?



动用优化布局层数。 采用

延时加载View. 选取ViewStub 制止有个别不平日的视图长时间被引述,占用内部存款和储蓄器.

移除Activity暗中认可背景,提高activity加载速度。

削减滥用static变量

布局降低嵌套,制止过度重绘

IO操作时记得关闭流

询问完数据库时关闭游标

ListView的优化

图片用完记得及时回收

事件:setOnCheckedChangeListener(),管理单选框被增选事件。把RadioGroup.OnCheckedChangeListener实例作为参数传入。

3. 哪些接纳JNI层来优化品质?

29. Android显示器适配都有这么些

 

4. JNI传递数据需求专心怎么样难点?

  • new byte[]和ByteBuffer.allocateDirect的区别
  • Release的两种格局(0、JNI_ABORT、JNI_COMMIT)的区别

具体参见:JNI
Tips

  1. 使用.9Path图片

2.一套标准分辨率图,布局单位采纳db, 文字sp

3.虚拟一屏非常不够显示情形,使用ScrollView

4.只要强制一屏显得单独适配可以定义多套dimens.xml

多选框(CheckBox):

5. 怎么样是ABI,差异的ABI能还是不可能混用?

30. Android中卡通有哪几类,他们的特征和界别是怎样

每种多选框都以单独的,能够经过迭代全数的多选框,然后依据其情景是还是不是被入选在获得其值。

高工

第一是Tween动画,

Tween动画:使试图组件移动,放大,收缩以及发生光滑度的转移。

第二是Frame动画。

Frame帧动画正是近似电影,由多张图片切换而成。

其三是性质动画

通过动画的办法更改目的的本性

事件:setOnCheckedChangeListener(),管理多选框被挑选事件。把CheckBox.OnCheckedChangeListener()实例作为参数字传送入。

一、虚拟机

31. 在档案的次序中,你是怎么缓存数据的?

 

1. Java为啥能调用到C++写的东西?其原理是何许的?

  1. 图片、文件的缓存一般位于磁盘上

  2. 本地DB缓存

  3. SharedPreference数据放一些非安全性的量

下拉列表框(Spinner):

2. 简述下Java设想机的GC机制。

32.
请轻便说说,LinearLayout和RelativaLayout两个的区分,并分别讲述在怎么着情状下利用,对品质损耗更加小

Spinner.getItemAtPosition(Spinner.getSelectedItemPosition());获取下拉列表框的值。

二、网络层

答:
在颇具多层嵌套的情事下,请缅想RelativeLayout以减少嵌套,那样在剖判布局文件时就能回退调用onMeasure和onLayout
提升品质

事件:setOnItemSelectedListener(),管理下拉列表框被增选事件把Spinner.OnItemSelectedListener()实例作为参数字传送入。

1. HTTPS中,证书链是怎么着?

33.在开辟中,你是ip直连,依然通过域名访问?

 

2. Tcp建设构造长连时,本人友好会有心跳机制,为何一般工作还大概会在业务层再追加一个心跳机制?


一般经过域名访谈,但这种景观下会有被运维商DNS威逼的危殆,常见的景象是h5页面无缘无故扩大了广告

通过ip直连就消除了该难点,因为省略了本地DNS缓存服务器。

拖动条(SeekBar):

3. 自行登陆的达成,以及如何保管音讯安全?

SeekBar.getProgress()获取拖动条当前值

4. 万一常常的事体是行使HTTP向服务器发起呼吁,怎样保障安全?

事件:setOnSeekBarChangeListener(),管理拖动条值变化事件,把SeekBar.OnSeekBarChangeListener实例作为参数字传送入。

三、系统层

 

1. java.lang.UnsatisfiedLinkError是什么样难题?为啥会油不过生这种难点?

菜单(Menu):

2. Android Studio在断点断下来的时候,仓库是何等取得的?

重写Activity的onCreatOptionMenu(Menu
menu)方法,该情势用于创设选项菜单,当顾客按出手提式无线电话机的”Menu”开关时就能够显示创立好的美食做法,在onCreatOptionMenu(Menu
Menu)方法内部能够调用Menu.add()方法实现菜单的增加。

3. 两样的abi为何不可能混用?

重写Activity的onMenuItemSelected()方法,该办法用于拍卖菜单被挑选事件。

4. 接纳过怎么着同步机制,以及它们之间的优劣?

 

5. 类别是哪些完成锁进制的?过多得加锁会导致哪些难题?

进程对话框(ProgressDialog):

6. Binder的统一计划原因、简述原理、AIDL的成效、为啥会有概况1M的限定?

成立并出示贰个速度对话框:ProgressDialog.show(ProgressDialogActivity.this,”请稍等”,”数据正在加载中….”,true);

四、APP架构

安装对话框的品格:setProgressStyle()

1. 您认为相比较好的app结构是哪些的?

ProgressDialog.STYLE_SPINNE奥迪Q7  旋转进程条风格(为暗中认可风格)

2. 哪些规划贰个多进度的app结构?

ProgressDialog.STYLE_HO君越IZONTAL 横向进度条风格

3. MVC、MVP、MVVM精晓过什么?感到这么些设计形式怎样?

 

4. 热修复的法则?

①EditText(编辑框)的事件监听—OnKeyListener
②RadioGroup、RadioButton(单选开关)的事件监听—OnCheckedChangeListener
③CheckBox(多选按键)的事件监听—OnCheckedChangeListener
④Spinner(下拉列表)的平地风波监听—OnItemSelectedListener
⑤Menu(菜单)的事件管理—onMenuItemSelected
⑥Dialog(对话框)的风云监听—DialogInterface.OnClickListener()

五、调节和测量试验技艺

6.请介绍下Android中常用的各种布局

1. 一般怎么着寻觅难题?

打断点(普通断点、条件断点、变量断点),看日志,JDB,Xposed。

Android布局是使用分界面开垦的主要一环,在Android中,共有多种布局情势,分别是:FrameLayout(帧布局),LinearLayout
(线性布局),AbsoluteLayout(相对布局),RelativeLayout(相对布局),TableLayout(表格布局)。 

2. 咋样稳固JNI的崩溃难点?

android自身提供的crash日志,breakpad能够收获更详实的日志(若是选拔了Bugly,应该就有其一力量)。

1.FrameLayout    

3. 怎么牢固由于饭馆破坏导致的JNI崩溃难点?

      
这些布局能够当做是墙脚堆东西,有四个四方的矩形的左上角墙脚,我们放了第三个东西,要再放贰个,那就在位于原本放的任务的方面,那样家家户户的放,会盖住原来的事物。这几个布局比较轻便,也不得不放一点相比较轻便的东西。    

4. 怎样定位及分析JNI泄漏

2.LinearLayout    

六、OpenGL相关

      
线性布局,那一个东西,从外框上能够知道为三个div,他率先是多少个一个从上往下罗列在荧屏上。每四个LinearLayout里面又可分为垂直布局
(android:orientation=”vertical”)和品位布局(android:orientation=”horizontal”
)。当垂直布局时,每一行就独有三个因素,八个因素依次垂直往下;水平布局时,独有一行,每一个要素依次向右排列。    

1. Surface、SurfaceView、SurfaceTexture的差别?

LinearLayout中有多个尤为重要的特性android:layout_weight=”1″,这么些weight在笔直布局时,代表行距;水平的时候表示列宽;weight值越大就越大。    

2. View最终是怎样显示到显示器上的?

3.AbsoluteLayout    

3. 有打探过怎么着从OpenGL里面读取图像的技能?

      
相对布局犹如div钦点了absolute属性,用X,Y坐标来内定成分的职位android:layout_x=”20px”
android:layout_y=”12px”
这种布局情势也相比较轻巧,不过在笔直随便切换时,往往会出难题,何况七个要素的时候,总计比较费心。    

4.RelativeLayout    

   
相对布局能够精通为某三个因素为参照物,来稳固的布局格局。首要质量有:    

    相对于某四个要素    

    android:layout_below=”@id/aaa” 该因素在 id为aaa的上边    

    android:layout_toLeftOf=”@id/bbb” 该因素在 id为bbb的左臂 

     相对于父成分的地点    

     android:layout_alignParentLeft=”true”  与父成分左对齐    

     android:layout_alignParentRight=”true” 与父成分右对齐    

     还足以钦点边距等,具体详见API    

5.TableLayout    

    
表格布局类似Html里面包车型客车Table。每贰个TableLayout里面有报表行TableRow,TableRow里面能够切实定义每多个要素,设定他的对齐方式android:gravity=”” 。    

    
每三个搭架子都有和睦适合的章程,其它,那三个布局元素得以相互嵌套应用,做出漂亮的分界面。

7.ListView的优化方案

1.比方自定义适配器,那么在getView方法中要思量方法传进来的参数contentView是不是为null,要是为null就创办contentView并赶回,要是不为null则直接动用。在这一个情势中,尽或许少创立view。

2.给contentView设置tag(setTag()),传入贰个viewHolder对象,用于缓存要显得的数额,能够完成图像数据异步加载的功能

3.借使listview供给展现的item相当多,就要思考分页加载。举例一共要来得100条或许越来越多的时候,大家能够虚拟先加载20条,等顾客拉到列表尾部的时候,再去加载接下去的20条。

8.广播接收者生命周期

广播接收器独有一个回调方法:

void onReceive(Context curContext, Intent broadcastMsg)

当播放音讯达到接收器时,Android调用它的onReceive()方法并将满含新闻的Intent对象传递给它。广播接收器仅在它实践这些办法时处于活跃状态。当onReceive()再次来到后,它即为失活状态。
享有二个欢蹦乱跳状态的广播接收器的历程被爱护起来而不会被杀掉。但仅具有失活状态组件的进程则会在其余进度须求它所占用的内部存款和储蓄器的时候每一天被杀掉。
这种方法引出了一个难点:要是响应三个播放信息供给十分长的一段时间,大家一般会将其归入三个衍生的线程中去实现,并不是在主线程内完毕它,进而确定保证客户交互进度的通畅。假若onReceive()衍生了一个线程而且重临,则满含新线程在内的成套进度都被会判为失活状态(除非进度内的别样应用程序组件仍处于活跃状态),于是它就有希望被杀掉。这么些题指标缓慢解决办法是令onReceive()运维贰个新服务,并用其完结职务,于是系统就能掌握进度中依旧在管理着办事。

9.4种activity的开发银行情势

standard: 规范方式,一调用startActivity()方法就能够产生多个新的实例。 

singleTop:
假设已经有一个实例位于Activity栈的最上部时,就不爆发新的实例,而只是调用Activity中的newInstance()方法。即便不放在栈顶,会发出一个新的实例。 

singleTask:
会在贰个新的task中生出那几个实例,未来每一次调用都会选拔这些,不会去爆发新的实例了。 

singleInstance:
这几个跟singleTask基本上是千篇一律,唯有二个界别:在那几个方式下的Activity实例所处的task中,只好有其一activity实例,不可能有别的的实例。

10.Android Intent的使用

在二个Android应用中,首假诺由局地零部件组成,(Activity,Service,ContentProvider,etc.)在那么些零件之间的简报中,由Intent支持实现。

正如网络一些人剖析所说,Intent肩负对利用中一遍操作的动作、动作涉及数额、附加数据实行描述,Android则依据此Intent的陈诉,担负找到相应的零部件,将
Intent传递给调用的机件,并达成组件的调用。Intent在此地起着完毕调用者与被调用者之间的解耦功效。
Intent传递进程中,要找到对象顾客(另七个Activity,IntentReceiver或Service),相当于Intent的响应者,有二种方法来同盟:
1,呈现匹配(Explicit):

public TestB extents Activity  
{  
// .........  
};  
 public class Test extends Activity  
{  
     //......  
     public void switchActivity()  
     {  
            Intent i = new Intent(Test.this, TestB.class);  
            this.startActivity(i);  
     }  
}

代码简洁明了,实施了switchActivity()函数,就能够即时跳转到名字为TestB的Activity中。
2,隐式相称(Implicit):
隐式相配,首先要相配Intent的几项值:Action, Category,
Data/Type,Component.倘诺填写了Componet正是上例中的Test.class那就造成了呈现相称。所以此部分只讲前二种匹配。相配准则为最大匹配法规,

1),假若您填写了Action,如若有叁个主次的Manifest.xml中的某二个Activity的IntentFilter段中定义了蕴藏了大同小异的Action那么那一个Intent就与这几个指标Action匹配,即使这一个Filter段中绝非定义Type,Category,那么这一个Activity就十二分了。可是假使手提式有线话机中有多个以上的前后相继相配,那么就能弹出叁个对话可框来唤起表明。
Action的值在Android中有为数十分多预订义,假若您想一向转到你自个儿定义的Intent接收者,你可以在接收者的IntentFilter中进入多个自定义的Action值(相同的时间要设定Category值为”android.intent.category.DEFAULT”),在你的Intent中设定该值为Intent的Action,就平素能跳转到你自个儿的Intent接收者中。因为那一个Action在系统中是独一的。
2),data/type,你能够用Uri来做为data,比方

Uri uri = Uri.parse(http://www.google.com );
Intent i = new Intent(Intent.ACTION_VIEW,uri);

手提式有线电话机的Intent分发过程中,会基于http://www.google.com
的scheme判定出数据类型type.手提式无线电话机的Brower则能合营它,在Brower的Manifest.xml中的IntenFilter中首先有ACTION_VIEW
Action,也能管理http:的type,
3),至于分类Category,一般不要去在Intent中设置它,假如您写Intent的接收者,就在Manifest.xml的Activity的IntentFilter中包括android.category.DEFAULT,这样具备不安装Category(Intent.addCategory(String
c);)的Intent都会与那一个Category相称。
4),extras(附加音讯),是别的具有附加新闻的集合。使用extras可以为组件提供扩大音信,举例,若是要推行“发送电子邮件”这些动作,能够将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。

11.比如后台的Activity由于某原因被系统回收了,怎么样在被系统回收此前封存当前状态?

当你的程序中某三个Activity A
在运作时中,主动或被动地运营另多少个新的Activity B 这一年A会举行

public void onSaveInstanceState(Bundle outState) {   
      super.onSaveInstanceState(outState);    
      outState.putLong("id", 1234567890);
}

B 完结今后又会来找A,
那个时候就有三种状态,一种是A被回收,一种是从未被回收,被回收的A将在再一次调用onCreate()方法,不相同于直接开行的是那回onCreate()里是带上参数savedInstanceState,没被撤销的就依然onResume就好了。

savedInstanceState是一个Bundle对象,你基本上能够把他领略为系统帮您维护的一个Map对象。在onCreate()里你只怕会
用到它,如果寻常运转onCreate就不会有它,所以用的时候要一口咬住不放一下是还是不是为空。

if(savedInstanceState != null){  
     long id = savedInstanceState.getLong("id");  
}

12.请解释下在单线程模型中Message、Handler、Message
Queue、Looper之间的关联。

答:简单来讲,Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中收取Message,再有Handler实行Message的分发和管理.

Message Queue(音信队列):用来贮存在通过Handler发表的音讯,经常附属于某三个开立它的线程,能够经过Looper.myQueue()获得当前线程的音信队列

Handler:能够颁发或然管理多个音讯还是操作三个Runnable,通过Handler宣布音讯,音讯将只会发送到与它涉及的新闻队列,然也只好管理该音讯队列中的音讯

Looper:是Handler和信息队列之间通信桥梁,程序组件首先通过Handler把音信传递给Looper,Looper把音信放入队列。Looper也把音信队列里的音讯广播给持有的

Handler:Handler接受到消息后调用handleMessage举办拍卖

Message:音讯的项目,在Handler类中的handleMessage方法中获得单个的消息举行拍卖

在单线程模型下,为了线程通讯难题,Android设计了七个Message
Queue(新闻队列), 线程间能够经过该Message
Queue并构成Handler和Looper组件进行音讯交流。下边将对它们进行分级介绍:

  1. Message

Message消息,领会为线程间沟通的新闻,管理数量后台线程需求更新UI,则发送Message内含一些多少给UI线程。

  1. Handler

Handler管理者,是Message的首要管理者,肩负Message的出殡和埋葬,Message内容的进行管理。后台线程正是经过传进来的
Handler对象引用来sendMessage(Message)。而使用Handler,必要implement
该类的
handleMessage(Message)方法,它是管理那么些Message的操作内容,举个例子Update
UI。经常需求子类化Handler来达成handleMessage方法。

  1. Message Queue

Message
Queue音信队列,用来贮存在通过Handler发布的音信,遵照先进先出施行。

    各类message
queue都会有三个对应的Handler。Handler会向messagequeue通过二种艺术发送音信:sendMessage或post。那三种音讯都会插在message
queue队尾并按先进先出推行。但通过那三种办法发送的新闻施行的点子略有分化:通过sendMessage发送的是多个message对象,会被
Handler的handleMessage()函数管理;而由此post方法发送的是一个runnable对象,则会和煦实践。

  1. Looper

Looper是每条线程里的Message
Queue的管家。Android未有Global的MessageQueue,而Android会自动替主线程(UI线程)创建Message
Queue,但在子线程里并从未树立Message
Queue。所以调用Looper.getMainLooper()获得的主线程的Looper不为NULL,但调用Looper.myLooper()获得当前线程的Looper就有不小也许为NULL。对于子线程使用Looper,API
Doc提供了合情合理的施用方式:这几个Message机制的大约流程:

    1. 在Looper.loop()方法运行起来后,循环地遵照接收顺序抽出Message
Queue里面包车型的士非NULL的Message。

    2. 一开头Message
Queue里面包车型地铁Message都以NULL的。当Handler.sendMessage(Message)到Message
Queue,该函数里面安装了十二分Message对象的target属性是现阶段的Handler对象。随后Looper抽出了丰盛Message,则调用
该Message的target指向的Hander的dispatchMessage函数对Message进行管理。在dispatchMessage方法里,怎么着管理Message则由顾客钦点,多少个推断,优先级从高到低:

    1)
Message里面包车型客车Callback,一个兑现了Runnable接口的对象,在那之中run函数做处监护人业;

    2)
Handler里面包车型大巴mCallback指向的一个兑现了Callback接口的靶子,由其handleMessage进行拍卖;

    3)
管理新闻Handler对象对应的类承继并促成了内部handleMessage函数,通过这几个完结的handleMessage函数管理新闻。

    总之,大家达成的handleMessage方法是优先级最低的!

    3. Handler拍卖完该Message (updateUI)
后,Looper则设置该Message为NULL,以便回收!

   
在网络有众多文章陈述主线程和任何子线程如何互相,传送新闻,最后什么人来举行管理音信等等的,个人理解是最简易的主意——推断Handler对象里面包车型客车Looper对象是属于哪条线程的,则由该线程来实行!

    1. 当Handler对象的构造函数的参数为空,则为当前所在线程的Looper;

    2.
Looper.getMainLooper()获得的是主线程的Looper对象,Looper.myLooper()获得的是当下线程的Looper对象。

13.View, 三星平板View,
GLSurfaceView有啥样分别

view是最基础的,必须在UI主线程内更新画面,速度很慢。
SurfaceView
是view的子类,类似利用双缓机制,在新的线程中革新画面所以刷新分界面速度比view快
GLSurfaceView 是SurfaceView的子类,opengl 专用的

14.根据自身的精通描述下Android数字签字

(1)全部的应用程序都无法不有数字证书,Android系统不会安装多少个从未有过数字证书的应用程序
(2)Android程序包使用的数字证书能够是自签订合同的,无需一个高雅的数字证书机构签订左券认证
(3)如若要正式公布多少个Android程序,必得接纳叁个适合的私钥生成的数字证书来给程序具名,而不可能动用adt插件可能ant工具生成的调整证书来发表。
(4)数字证书都以有保质期的,Android只是在应用程序安装的时候才会检讨申明的保藏期。如若程序已经设置在系统中,纵然证书过期也不会影响程序的正常功效。

15.Dalvik基于JVM的改进

1.多少个class变为三个dex,constant pool,外省存

2.Zygote,copy-on-write shared,省内存,省cpu,省电

3.遵照存放器的bytecode,省指令,省cpu,省电

4.Trace-based JIT,省cpu,省电,省内存

16.android中有哪三种分析xml的类,官方推荐哪个种类?以及它们的准则和界别

Ø DOM解析

优点:

1.XML树在内部存款和储蓄器香港中华总商会体存款和储蓄,由此能够直接修改其数据和结构. 

2.得以经过该剖判器随时访谈XML树中的任何一个节点. 

3.DOM深入分析器的API在运用上也针锋绝相比较较简单.

缺点:

假若XML文书档案体量十分大时,将文书档案读入内部存款和储蓄器是不行消耗系统能源的.

选取景况:

DOM 是用与平台和言语非亲非故的措施表示 XML 文书档案的官方 W3C 标准.DOM
是以档案的次序结构组织的节点的集结.这么些等级次序结构允许开荒职员在树中找找特定音信.剖析该组织常常要求加载整个文书档案和布局档期的顺序结构,然后本领拓宽其余专门的职业.DOM是依照对象等级次序结构的.

Ø SAX解析

优点:

SAX
对内部存款和储蓄器的渴求比比较低,因为它让开荒职员本身来支配所要管理的标签.极度是当开垦人士只需要管理文书档案中所包涵的局部数据时,SAX
这种扩充工夫赢得了越来越好的展示.

缺点:

用SAX方式开展XML解析时,须求各样施行,所以很难访谈到均等文书档案中的差异数据.另外,在依靠该方法的深入分析编码进程也相对复杂.

动用意况:

对于包蕴数据量十一分巨大,而又毫无对文书档案的兼具数据举办遍历或许剖判的时候,使用该方法丰硕有效.该办法毫无将总体文书档案读入内部存款和储蓄器,而只需读取到程序所需的文书档案标签处就可以.

Ø Xmlpull解析

android SDK提供了xmlpull
api,xmlpull和sax类似,是遵照流(stream)操作文件,然后根据节点事件回调开拓者编写的拍卖程序.因为是基于流的处理,因而xmlpull和sax都相比较节约内部存款和储蓄器能源,不会象dom那样要把具备节点以对橡树的花样表现在内存中.xmlpull比sax更简明,并且无需扫描完全体流.

17.双缓冲才能原理以及优劣势

创设一幅后台图像,将每一帧画入图像,然后调用drawImage()方法将全方位后台图像三遍画到显示屏上去。

亮点:双缓冲本事的长处在于抢先二分一绘制是离屏的。

            将离屏图像叁遍绘至显示器上,比直接在荧屏上制图要使得得多。

            双缓冲手艺可以使动画平滑。

劣点:要分配一个后台图像的缓冲,借使图像相当大,那将攻陷比异常的大一块内存。

18.Socket通讯编制程序

顾客端编制程序步骤:

1、 创制客商端套接字(钦点服务器端IP地址与端口号)

2、 连接(Android 创造Socket时会自动连接)

3、 与劳务器端进行通讯

4、 关闭套接字

劳务器端:

1.创办一个ServerSocket,用于监听顾客端Socket的接连诉求

2.应用循环不断接受来自客商端的哀告

3.每当接受到顾客端Socket的伸手,服务器端也对应产生二个Socket

自己是君主盖地虎的分水岭                                                                                        

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图