20道面试题=5 java + 3 Android + 1(计网+数据结构+操作系统选择式)+ 1 算法题
主要以我自己的回答方式总结,小伙伴们欢迎指教奥~
在object类中,equals 与==是没有区别的,都是对比两个对象的内存地址,
但是大多数情况下equals 会被 覆写 , 比如String类中的equals(),然后去比较堆内存中存储的值 ,也就是去比较对象的属性值
1.语法上
静态变量:要加static
实际变量:不用加
2.程序运行时
静态变量:静态变量不属于某个 实例对象,而是属于类,所以称为类变量 ,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配到空间,静态变量就可以被使用了
实际变量: 实例变量属于某个对象的属性,必须 创建了实例对象,其中的实例变量才会 被分配到空间,才能使用这个实例变量
3.存储位置
静态变量:存在方法区
实际变量:存在堆中
在Java中静态方法可以被继承,但是不能被覆盖,即不能重写。
在java jdk1.7之前, switch只能支持byte、short、char、int ,jdk1.7之后支持 string ,
( 其实,jdk1.7并没有新的指令来处理switch string,而是通过调用switch中string.hashCode,将string转换为int从而进行判断。)
一种方法需要多种实现。
优点:
提高了代码的可维护性(继承保证)
提高了代码的扩展性(多态保证
onStartCommand方法,返回START_STICKY 在运行onStartCommand后service进程被杀死后,那将保留在开始状态,但不会保留那些传入的intent。不久后service就会再次尝试重新创建,因为保留在开始状态,在创建 service后将保证调用onstartCommand。如果没有传递任何开始命令给service,那获取到的Intent为null。手动返回START_STICKY,亲测当service因内存不足被kill,当内存又有的时候,service又被重新创建,但是不能保证任何情况下都被重建,比如进程被干掉了….
在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = “1000”这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。
3 提升Service进程优先级
Android中将进程分成6个等级,由高到低分别是:前台进程、可视进程、次要服务进程、后台进程、内容供应节点以及空进程。当系统进程空间紧张时,会按照优先级自动进行进程回收。可以使用startForeground()将服务设置为前台进程。
4 在onDestory中重启Service
直接在onDestroy()里startService或service +broadcast 方式,就是当service走ondestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service。
5 监听系统广播判断Service状态
通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,但要记得加权限
6 将APK安装到/system/app,变身系统级应用
这种方式适合调试来用,并不算是一种解决办法,不推荐使用,因为你的APP是给用户使用的。
7 两个service互相激活
首先介绍一下Service的等级:
一、前台进程
二、可见进程
三、服务进程
四、后台进程
五、空进程 —关闭应用后,没有清理缓存
所以为了提高优先级我们可以使用startForeground()方法将Service设置为前台进程。
一个service设为主服务,一个service设为 守护服务,互相监听,发现对方杀死就立刻启动
Android Service保活方法总结(不被杀死)双进程守护
service运行在主线程,所以不能进行耗时操作
方法一:service中开子线程
方法二: 使用IntentService
IntentService是继承Service的抽象类,在IntentService中有一个工作线程来处理耗时操作。
IntentService是一个基于Service的一个类,用来处理异步的请求。你可以通过startService(Intent)来提交请求,
该Service会在需要的时候创建,当完成所有的任务以后自己关闭,而不需要我们去手动控制
原理: IntentService 的 onCreate方法 中利用 HandlerThread 创建了一个循环的工作线程,
然后将工作线程中的Looper对象作为参数来创建ServiceHandler消息执行者。
使用:
public class TestService extends IntentService {
public TestService() {
super("TestService");
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
//执行耗时操作
}
}
答:不一定。
1.Activity存在一种审计机制,这个机制会在Activity完全显示之后工作,如果子线程在Activity完全显示之前更新UI是可
行的;
2.SurfaceView:多媒体视频播放,也可以在子线程中更新UI
3.Progress:进度相关控件,也可以在子线程中更新UI
十大经典排序算法总结(Java实现+动画)
“过人才弯腰,罚球才低头”