最后
针对于上面的问题,我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料。
(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
-
START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
-
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
-
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
-
OnDestroy:在Service销毁时调用,可在此回收一些资源。
在bindService中
步骤:
1、定义一个类继承Service,创建一个继承与Binder的实例对象,并提供公共方法供客户端调用。
2、实现onBind()方法,返回Binder实例
3、在Manifest.xml文件中配置该Service
4、在客户端中,实现ServiceConnection实例,从onServiceConnected()回调方法接收Binder,并使用bindService绑定服务。
注:onServiceDiscounnection方法是在服务崩溃或者服务杀死导致的连接中断时调用
首先会调用onCreate,然后调用onBind方法,然后在Activity与Service解绑时调用Unbind方法,最后在所有Activity与Service解绑后,该Service会销毁,并调用onDestroy方法。 onBind:绑定服务才会调用,但注意即使我们用startService也要实现该方法。
一个 Service 可以被多个客户进行绑定,只有所有的绑定对象都执行了onBind()方法后该 Service 才会销毁,不过如果有一个客户执行了 onStart()方法,那么这个时候如果所有的 bind 客户都执行了 unBind()该 Service 也不会销毁。
混合使用
在这之前,要知道一个原则是 Service 的 onCreate 的方法只会被调用一次,就是你无论多少次的startService又bindService,Service只被创建一次。
-
如果先是 bind 了,那么 start 的时候就直接运行 Service 的 onStart 方法,如果先是 start,那么 bind的时候就直接运行 onBind 方法。
-
如果 service 运行期间调用了 bindService,这时候再调用 stopService 的话,service 是不会调用onDestroy 方法的,service 就 stop 不掉了,只能调用 UnbindService, service 就会被销毁
-
如果一个 service 通过 startService 被 start 之后,多次调用 startService 的话,service 会多次调用 onStart 方法。多次调用 stopService 的话,service 只会调用一次 onDestroyed 方法。
-
如果一个 service 通过 bindService 被 start 之后,多次调用 bindService 的话,service 只会调用一次 onBind 方法。多次调用 unbindService 的话会抛出异常。
混合使用时的生命周期
可以,弹吐司有个条件就是得有一个 Context 上下文,而 Service 本身就是 Context 的子类,因此在 Service 里面弹吐司是完全可以的。
可以直接在Service中onStartCommand()方法中可以执行网络操作,service 里面不能执行耗时的操作(网络请求,拷贝数据库,大文件 ),如果需要在服务中进行耗时操作,可以选择IntentService, IntentService是Service的子类,用来处理异步请求。
IntentService 是 Service 的子类,比普通的 Service 增加了额外的功能。
-
Service 不会专门启动一条单独的进程,Service 与它所在应用位于同一个进程中;
-
Service 也不是专门一条新线程,因此不应该在 Service 中直接处理耗时的任务;
IntentService的特征
-
会创建独立的 worker 线程来处理所有的 Intent 请求;
-
会创建独立的 worker 线程来处理 onHandleIntent()方法实现的代码,无需处理多线程问题;
-
所有请求处理完成后,IntentService 会自动停止,无需调用 stopSelf()方法停止 Service;
-
为 Service 的 onBind()提供默认实现,返回 null;
-
为 Service 的 onStartCommand 提供默认实现,将请求 Intent 添加到队列中;
在一个app的情况下,默认是在同一个线程中的,main Thread (UI Thread)。
Thread是程序运行的最小单元——线程。
Service是安卓的一种机制,运行在主线程,因此在Service中进行耗时操作也需要开启新的线程。 那为什么还要Service不在Activity中直接操作Thread呢? 因为activity很难对Thread进行管理,当activity销毁了,之后的activity就没办法获取到之前创建的Thread。
进程的重要性依次是:前台进程、可见进程、服务进程、后台进程、空进程。所以销毁的顺序为逆方向。
-
在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = “1000”这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时实用于广播。
-
在onStartCommand里面调用 startForeground()方法把Service提升为前台进程级别,然后再onDestroy里面要记得调用stopForeground ()方法。
-
onStartCommand方法,手动返回START_STICKY。
-
在onDestroy方法里发广播重启service。
service +broadcast 方式,就是当service走ondestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service。(第三方应用或是在setting里-应用-强制停止时,APP进程就直接被干掉了,onDestroy方法都进不来,所以无法保证会执行)
-
监听系统广播判断Service状态。 通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活。
-
Application加上Persistent属性。
Activity、Intent、Service 是什么关系?
结语
- 现在随着短视频,抖音,快手的流行NDK模块开发也显得越发重要,需要这块人才的企业也越来越多,随之学习这块的人也变多了,音视频的开发,往往是比较难的,而这个比较难的技术就是NDK里面的技术。
- 音视频/高清大图片/人工智能/直播/抖音等等这年与用户最紧密,与我们生活最相关的技术一直都在寻找最终的技术落地平台,以前是windows系统,而现在则是移动系统了,移动系统中又是以Android占比绝大部分为前提,所以AndroidNDK技术已经是我们必备技能了。
- 要学习好NDK,其中的关于C/C++,jni,Linux基础都是需要学习的,除此之外,音视频的编解码技术,流媒体协议,ffmpeg这些都是音视频开发必备技能,而且
- OpenCV/OpenGl/这些又是图像处理必备知识,下面这些我都是当年自己搜集的资料和做的一些图,因为当年我就感觉视频这块会是一个大的趋势。所以提前做了一些准备。现在拿出来分享给大家。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
尝辄止,不再深入研究,那么很难做到真正的技术提升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!