Android面试题整理--1
2015-12-02 21:41
369 查看
Android知识点
1、横竖屏切换时候Activity的生命周期
①不设置activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,且竖屏时会执行两次②设置activity的android:configChanges=”orientation”时,切屏还是会调用各个生命周期,切横屏,竖屏时只会执行一次
③设置activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
总结:
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
总结一下整个Activity的生命周期 补充一点,当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变 Activity运行时按下HOME键(跟被完全覆盖是一样的):onSaveInstanceState --> onPause --> onStop onRestart -->onStart--->onResume Activity未被完全覆盖只是失去焦点:onPause--->onResume
2、如何将一个Activity设置成窗口的样式。
Activity属性设定做法有两种
方法1.在AndroidManifest.xml文件当中设置当前activity的一个属性(系统自带的属性): android:theme="@android:style/Theme.Dialog"
`
方法2.
在styles.xml文件中可以新建一如下的style:
@drawable/float_box
如果窗口要添加窗口背景,可以在drawable中新建一个叫float_box.xml的文件,内容可以如下(自定义): <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#ffffff" /> <stroke android:width="3dp" color="#000000" /> <corners android:radius="3dp" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> 在AndroidManifest.xml中在你需要显示为窗口的activity中添加如果属性:android:theme="@style/Theme.FloatActivity" 即可
3、后台的Activity被系统回收怎么办?
onSaveInstanceState public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong("id", 1234567890); } if(savedInstanceState != null){ long id = savedInstanceState.getLong("id"); } if(savedInstanceState != null){ long id = savedInstanceState.getLong("id"); }
被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数 savedInstanceState,没被收回的就还是onResume就好了。 savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。
4、如何退出Activity?如何安全退出已调用多个Activity的Application?
对于单一Activity的应用来说,退出很简单,直接finish()即可。也可以用killProcess()和System.exit()这样的方法。对于多Activity的应用来说,在打开多个Activity后,如果想在最后打开的Activity直接退出。
2.1之前,可以使用ActivityManager的restartPackage方法。它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。
2.2添加了一个新的方法,killBackgroundProcesses(),需要权限 android.permission.KILL_BACKGROUND_PROCESSES。
系统自带的应用程序管理里,强制结束程序的方法,forceStopPackage()。
需要权限android.permission.FORCE_STOP_PACKAGES。
需要添加android:sharedUserId=”android.uid.system”属性
但,该方法是非公开的,他只能运行在系统进程,第三方程序无法调用。
因为需要在Android.mk中添加LOCAL_CERTIFICATE := platform。
以上可以看出,在2.2,没有办法直接结束一个应用,而只能用自己的办法间接办到。
现提供几个方法,供参考:
1、抛异常强制退出:
该方法通过抛异常,使程序Force Close。
验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。
2、记录打开的Activity:
每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
3、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
4、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。
但是这样做同样不完美。如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。
但至少,我们的目的达到了,而且没有影响用户使用。
为了编程方便,最好定义一个Activity基类,处理这些共通问题。
5、两个Activity之间怎么传递数据?
由MainActivity 通过最简单的Intent.putExtra方法,将参数传入,也可以用Bundle传入参数,Bundle bundle = new Bundle(); bundle.putString("str", "Intent Demo"); intent.putExtras(bundle);
若需要获得返回值,则用startActivityForResult(),并需要知道返回的一个RESULT_CODE(int类型),可以理解为指针,用intent.setClass() 确定传递给那个类(这里包括Activity、Service等)。
第二个Activity
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
String str=bundle.getString(“str”);
获得前一个Activity传来的参数,这里还需要返回给MainActivity参数,用到了setResult(RESULT_CODE, intent);
要说明的是RESULT_CODE必须与前一个Activity一致,否则就不能正常返回。
而第一个MainActivity通过重写onActivityResult()来取得相应的返回值。
若不需要返回,可以直接用startActivity()。
6、在启动一个Activity时就启动一个service
启动一个Activity时就启动一个service在activity的onCreate里写
startService(xxx);
然后this.finish();结束自己..
这是最简单的方法 可能会有屏幕一闪的现象,如果UI要求严格的话用AIDL
根据service与activity的生命周期,选择在onCreate或onResume中startService;要记得stopService.
如何在一个Service中启动一个Activity
Intent intent = new Intent(Service.this,TestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
7、在同一个程序,但不同的activity中是否可以放在不同的Task任务栈中?
可以放在不同的Task中。需要为不同的activity设置不同的taskaffinity属性,启动activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记
怎么在启动一个activity时就启动一个service
将启动的service的语句放在onCreate()方法中。
8、Activity怎么和Service绑定,怎么在activity中启动自己对应的Service
Activity能进行绑定得益于Service的接口。在实现Service必须实现onBind方法Service和Activity的连接可以用ServiceConnection来实现。
在实现一个新ServiceConnection,重写onServiceConnected和onServiceDisconnected方法,一旦连接建立,就能得到Service实例的引用。
执行绑定,调用bindServcie方法,传入一个选择了要绑定的Service的Intent和一个实现了的ServiceConnection实例
9、什么是Service以及描述下它的生命周期
Service是运行在后台的android组件,没有用户界面,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序的上下文里。Service随着启动形式的不同,其生命周期稍有差别。当用Context.startService()来启动时,Service的生命周期依次为:oncreate——>onStartCommand——>onDestroy 当用Context.bindService()启动时:onStart——>onBind——>onUnbind——>onDestroy
10、Service有哪些启动方法,有什么区别,怎么停用Service?
Service启动方式有两种;一是Context.startService和Context.bindService。区别是通过startService启动时Service组件和应用程序没多大的联系;当用访问者启动之后,如果访问者不主动关闭,Service就不会关闭,Service组件之间
因为没什么关联,所以Service也不能和应用程序进行数据交互。
而通过bindService进行绑定时,应用程序可以通过ServiceConnection进行数据交互。
在实现Service时重写的onBind方法中,其返回的对象会传给ServiceConnection对象的onServiceConnected(ComponentName name, IBinder service)中的service参数;
也就是说获取了serivce这个参数就得到了Serivce组件返回的值。
Context.bindService(Intent intent,ServiceConnection conn,int flag)其中只要与Service连接成功conn就会调用其onServiceConnected方法停用Service使用Context.stopService
11、不用Service,B页面为音乐播放,从A跳到B,再返回,如何使音乐继续播放?
A使用startActivityForResult方法开启B,B类结束时调用finish;A类的Intent有一个子Activity结束事件onActivityResult,在这个事件里继续播放音乐。12、什么是IntentService?有何有点?
IntentService也是一个Service,是Service的子类;IntentService和Service有所不同,通过Looper和Thread来解决标准Service中处理逻辑的阻塞的问题
优点:Activity的进程,当处理Intent的时候,会产生一个对应的Service,Android的进程处理器现在会尽可能的不kill掉你。
13、什么时候使用Service?
比如播放多媒体的时候用户启动了其他的Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,在或者在后台记录你地理位置的改变等等14、说说Activity、Intent、Service是什么关系
一个Activity通常是一个单独的屏幕,每一个Activity都被实现为一个单独的类,这些类都是从Activity基类中继承来的,Activity类显示有视图控件组成的用户接口,并对视图控件的事件做出响应。Intent的调用是用来进行架构屏幕之间的切换的。
Intent是描述应用想要做什么。
Intent数据结果中最重要的部分是动作和动作对应的数据,一个动作对应一个动作数据。
Android Service是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序的上下文里。需要通过某一个Activity或其他Context对象来调用。
Activity\跳转到Activity,Activtiy启动Service,Service打开Activity都需要Intent表明跳转的意图,以及传递参数,Intent是这些组件间信号传递的传承者。
15、请介绍ContentProvider是如何实现数据共享的
ContentProvider是通过提供Uri来实现数据共享
16、请介绍下android的数据存储方式
Android提供了5种方式存储数据 使用SharedPreferences存储数据; 文件存储数据; SQLite数据库存储数据 使用ContentProvider存储数据; 网络存储数据
17、android中常用的五种布局
线性布局LineayLayout、 相对布局RelativeLayout、 帧布局FrameLayout、 表格布局TablElAYOUT, 绝对布局AbsoluteLayout。
18、谈谈UI中,Padding和Margin有什么区别?
Padding是文字相对于边框,而Margin是边框相对于父窗体
19、请解释一下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。
子线程借用主线程里面的handler发送一条消息,这个消息会被线程放入消息队列里面,也就是message queue,主线程里面有一个轮询器looper会发现消息队列里面有一条消息时,会调用handler消息处理执行handlermessage的方法去处理这个消息,这个handlemessage的方法可以更新ui控件内容了
20、AIDL的全称是什么?如何工作?能处理哪些类型的数据?
ADIL是一种接口定义语言,用于约束两个进程之间的通信规则,供编译器生成代码,实现android设备之间的进程通信。进程之间的通信信息首先会被转换成AIDL协议消息,然后发送给对方,对方受到AIDL协议消息后在转换成相应的对象。AIDL支持类型包括java基础类型和String,List,Map,CharSequence,如果使用自定类型,必须实现Parcelable接口
相关文章推荐
- 翻译 前端面试题目
- 黑马程序员之面向对象的三大特性(JAVA)
- 据说99%的初级程序员看完后都不迷茫了
- 黑马程序员——OC学习——封装、继承、多态
- 模拟面试
- 黑马程序员--MAP集合
- 做个能够简单堆砌代码的码农,短期可能会得到赏识,但从长远看,处境可能会非常悲惨
- Java多线程面试问题汇总(深入理解篇)
- leetcode-54 Spiral Matrix 顺时针打印矩阵(《剑指offer》面试题20)
- .NET程序员学PHP要注意的坑-PHP函数、回调函数、自定义函数库
- 应届生面试总结
- 求职记录【又名求职杯具史】~
- 程序员如何打造个人品牌
- 【程序员】项目经理如何调动组员积极性
- 《程序员保值的4个秘密》摘录
- 获得100000+点击的程序员高薪职业建议!
- Android 面试题总结
- 面试心得
- 经典面试题
- 罗马尼亚程序员的幸福生活