面试问题及答案小结

上海华勤:

1.static方法是否可以调用非static方法?非statci方法是否可以调用static方法?

答:static方法只能调用static方法,非static方法既可调用static方法,也可调用非static方法;

 

2.内部类是否可调用外部类方法,外部类是否可调用内部类方法?

答:摘自http://blog.csdn.net/jierui001/article/details/3862877,感谢博主小结

内部类可以访问外部类的任何成员,包括private成员。
外部类访问内部类的成员需要创建内部类的对象,之后可以访问内部类的任何成员,包括private成员,需要注意的是成员内部类不可以有静态成员。
当外部类的成员和内部类的成员重名时单单用this是区分不了的。在内部类中访问外部类的成员时可以用如下语法区分
<外部类类名>.this.<外部类中需要被访问的成员名>;

 

3.activity生命周期?有什么区别,各自阶段干些什么事?

onCreate->onAttachFragment->onContentChanged->onStart(->onActivityResult)->onRestoreInstanceState->onPostCreate->onResume->onPostResume->onAttachToWindow->onCreateOptionsMenu->onPrepareOptionMenu->(Activity在运行时可能回调的方法:onUserInteraction/onUserLeawerHint)->onPause->onSaveInstanceState->onStop->onDestroy

onCreate中参数Bundle用于现场恢复,也可以自己在该方法里把自己存好的现场恢复,一般来初始化数据。

onStart调用后,它就处于可见状态,但不具备焦点,不能与用户交互。所以可以在该方法里做些界面上的动作。

onResume调用后,它完跑到前台,完全可见,且可以与用户交互,有焦点。同样,可以在该方法里进行界面动作,比如刷新界面的处理。

onPause调用后,它又跑到了可见状态,焦点丢失,这时候可以保存起自己数据,以防丢失。

onStop调用后,它处于后台了,看不见了,此时如果没被干掉,用户又把它调用出来,会走onRestart->onStart

onDestroy调用后,挂了,在这里可以做些善后工作,如进行一些对象的销毁或者反注册。

4.service启动方式有几种,有什么区别?

来自百度大神的答案:

onBind和onUnbind。通常有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。1 通过startService,Service会经历 onCreate 到onStart,然后处于运行状态,stopService的时候调用onDestroy方法。如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。2 通过bindService,Service会运行onCreate,然后是调用onBind, 这个时候调用者和Service绑定在一起。调用者退出了,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, 再StopService。如果一个service通过startService 被start之后,多次调用startService 的话,service会多次调用onStart方法。多次调用stopService的话,service只会调用一次onDestroyed方法。如果一个service通过bindService被start之后,多次调用bindService的话,service只会调用一次onBind方法。多次调用unbindService的话会抛出异常。拥有service的进程具有较高的优先级官方文档告诉我们,Android系统会尽量保持拥有service的进程运行,只要在该service已经被启动(start)或者客户端连接(bindService)到它。当内存不足时,需要保持,拥有service的进程具有较高的优先级。1. 如果service正在调用onCreate, onStartCommand或者onDestory方法,那么用于当前service的进程相当于前台进程以避免被killed。2. 如果当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,但是比那些不可见的进程更重要,这就意味着service一般不会被killed.3. 如果客户端已经连接到service (bindService),那么拥有Service的进程则拥有最高的优先级,可以认为service是可见的。4. 如果service可以使用startForeground(int, Notification)方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时killed。如果有其他的应用组件作为Service,Activity等运行在相同的进程中,那么将会增加该进程的重要性。

 

5.发送broadcast方式有几种?

摘自http://blog.csdn.net/way_ping_li/article/details/8016688,感谢博主。

发送广播的方式有三种,sendBroadcast(),sendOrderedBroadcast()sendStickyBroadcast()

sendBroadcast()这个方法的广播是能够发送给所有广播接收者,按照注册的先后顺序,如果你这个时候设置了广播接收者的优先级,优先级如果恰好与注册顺序相同,则不会有任何问题,如果顺序不一样,会出leaked IntentReceiver 这样的异常,并且在前面的广播接收者不能调用abortBroadcast()方法将其终止,如果调用会出BroadcastReceiver trying to return result during a non-ordered broadcast的异常,当然,先接收到广播的receiver可以修改广播数据。


