android面试题整理

来源:互联网 发布:淘宝直播平台 编辑:程序博客网 时间:2024/04/29 19:35
 

什么是Activity?

答:通俗一点说Activity就是一个界面,这个界面里面可以放置各种控件。我们可以将其和WPF对比起来看。WPF中的界面是用xaml来表示的,Activity的界面也是用xml文件表示的,放置在res->layout下面。xaml对应的后台文件是一个.cs文件,Activity对应的后台文件是在src->packet->xxx.java中。不同的是每生成一个新的Activity后,我们需要在AndroidManifest.xml中注册一下这个activity。当然你也可以看成是winform里面的界面,webform里面的网页。总之就是来展示给用户看的。

Activity 之间的交互

一是两个Activity之间的跳转,二是两个Activity的传值。


首先是不同Activity之间的跳转。在一个Activity类里面可以通过“ startActivity(intent) ”来完成跳转到另外一个Activity。我们重点要关注的就是里面的intent参数。Intent用于应用程序之间的交互和通讯,它不仅能够支持同一个程序里面的通讯还能和其他应用程序之间交互通讯。比如通过它可以直接启动浏览器到某个网页,启动打电话界面,启动发短信界面等等。我们这里讨论的只是用于同一程序内部的不同activity的跳转。instent使用起来也比较简单,看代码:


Intent intent = new Intent();


intent.setClass(ActivityMain.this, Activity2.class);


startActivity(intent);

setclass方法里面的第一个参数当前类的实例,第二个参数是你要跳转到的Activity类。然后通过startActivity启动跳转(完整的代码在下面会放出,有兴趣的可以下载运行看看)
接着我们看看如何在不同的Activity传值。同样还是通过instent这个类。它里面有个putExtra方法,可以通过键值对的方式附加信息到instent上,然后另个activity就可以通过类似intent.getStringExtra(键名)来获取传过来的值了(不仅仅是string类型,其他类型大家可以自己试试)。上图中的123字符串就是通过这种方式由前面的activity传递过去的!当然我也是刚刚才接触这个不久,不知道android里面还有没有其他的方式,还需要再慢慢学习了

1.
请描述一下Activity生命周期。

答:onCreate() //activity生命周期开始时被调用。
           onRestoreInstanceState() //onCreate完成后被调用,用来恢复UI状态。
           onRestart() //activity从停止状态重新启动时调用。
           onStart() //activity对用户即将可见的时候调用。
            onResume() //activity与用户交互的时候,重绘屏幕。
            onSaveInstanceState() //activity即将移出栈顶保留UI状态时调用此方法。
           onPause() //当系统要启动一个其他的activity时调用(其他的activity显示之前),这个方法被用来提交那些持久数据的改变、停止动画、和其他占用 CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快。 onStop() //用户不再可见时调用


onDestroy //activity被销毁前所调用的最后一个方法,当进程终止时会出现这种情况

2.
两个Activity之间跳转时必然会执行的是哪几个方法。

答:startActivity(Intent intent) ;  
startActivityForResult (Intent intent, int requestCode) ;
onActivityResult (int requestCode, int resultCode, Intent data);setResult(int resultCode);


3.
横竖屏切换时候Activity的生命周期。

答:1、不设置Activityandroid:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activityandroid:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activityandroid:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法


总结一下整个Activity的生命周期

补充一点,当前Activity产生事件弹出ToastAlertDialog的时候Activity的生命周期不会有改变

Activity运行时按下HOME(跟被完全覆盖是一样的)onSaveInstanceState --> onPause --> onStop       onRestart -->onStart--->onResume

Activity未被完全覆盖只是失去焦点:onPause--->onResume

4.
如何将一个Activity设置成窗口的样式。

答:AndroidManifest.xml中在你需要显示为窗口的activity中添加如果属性:android:theme="@style/Theme.FloatActivity"即可
如果说您觉得新建style.xmlfloat_box.xml文件的方式麻烦或者只想Test一下,那么可以直接添加您对应需要展示为 Dialog styleActivityandroid:theme属性值为 android:theme="@android:style/Theme.Dialog"


5.
你后台的Activity被系统
回收怎么办?

答:你后台的Activity被系统回收怎么办:onSaveInstanceState0 y- I' K( ^0 v  X6 g& {  s

