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
- <style name= "Theme.FloatActivity" parent= "android:style/Theme.Dialog" >
- <!-- float_box为我们定义的窗口背景 ,这个不是必须的-->
- <item name="android:windowBackground" > @drawable /float_box</item>
- </style>
还要在androidManifest.xml文件中加入以下说明
- android:theme= "@style/Theme.FloatActivity"
3 android进程重要性依次是:前台进程、可见进程、服务进程、后台进程、空进程。所以销毁的顺序为逆方向。
4:
- 前台进程
用户当前操作所必需的进程。如果一个进程满足以下任一条件,即视为前台进程:
- 托管用户正在交互的 Activity(已调用 Activity 的 onResume() 方法)
- 托管某个 Service,后者绑定到用户正在交互的 Activity
- 托管正在“前台”运行的 Service(服务已调用 startForeground())
- 托管正执行一个生命周期回调的 Service(onCreate()、onStart() 或 onDestroy())
- 托管正执行其 onReceive() 方法的 BroadcastReceiver
通常,在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。 此时,设备往往已达到内存分页状态,因此需要终止一些前台进程来确保用户界面正常响应。
- 可见进程
没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程。 如果一个进程满足以下任一条件,即视为可见进程:
- 托管不在前台、但仍对用户可见的 Activity(已调用其 onPause() 方法)。例如,如果前台 Activity 启动了一个对话框,允许在其后显示上一 Activity,则有可能会发生这种情况。
- 托管绑定到可见(或前台)Activity 的 Service。
可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。
- 服务进程
正在运行已使用 startService() 方法启动的服务且不属于上述两个更高类别进程的进程。尽管服务进程与用户所见内容没有直接关联,但是它们通常在执行一些用户关心的操作(例如,在后台播放音乐或从网络下载数据)。因此,除非内存不足以维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态。
- 后台进程
包含目前对用户不可见的 Activity 的进程(已调用 Activity 的 onStop() 方法)。这些进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程、可见进程或服务进程使用。 通常会有很多后台进程在运行,因此它们会保存在 LRU (最近最少使用)列表中,以确保包含用户最近查看的 Activity 的进程最后一个被终止。如果某个 Activity 正确实现了生命周期方法,并保存了其当前状态,则终止其进程不会对用户体验产生明显影响,因为当用户导航回该 Activity 时,Activity 会恢复其所有可见状态。 有关保存和恢复状态的信息,请参阅 Activity文档。
- 空进程
不含任何活动应用组件的进程。保留这种进程的的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。 为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。
5:
链接:https://www.nowcoder.com/questionTerminal/86069dcedf8344e19be6a3c54550b36e
来源:牛客网
下列哪些情况下系统会程序抛出异常,强制退出
应用运行时,Main线程进行了耗时操作
应用运行时抛出了OutOfMemoryError
应用运行时抛出了RuntimeException
应用运行时,用户操作过于频繁
FC(Force close)
原因:
1.Error
OOM(out of memory error)
StackOverFlowError
2.RuntimeException
6:AIDL:android interface difine language(android自定义接口语言)