android 基础知识点

1:
private static CrimeLab sCrimeLab;
android命名规范:看到s前缀就可以知道sCrimeLab是个静态变量。
2:
Android中的java代码在变量前面加上m是什么 意思,加上a又是什么意思?
m表示 member, 即 类的成员, a 表示 attribute, 表示 参数
3:
像R.id.qustion这样的,其都是int类型,而非String类型,即资源id都是int类型(可能是在r.java文件中,ID都是int类型有关)
4:按住ctrl键,鼠标点击方法或者变量,都会在此文件下显示出来,该方法的源代码和函数的解释都会出来,和官方文档一样。
5:android.R.layout和R.layout是有区别的 android.R.layout是Android SDK自带的布局文件 R.layout是自己在res目录下面写的布局
6:在java世界,要保存对象,要么将其放入Boundle中,要么实现Serializable接口或者parcelable接口。
7; <item name="#1">#2</item>             1.item的name属性#1可以为所有系统所带组件的属性,#2为此属性的值
8:android:textStyle = "bold"  //设置字体为粗体
9:ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流读取。
 FileInputStream fis = new FileInputStream("t.tmp");
        ObjectInputStream ois = new ObjectInputStream(fis);


        int i = ois.readInt();
        String today = (String) ois.readObject();
        Date date = (Date) ois.readObject();


        ois.close();
10:
//获取IP地址
System.out.println(addr.getHostAddress());
//获取本机的名字/或者服务器的域名
System.out.println(addr.getHostName());
11:
eclipse导出的android项目有两种,一种是供eclipse使用的,一种是供androidstudio使用的,两者的差别在于根目录下有么有build文件夹和build.gradle文件,有的就是androidstudio项目,没有的就是eclipse项目。“eclipse项目”不可以导入到androidstudio中。因为没有这两个文件。
12:解决android studio编译版本问题:
将自己的项目下的build文件和build.gradle文件覆盖掉导入的项目中的这两个文件
13:如果引用的第三方库的支持库版本低于(或者不一致)app build.gradle中的支持库版本,可能会出现如下问题:


all com.android.support libraries must use the exact same version specification(mixing versions can lead to runtime crashes)


如下图所示:


屏幕快照 2017-09-10 12.58.38.png


去改第三方库所用的支持库版本比较麻烦,如果用的库很多的话工作量很大。这个时候我们可以考虑强制让所有模块都用相同的支持库版本。


在app build.gradle中添加:


configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == 'com.android.support') {
            if (!requested.name.startsWith("multidex")) {
                details.useVersion '25.2.0'
            }
        }
    }
}
其中,25.2.0就是你要使用的支持库版本号,你可以根据需要改成其它的。
14:在androidstudio中的xml下的design出现error时(text没有出现错误),很奇怪,点击下面的refresh,error就消失了。
15:foreach循环的使用
for(String str:list){
System.out.println(str);
}
14:
Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值。
15:
对Context的理解可以说,Context提供了一个应用的运行环境,在Context的大环境里,应用才可以访问资源,才能完成和其他组件或服务的交互。
getActivity:作用是获取当前fragment托管的activity
16:<string name="subtitle_format">%1$s crimes</string>
%1$s什么意思?

整型,比如“我今年23岁了”,这个23是整型的。在string.xml中可以这样写,<string name="old">我今年%1$d岁了</string> 

17:

这个东东点进去之后进入下面这个页面


通过修改这个可以直接修改build.gradle文件。

18

什么是gradle? 
gradle是一个项目构建工具,java开发中有两个大名鼎鼎的项目构建Maven,Ant,其中maven简单易控深受开发者喜爱。 

  

最外层的build.gradle文件是在project文件中,第二个build.gradle文件是在app目录下(一个project可以有多个moudle,也就是说可以有多个app)build.gradle(Module:app)

19

intent i = new Intent(Intent.ACTION_MAIN);

i.addCategory(Intent.CATEGORY_LAUNCHER);

