安卓面试易考题(二)
这是延续上一部分的知识,依然是面试题,进入正题:
面试题一:谈谈你对Activity的理解:
这是考官希望你把自己的心得,做项目的时候的体会写出来;我们可以答Activity异常被系统回收的时候怎么处理的,然后可以讲讲Activity的生命周期。
面试题二:Service是否运行在主线程?能否在Service里面执行耗时的操作?
答:service是默认运行在主线程的,很多人觉得是后台服务就觉得应该是在子线程,其实不是,所以我们不能在里面执行耗时的操作,因为会产生ANR异常。我们要做耗时的操作要新开一个线程,处理耗时操作。
当然我们也可以指定service在指定线程中执行,一般我们在配置清单文件的时候指定所在的线程:
<service android:process="cn.itcast.xxx"></service>
面试题三:两个Activity之间怎么传递数据?
答:如果是基本的数据类型,我们可以通过Intent 传递数据,也可以通过intent putExtra传递一个bundle过来,其他的intent想要获取数据,可以通过:
Intent intent = getIntent(); Bundle bundle = intent.getExtras();
Bundle 类似map的集合
intent.getStringExtra("key","value"); intent.getBooleanExtra("key","value")
但是如果是复杂类型的话,我们可以在Application 全局里面存放 对象 ,自己去实现自己的application的这个类,基础系统的application ,每个activity都可以取到 ,当然记得 清单文件里面配置一下。
实现复杂类型的传递还可以通过让一个对象实现Serializable接口,实现了在各个接口后就可以序列化到文件,具体实现过程是实例化一个FileOutputStream和一个ObjectOutputStream,然后通过对象输出流向文件写数据。我们在另外一个Activity通过对象 读取这个对象数据,这样就能实现了:
File file = new File("c:\\1.obj"); FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); Student stu = new Student(); stu.setId("10001"); stu.setName("zs"); oos.writeObject(stu); FileInputStream fis = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fis); Student stu1 = (Student) ois.readObject(); System.out.println(stu1.getName());
以上通过Serializable把对象序列化到文件然后读取效率不高,入门如果是序列化到内存效率就高了,Google于是提供了parcelable接口,Parcelable 把对象序列化到android操作系统 的一块公用的内存空间。
其实传递对象我们还可以用Gson,类似于json把对象按照一定格式打包成字符串,然后通过intent传递基本数据类型一样再反序列化拿到数据:
Gson gson = new Gson(); List<Person> persons = new ArrayList<Person>(); for (int i = 0; i < 10; i++) { Person p = new Person(); p.setName("name" + i); p.setAge(i * 5); persons.add(p); } String str = gson.toJson(persons);
然后我们拿到这个str字符串,取单个对象:
Person person = gson.fromJson(str, Person.class);
取对象集合:
List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType()); for(int i = 0; i < ps.size() ; i++) { Person p = ps.get(i); System.out.println(p.toString()); }
但是如果我们要传递一个大文件的时候就不能用上面的方法了,因为效率太低,我们就会传递一个引用过去,通过uri:
//传递数据的引用 intent.setData(Uri) Uri.fromFile(); //大图片的传递 contentResolver.getInputStream(uri);-----存数据 contentResolver.getOutputStream(uri);----取数据
面试题四:怎么在启动一个Activity的时候启动一个service?
我们在OnCreate方法里面new Intent(要启动的service);然后startService(intent);。
面试题五:同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?
这是可以的,我们可以在激活一个新的activity时候, 给intent设置flag:
Intent的flag添加FLAG_ACTIVITY_NEW_TASK singleinstance 单独的任务栈
,然后这个新开的Activity栈就会在单独的task栈里面。
Intent intent = new Intent(A.this,B.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
当我们在开启的时候就已经设置了开启新的任务栈,拿我们在Activity的onCreate方法里面,即使还写了开启一个新任务栈,也不会重复开启。
面试题五:Activity怎么和Service绑定,怎么在activity中启动自己对应的service?
我们在Service的不同方法里面写服务,效果不一样的。
StartService()里面的话,一旦被创建 调用着无关 没法使用service里面的方法。
bindService () 把service 与调用者绑定 ,如果调用者被销毁, service会销毁。同时我们也可以使用里面的方法,通过复写里面的bandService启动服务:我们需要写一个自己的ServiceConnection对象MyConn,(重写onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.:
private class Myconn implements ServiceConnection { public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub //可以通过IBinder的对象 去使用service里面的方法 } public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } }
面试题六:什么是service,service的生命周期?怎么启动一个service,这些方法有啥区别,怎么停用service?
在Service的生命周期中,因为没有界面,被回调的方法比Activity少一些,只有onCreate, onStart, onDestroy,方法,因为是服务,所以有onBind和onUnbind方法。
通常有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。
1.通过startService
前面讲过,StartService,没有和调用者绑定在一起,Service会经历 onCreate 到onStart,然后处于运行状态,stopService的时候调用onDestroy方法。
如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。
2.通过bindService
这种方法是和调用者绑定在一起的,Service会运行onCreate,然后是调用onBind,调用者退出了,Srevice就会调用onUnbind->onDestroyed方法。所谓绑定在一起就共存亡了。调用者也可以通过调用unbindService方法来停止服务,这时候Srevice就会调用onUnbind->onDestroyed方法。
但是几个方法交织在一起的话,会出现什么情况呢?
一个原则是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的话会抛出异常。
面试题七:不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放?
这个问题问得不太好,其实默认不做任何处理,B里面的音乐都能播放.
遇到问题, 可以随机应变,灵活发挥,多考虑些细节,比如说这个题就可以这样说,说说你对startActivityForResult的理解()
A开启B的时候,用startActivityForResult()方法, B返回的时候把播放的状态信息返回给A ,A继续播放音乐.
面试题八:什么是IntentService?有何优点?
简单来讲相对于一般service他自己开了一个thread,我们在OnHandleIntent()里面处理耗时的操作。它是Sdk给我们提供的方便的,带有异步处理的service类,异步处理的方法 OnHandleIntent()。每次执行OnHandleIntent方法,都回开启一个不同的线程。
面试题九:什么时候使用Service?
前台进程优先级最高,最难被杀死,service只比前台进程优先级第一点,用service能让我们在后台运行的进程不容易挂掉。
1. 如果service正在调用onCreate, onStartCommand或者onDestory方法,那么用于当前service的进程相当于前台进程以避免被killed。
2. 如果当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,但是比那些不可见的进程更重要,这就意味着service一般不会被killed.
3.如果一个前台进程同时又绑定到了service上,那这个进程优先级最高。可以理解为,service是可见的。
4. 如果service可以使用startForeground(true)方法来将service设置为前台状态,相当于强行提高了这个service的优先级,那么系统就认为是对用户可见的,并不会在内存不足时killed。
那service用在哪里呢?
1.Service的特点可以让他在后台一直运行,可以在service里面创建线程去完成耗时的操作. 天气预报 widget TimerTask Timer 定期执行timertask。
2.Broadcast receiver捕获到一个事件之后,可以起一个service来完成一个耗时的操作. Broadcast receiver生命周期 和 响应时间很短,只有10秒,没执行完的话就没有执行了。
3. 远程的service如果被启动起来,可以被多次bind, 但不会重新create. 索爱手机X10i的人脸识别的service可以被图库使用,可以被摄像机,照相机等程序使用.
相关推荐
该项目是一款采用Java语言开发的国际象棋棋盘游戏,包含40个文件,其中包括15个Java源文件、13个PNG图像文件、4个中文文件、3个WAV音频文件、1个Git忽略文件、1个LICENSE许可文件和1个Markdown文件。
该项目是一款开源的志愿汇系统,采用Java核心技术实现,并融合了JavaScript, HTML, CSS等前端技术。系统源码包含3648个文件,其中SVG文件2164个,PNG文件640个,JavaScript文件333个,HTML文件140个,CSS文件136个,Java文件56个,SCSS文件42个,LESS文件26个,JPG文件17个,XML文件11个。此系统提供了一个简单的开源实现,便于用户学习和定制。
那些年,与你同分同位次的同学都去了哪里?全国各大学在辽宁2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
目前应用最广的梯控分析修改软件
和印尼植物相关的图像数据集 数据说明: 该数据集呈现在您面前的是部分印尼植物图像,包括五种类型的植物,这些植物使印度尼西亚的植物群多样化。 五个类别分别为:1.钛无花果2.爪哇花3.冷冻甘蓝(黑兰)5.拉夫莱西亚阿诺迪亚(巨型棕榈花) 该数据集共包含2158张相关的图像。
学生成绩管理系统 毕业设计 源码+数据库+论文(JAVA+SpringBoot+Vue.JS) 启动教程:https://www.bilibili.com/video/BV11ktveuE2d
汽车底盘运输线1_三维3D设计图纸.zip
液压弯管机_三维3D设计图纸.zip
该项目是一款基于Go语言的ruidingCheng框架设计源码,共计172个文件,其中包含137个Go源文件,以及若干个配置文件、文档和忽略文件。
该项目为黑龙江大学2022届毕业生学业论文“校园生活APP的设计与实现”的服务端源码,采用Kotlin作为主要开发语言,同时包含Java语言支持。项目文件共计77个,其中Kotlin文件36个,Java类文件14个,图片文件12个,Markdown文件2个,属性文件和SQL文件各2个,以及LICENSE、gitignore、JAR文件各1个。
EPLAN史上最全部件库,部件宏,EDZ格式,大小合适导入容易 部件包含图片宏,尺寸宏,有西门子全系列PLC,s7-1200 1500 300 400 200 三菱FX系列,数字模拟,特殊模块,三菱变频器,伺服,触摸屏,台达,施耐徳,正泰,欧姆龙,得力西,ABB等低压电器等等。 做电气元件布局很方便, 与实物1:1大小对应。 你想要的里面都有。 导入后一劳永逸。
全自动立式圆瓶贴标机_三维3D设计图纸.zip
那些年,与你同分同位次的同学都去了哪里?全国各大学在辽宁2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
那些年,与你同分同位次的同学都去了哪里?全国各大学在辽宁2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
那些年,与你同分同位次的同学都去了哪里?全国各大学在辽宁2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
内容概要:SEAL是一种新的层次化的模仿学习框架。它引入了一种利用预训练大型语言模型(LLMs)生成高层次计划并提供有意义的目标表示的方法,而不需要任务层级的先验知识。为了强化子目标表征,研究提出了一种双编码器架构,分别采用了带有监督机制的LLMs 子目标学习以及非监督的矢量量化(Vector Quantization)。另外,SEAL 还融合了过渡增强型低级别规划器来改进对长跨度任务中目标状态转换情况下的适应度,实验证明这种方法可以显著提升复杂任务下的性能表现。 适合人群:具有强化学习和层次化模仿学习基础的人群。 使用场景及目标:用于解决机器人操作任务,特别是在少量专家数据的情况下解决长时间序列、稀疏奖励的任务,同时保持较好的泛化能力和较强的鲁棒性。 使用限制与注意点:目前SEAL仅适用于完全可观测的状态,针对部分观测状态下效果还有待优化,存在一定的不稳定现象需要进一步提高。对于大规模真实场景中的应用还需考虑模型扩展性等问题。
圆管倒角机_三维3D设计图纸.zip
Surfing-Segment是一款基于ik-analyzer的高级文本分词工具,源码文件共计62个,其中Java源文件46个,词典文件8个,XML配置文件3个,其他还包括Git忽略文件、LICENSE、Markdown文件、属性文件和政策文件等。该工具显著提升了专业术语和复杂型号的分词准确性,并集成了自定义词典、动态识别型号、同义词功能以及Elasticsearch插件等特色功能,非常适合用于电商平台提升用户体验。
该项目为基于Python核心的Frappe框架设计源码,综合运用Python、JavaScript、HTML、CSS、Shell等多种编程语言,共计2005个文件,其中包含728个Python文件、467个JavaScript文件、221个JSON文件、174个HTML文件、98个Markdown文件、77个CSS文件、74个CSV文件、38个PNG图片文件、34个LESS文件、16个SVG文件。此项目结构清晰,适用于构建复杂的应用程序和系统。
那些年,与你同分同位次的同学都去了哪里?全国各大学在辽宁2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据