sendOrderedBroadcast()方法顾名思义就是priority的属性能起作用,并且在队列前面的receiver可以随时终止广播的发送。还有这个api能指定final的receiver,这个receiver是最后一个接收广播事件的receiver,并且一定会接收到广播事件,是不能被前面的receiver拦截的。实际做实验的情况是这样的,假设我有3个receiver依序排列,并且sendOrderedBroadcast()方法指定了一个finalReceiver,那么intent传递给这4个Receiver的顺序为Receiver1-->finalReceiver-->Receiver2-->finalReceiver-->Receiver3-->finalReceiver。这个特性可以用来统计系统中能监听某种广播的Receiver的数目。


sendStickyBroadcast()字面意思是发送粘性的广播,使用这个api需要权限android.Manifest.permission.BROADCAST_STICKY,粘性广播的特点是Intent会一直保留到广播事件结束,而这种广播也没有所谓的10秒限制,10秒限制是指普通的广播如果onReceive方法执行时间太长,超过10秒的时候系统会将这个广播置为可以干掉的candidate,一旦系统资源不够的时候,就会干掉这个广播而让它不执行。
下面是广播接收者的生命周期以及一些细节部分:
1.广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
2.广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框
3.最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉
4.耗时的较长的工作最好放在服务中完成

 

6.重写与重载有什么区别?

摘自http://www.cnblogs.com/bluestorm/archive/2012/03/01/2376236.html,感谢。

重写方法的规则

1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。

2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。

3、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)

4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:

父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。

 

而重载的规则:

1、必须具有不同的参数列表;

2、可以有不相同的返回类型,只要参数列表不同就可以了;

3、可以有不同的访问修饰符;

4、可以抛出不同的异常;

 

重写与重载的区别在于:

重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值。

用好重写和重载可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般.

 

8.讲下SystemServer?

这个就不说了,只了解一点点。

9.遇到过最困难的问题,说说?

10.遇到过的anr,并讲讲解决办法?

ANR一般有三种类型:
                  1:KeyDispatchTimeout(5 seconds) --主要类型
                  按键或触摸事件在特定时间内无响应
                  2:BroadcastTimeout(10 seconds)
                  BroadcastReceiver在特定时间内无法处理完成
                  3:ServiceTimeout(20 seconds) --小概率类型
                  Service在特定的时间内无法处理完成

如何调查并解决ANR
                  1:首先分析log
                  2: 从trace.txt文件查看调用stack.
                  3: 看代码
                  4:仔细查看ANR的成因(iowait?block?memoryleak?)

 

科匠中国:

1.写一个方法,返回一个字符串,其中包含一个空的Json对象或一个空的Json数组。

public static String createJsonString(String key,Object value){

    JSONObject jsonObject = new JSONObject();

    jsonObject.put(key,value);

    return jsonObject.toString();

}

 

2.对JSON串进行解析后,写出三个key所对应的数据类型:{“id”:100,“name”:“jack”,“phone”:null}

 Number,String,Null;

 

3.假设有一个方法foo(),在当前线程中如何以异步的方式调用它?

使用线程进行调用;

 

4.有两个50位数组成的整数,写一个方法返回它们的和,要求精确到个位。

思路:将两个数转换成字符串,再拆成50位整数放入数组中,按拉相加,和大于等于10的给高一位加上,最后输出结果。

 

 朗泰恒盛:

1、service生命周期?

以startService方式启动:onCreate->onStartCommand->onDestroy

onStartCommand返回一个int型的startMode,具体情况如下一问题所述。

 

以bindService方式启动:onCreate->onBind->onUnBind->onDestroy

onBind返回一个IBinder,用于跨进程通信

 

2、onStartConmmand方法返回值的作用?

START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。

START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。

START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。


START_STICKY_COMPATIBILITY: START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
 
3、如何避免oom?
 
4、如何用多线程下载一个超大文件?

5、一个应用跨进程调用别一个进程的ContentProvider,另一个进程会启动么?
最近看了AMS中setSystemProvider的过程,是会启动的。
 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值