PackageManager pm = getActivity().getPackageManager();//使用packageManager获取所有可以启动的主activity。

List<ResolveInfo> activities = pm.queryIntentActivities(i,0);

Log.i(TAG,"Found"+activities.size()+"activities");

为什么不能使用以下常用的方法?

intent i = new Intent(Intent.ACTION_SEND);

i.addCategory(Intent.CATEGORY_LAUNCHER);

i = Intent.createChooser(i,getString(R.string.send_report));

startActivity(i);


原因很简单:调用startActivity();方法时,操作系统会悄悄为目标intent过滤器添加Intent.CATEGORY_DEFAULT类别。而我们只想获取category为CATEGORY_LAUNCHER的activity,那么那些有CATEGORY_LAUNCHER而没有CATEGORY_DEFAULT的activity无法被显示,显然出错。

20

Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。

java的跨平台不是java源程序的跨平台 ,如果是这样,那么所以语言都是跨平台的, java源程序先经过javac编译器编译成二进制的.class字节码文件(java的跨平台指的就是.class字节码文件的跨平台,.class字节码文件是与平台无关的),.class文件再运行在jvm上,java解释器(jvm的一部分)会将其解释成对应平台的机器码执行,所以java所谓的跨平台就是在不同平台上安装了不同的jvm,而在不同平台上生成的.class文件都是一样的,而.class文件再由对应平台的jvm解释成对应平台的机器码执行。

最后解释下机器码和字节码的区别: 一,机器码,完全依附硬件而存在~并且不同硬件由于内嵌指令集不同,即使相同的0 1代码 意思也可能是不同的~换句话说,根本不存在跨平台性~比如~不同型号的CPU,你给他个指令10001101,他们可能会解析为不同的结果~ 二,我们知道JAVA是跨平台的,为什么呢?因为他有一个jvm,不论哪种硬件,只要你装有jvm,那么他就认识这个JAVA字节码~~~~至于底层的机器码,咱不用管,有jvm搞定,他会把字节码再翻译成所在机器认识的机器码~~~


21

java虚拟机是一个可以执行java字节码的虚拟机进程

虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器堆栈寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

让我们尝试从操作系统的层面来理解虚拟机。我们知道,虚拟机是运行在操作系统之中的,那么什么东西才能在操作系统中运行呢?当然是进程,因为进程是操作系统中的执行单位。可以这样理解,当它在运行的时候,它就是一个操作系统中的进程实例,当它没有在运行时(作为可执行文件存放于文件系统中),可以把它叫做程序。

最后做一个总结:

1 虚拟机并不神秘,在操作系统的角度看来,它只是一个普通进程。

2 这个叫做虚拟机的进程比较特殊,它能够加载我们编写的class文件。如果把JVM比作一个人,那么class文件就是我们吃的食物。

3 加载class文件的是一个叫做类加载器的子系统。就好比我们的嘴巴,把食物吃到肚子里。

4 虚拟机中的执行引擎用来执行class文件中的字节码指令。就好比我们的肠胃,对吃进去的食物进行消化。

5 虚拟机在执行过程中,要分配内存创建对象。当这些对象过时无用了,必须要自动清理这些无用的对象。清理对象回收内存的任务由垃圾收集器负责。就好比人吃进去的食物,在消化之后,必须把废物排出体外,腾出空间可以在下次饿的时候吃饭并消化食物。

22:序列化问题        网址:http://blog.csdn.net/zcl_love_wx/article/details/52126876(以下只是部分)

所有分布式应用常常需要跨平台,跨网络,因此要求所有传的参数、返回值都必须实现序列化。

一、定义

  序列化:把Java对象转换为字节序列的过程。 
   
  反序列化:把字节序列恢复为Java对象的过程。

二、用途

  对象的序列化主要有两种用途: 
   
  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;(持久化对象) 
   
  2) 在网络上传送对象的字节序列。(网络传输对象)