, @: ^# I  G+ s: s, F
当你的程序中某一个Activity A在运行时中,主动或被动地运行另一个新的Activity B
( y( f5这个时候A会执行 ( E- \' u' ~7 Y& P/ n" D, [
3 S6 [* p6 b3 `* bJava
代码# O7 \+ X. n# t; D; V# D: U2 b" z  s& j
public
; [) x$ ?4 N7 A9 X4 J. K/ @void onSaveInstanceState(Bundle outState) {  
1 T: D& t/ k# [, ?: R7 c0 L+ ]    super.onSaveInstanceState(outState);  
( q9 H! {# b! R- I# W9 R) Y/ J
    outState.putLong("id", 1234567890);  
: O) l" C, j+ I7 T: }: u5 P, n4 {}  
( p3 i, }% |: z7 }- g
& P1 G$ h! o* _* l( S4 x4 s" k8 spublic void onSaveInstanceState(Bundle outState) {    super.onSaveInstanceState(outState);    outState.putLong("id", 1234567890);}
  y! W* Z( ]; N1 v2 b1 h. I6 W! Q4 [' D1 NB完成以后又会来找A,这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回; e- }3 c, I3 ?, O  D6 f1 {
收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数
% Q- l# d* k! o/ D7 _, P8 qsavedInstanceState
,没被收回的就还是onResume就好了。
$ U, `9 q* y4 t: v! C; w6 S
: q( u7 B7 O6 W9 g& x: OsavedInstanceState
是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。9 N0 t3 J1 N4 }& g, Q( T1 \4 ~
-Java代码
y6 c1 z& G: c1 u1 z

if(savedInstanceState != null){  
( ?% v6 m: L% ^/ e
     long id = savedInstanceState.getLong("id");  
, M5 I! M3 Y  W6 e
}  2 V8 K5 ^; B; m- A* M
& y4 A, e7 ]: V0 g7 |- Jif(savedInstanceState != null){     long id = savedInstanceState.getLong("id");} ; M# x' d$ r# n3 H6 j$ @5 Y( B. k
" }, v& v; z! w n) R; r6 ]9 G  j0 X, V7 _0 x+ `就像官方的Notepad教程里的情况,你正在编辑某一个note,突然被中断,那么就把这个noteid记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦,没准你需要记住滚动条的位置...

6.
如何退出Activity?如何安全退出已调用多个ActivityApplication

答:对于单一Activity的应用来说,退出很简单,直接finish()即可。当然,也可以用killProcess()System.exit()这样的方法。   但是,对于多Activity的应用来说,在打开多个Activity后,如果想在最后打开的Activity直接退出,上边的方法都是没有用的,因为上边的方法都是结束一个Activity而已。

7.
如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?

答:onSaveInstanceState()
当你的程序中某一个Activity A在运行时,主动或被动地运行另一个新的Activity B,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate()了。

8.
两个Activity之间怎么传递数据?

答:
Intent的对象中增加要传递的参数既可。
Intent的对象的请求中加入键值对,对象名字.putExtra"键值对的名字","键值对的值");
在另一个Activity中将Intent请求中的数据取出来:
  Intent intent=getIntent();//
  String value = intent.getStringExtra("testIntent");//testIntent对应的值赋值给value变量
之后便可以使用value的值了,即使用了来自第一个Activity传来的数据

9.
怎么让在启动一个Activity是就启动一个service

答:

10.
同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?

答:(Activities and Tasks
1activity用任务来组成堆栈。堆栈里可以有别的应用里的activity
2,用户感知一个应用不是看开发包(.apk文件),是看任务堆栈。一个任务堆栈对用户来说就是一个应用。
3,任务堆栈只对activity做入栈,弹出操作。
4,任务堆栈只能设置一个值:偏好。
5,任务堆栈中的activity是作为一个整体停留在前台或者后台。
6,任务堆栈和其中的activity的行为可以用启动该activityintent的标志位和AndroidManifest.xml文件里<activity>的属性信息来控制。
Affinities and new tasks
1,应用程序里的每一个activity都有自己的偏好,默认情况下,应用程序里的activity有一样的偏好,他们在一个任务堆栈里。可以通
<activity>标签的taskAffinity属性来设置偏好。一个应用程序中可以设置不同的偏好。偏好也可以跨应用程序,不同的应用程序可以用同一个偏好。偏好在两种环境下生效:intent使用 FLAG_ACTIVITY_NEW_TASK标志位,或者activityallowTaskReparenting(同意任务重排根目录)属性设置
true
2,默认的情况:startActivity()启动的新Activity和调用startActivity()方法的Activity在一个任务堆栈中。
3The FLAG_ACTIVITY_NEW_TASK flag
     在默认情况下,startActivity()总是和调用者在一个任务堆栈里,但是如果使用了FLAG_ACTIVITY_NEW_TASK标志就
会在不同的任务堆栈中(发现在一个apk里加上FLAG_ACTIVITY_NEW_TASK也会在一个堆栈里,不管要启动的activity是不是设置
了不同的偏好)。但是如果已经有一个和将要运行的Activity偏好相同的堆栈,就会运行在那个堆栈上,不开辟新堆栈。
4The allowTaskReparenting attribute
如果allowTaskReparenting属性设置true。这个Activity就可以从它最初开始的堆栈,移动到和它偏好相同的堆栈,当和它偏好
相同的堆栈的到前台的时候。比如一个旅游程序里有一个天气预报的Activity,在另外一个程序里打开了这个Activity
当旅游程序被调到前台的时候,那么这个天气预报Activity显示在前台。
注意:如果一个.apk文件的程序里有多个从用户角度看起来像单独应用的观点,应该给每一个观点包含的Activity设置不同的偏好。
Launch modes
在运行模式在<activity>launchMode属性设置。可以设置成:
"standard" (标准模式,默认,“standard”模式总是构造一个新的实例来响应新的intent。见Clearing the stack章节最后部分)
"singleTop" (独享堆栈顶端)
"singleTask" (独享任务堆栈)
"singleInstance"(单例)
4点区分这4种模式:
1 什么样的任务堆栈接受要启动的activity
standardsingleTop模式,除非是使用FLAG_ACTIVITY_NEW_TASK标志位,否则要启动的activity总是在启动它们的堆栈中。singleTasksingleInstance模式一旦存在了一个堆栈中,就不再运行在其他堆栈。
2是否可以有多个实例。
standardsingleTop模式,可以有多个实例,可以多个实例分属多个任务堆栈,也可以在一个任务堆栈中有多个实例。singleTasksingleInstance模式只有一个实例。
3)是否同意有其他的activity实例在他们的任务堆栈中
singleInstance模式一直保持只有自己一个activity在它的任务堆栈中。如果它启动了其他activity,那个activity在其
他的堆栈中,不管是否加了FLAG_ACTIVITY_NEW_TASK标志。其他方面singleInstancesingleTask相同。
其余的三种模式可以允许在自己的堆栈中有多个activitysingleTask模式一直保持着自己是这个任务堆栈的根activity(最底部,不过没有验证到它一直在最底部)。
4)当被Intent启动时,是否会生成一个新实例。
Standard模式会每次都生成一个新实例。每个实例对应一个Intent
singleTop模式:如果要启动的activity在目标堆栈的顶部,就不新实例化使用现有的activity(但这个会触发onNewIntent(Intent intent)事件)。如果不在顶部,那么就新实例化一个放在堆栈顶部。
"singleTask" "singleInstance"模式,不生成新的实例来处理Intent "singleInstance"模式一直在它自己的Task堆栈中,所以它一直在堆栈的顶部,它一直能响应到新的Intent。但是 singleTask模式,允许别的activity在它的堆栈里,如果它在堆栈的顶部,他就可以响应新到的Intent。如果它不在堆栈的顶部,那么新
到的Intent会调用失败,虽然会调用失败但是singleTask模式所在得堆栈还是会被整体调到前台。
注意:1.当已存在的activity去响应新的Intent的时候,不实例化新的activity,但现有的activityonNewIntent()方法会被调用。要找回最初启动它的Intent可以用getIntent()
方法。
2.如果没有实例化一个新的activity,点返回键,多个任务堆栈都会更改状态。比如A-B-C,C启动了D,在和另外一个堆栈E-F-D共享一个D,点返回键结束D,变成A-B-CE-F
Clearing the stack
如果用户离开一个任务堆栈很长时间,系统会自动清除所有的activity,除了根activity。当用户返回的时候,就像用户自己不用了该任务堆栈一
样,只有最开始的activity呈现出来。这样做的思想是:很长时间以后用户会忘记之前他打开这个任务堆栈做什么的了,再返回的时候,是去开始做其他事
情了。这是默认行为,但也有一些属性会改变默认行为。
alwaysRetainTaskState属性:
如果一个任务堆栈的跟activity设置这个属性是TRUE,那么在这个任务堆栈中的所有activity会被保留,不会在很长时间以后自动清除。
clearTaskOnLaunch属性:
alwaysRetainTaskState属性相反,如果这个属性设置成TRUE,不保持任务堆栈的状态,每当用户点击程序运行,都会把任务堆栈全部清空再重新开始(经验证:跟activity也会被清空,清空后新运行的任务堆栈ID不变。)
finishOnTaskLaunch属性:
clearTaskOnLaunch一样,不过这个属性是作用在单独的activity上不是整个任务堆栈上。
当这个任务堆栈再次运行的时候,finishOnTaskLaunch设置成TRUEactivity会被清除,其他activity保持不变。
另一种强行清除activity的方法是在Intent中加上FLAG_ACTIVITY_CLEAR_TOP标志,目标堆栈如果存在Intent将要启
动的activity,那么目标堆栈在这个activity之上的activity都会被清除。如果这个activity的运行模式是 “standard”,它本身也会被清除,再重新构造一个这个activity的新实例来响应Intent。因为“standard”模式总是构造一个新
的实例来响应新的intent
Starting tasks
一个activity使用android.intent.action.MAINandroid.intent.category.LAUNCHER Intent Filters来表示它是一个任务的入口。这样,在程序运行管理器会建立这个任务的图标。这代表了2点:1,用户可以通过它运行任务2,在一段时间以后,
用户可以返回它。
重要的是第2点。用户必须能够离开和返回任务。因此,singleInstancesingleTask应该和MAINLAUNCHER过滤器一起使用,因为这两种模式的activity总是初始化一个任务。假设,如果没有MAINLAUNCHER过滤器,还使用了singleTask模式的activity开始了一个新任务,用户在这个任务上操作了一些东西,然后点了home键,任务现在被调到了后台看不到了。但是它又不能在程序运行管理器中启动这个任务,用户没办法回到这任务了。
需要同样小心的是FLAG_ACTIVITY_NEW_TASK标志。使用这个标志开启了一个新任务用户点home离开的时候要保证有一种导向让用户可以
从新回到这个任务。一些实体总是开始新的任务比如notification managernotification manager总是加带FLAG_ACTIVITY_NEW_TASK标志去启动activity。如果你有一个activity使用这个标志区调用一个
外部的任务,注意用户有一个独立的途径返回到这个任务。
你不想让用户启动一个程序的时候看到一个activity,可以使用finishOnTaskLaunch标志)

11.
Activity怎么和service绑定,怎么在activity中启动自己对应的service

答:

12.
什么是Service以及描述下它的生命周期。

答:

13.
Service有哪些启动方法,有什么区别,怎样停用Service

答:1通过startService
  Service会经历onCreate->onStart
  stopService的时候直接onDestroy
  如果是调用者(TestServiceHolder)自己直接退出而没有调用stopService
  话,Service会一直在后台运行。
  下次TestServiceHolder再起来可以stopService
  2通过bindService
  Service只会运行onCreate,这个时候TestServiceHolderTestService绑定在一起  
  TestServiceHolder退出了,Srevice就会调用onUnbind->onDestroyed
  所谓绑定在一起就共存亡了。

14.
不用serviceB页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放?

答:a使用intent类开启bb类结束时调用finish(); a类的intent有一个子activity结束事件,在事件里继续播放音乐

15.
什么是IntentService?有何优点?

答:IntentService是一个通过Context.startService(Intent)启动可以处理异步请求的Service,使用时你只需要继承IntentService和重写其中的onHandleIntent(Intent)方法接收一个Intent对象,在适当的时候会停止自己(一般在工作完成的时候).所有的请求的处理都在一个工作线程中完成,它们会交替执行(但不会阻塞主线程的执行),一次只能执行一个请求


原创粉丝点击