三、实现

  实现了如下两个接口之一的类的对象才能被序列化: 
   
  1) Serializable 
   
  2) Externalizable

  序列化:ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

  反序化:ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

  注:使用writeObject() 和readObject()方法的对象必须已经被序列化

四、深入理解

一、为什么要序列化?

  Java平台允许我们在内存中创建可复用的Java对象,但只有当JVM(Java虚拟机)处于运行时,这些对象才可能存在,也就是这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存指定的对象(持久化对象),并在将来重新读取被保存的对象。Java对象序列化就实现了该功能。 
   
  网络通信时,无论是何种类型的数据,都会转成字节序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。Java对象序列化也实现了该功能。

  所以序列化机制会把内存中的Java对象转换成与平台无关的二进制流,从而永久地保存在磁盘上或是通过网络传输到另一个网络节点。


1 ,MVC设计模式中,M指模型层,V指视图层,C指控制层

2,将一个Activity设置成窗口的样式,只需设置Theme

  1. <style name= "Theme.FloatActivity"  parent= "android:style/Theme.Dialog" >  
  2.     <!-- float_box为我们定义的窗口背景 ,这个不是必须的-->  
  3.     <item name="android:windowBackground" > @drawable /float_box</item>  

  1. </style>  

还要在androidManifest.xml文件中加入以下说明

  1. android:theme= "@style/Theme.FloatActivity"   


3  android进程重要性依次是:前台进程、可见进程、服务进程、后台进程、空进程。所以销毁的顺序为逆方向。

4:

  1. 前台进程

    用户当前操作所必需的进程。如果一个进程满足以下任一条件,即视为前台进程:

    通常,在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。 此时,设备往往已达到内存分页状态,因此需要终止一些前台进程来确保用户界面正常响应。

  2. 可见进程

    没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程。 如果一个进程满足以下任一条件,即视为可见进程:

    • 托管不在前台、但仍对用户可见的 Activity(已调用其 onPause() 方法)。例如,如果前台 Activity 启动了一个对话框,允许在其后显示上一 Activity,则有可能会发生这种情况。
    • 托管绑定到可见(或前台)Activity 的 Service

    可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。

  3. 服务进程

    正在运行已使用 startService() 方法启动的服务且不属于上述两个更高类别进程的进程。尽管服务进程与用户所见内容没有直接关联,但是它们通常在执行一些用户关心的操作(例如,在后台播放音乐或从网络下载数据)。因此,除非内存不足以维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态。

  4. 后台进程

    包含目前对用户不可见的 Activity 的进程(已调用 Activity 的 onStop() 方法)。这些进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程、可见进程或服务进程使用。 通常会有很多后台进程在运行,因此它们会保存在 LRU (最近最少使用)列表中,以确保包含用户最近查看的 Activity 的进程最后一个被终止。如果某个 Activity 正确实现了生命周期方法,并保存了其当前状态,则终止其进程不会对用户体验产生明显影响,因为当用户导航回该 Activity 时,Activity 会恢复其所有可见状态。 有关保存和恢复状态的信息,请参阅 Activity文档。

  5. 空进程

    不含任何活动应用组件的进程。保留这种进程的的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。 为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。


5:


链接:https://www.nowcoder.com/questionTerminal/86069dcedf8344e19be6a3c54550b36e
来源:牛客网

下列哪些情况下系统会程序抛出异常,强制退出

  • 应用运行时,Main线程进行了耗时操作
  • 应用运行时抛出了OutOfMemoryError
  • 应用运行时抛出了RuntimeException
  • 应用运行时,用户操作过于频繁
AD:产生ANR(application not response),程序没有响应,有可能程序会再次响应
BC:程序抛出异常,会强制退出

FC(Force close)

    原因:

         1.Error

         OOM(out of memory error)

         StackOverFlowError

         2.RuntimeException

6:AIDL:android interface difine language(android自定义接口语言) 


猜你喜欢

转载自blog.csdn.net/cdaimadada/article/details/79462101