Android面试题总结

一.java继承中的构造方法
1.子类的构造的过程中必须调用其基类的构造方法。
2.子类可以在自己的构造方法中使用super(arguments)调用基类的构造方法。
3.若子类的构造方法中没有显示地调用基类构造方法,系统则默认调用基类无参数的构造方法。
4.若子类构造方法中既没有显示的调用基类构造方法,而基类中又没有无参的构造方法,则编译出错。

二.内存优化,SoftReference与WeakReference的特性,开发中哪些场景中使用到
强引用(StrongReference):在强引用中如果不让该对象指向为null,垃圾回收器绝对不会回收它。除非出现内存不足的时候,jvm跑出oom导致程序异常终止的时候,才会回收具有强引用的对象。

Object obj = new Object();  //  强引用
obj = null;// 这时候垃圾回收器回收这个对象,至于什么时候回收,取决于垃圾回收器的算法

软引用(SoftReference):拥有强引用的属性,有更加安全。在内存空间足够、对象指向不为null的情况下,除非内存空间接近临界值、jvm即将抛出oom的时候,垃圾回收器才会将该引用对象进行回收,避免了系统内存溢出的情况。 因此SoftReference饮用对象非常适合实现内存敏感的缓存,例如加载图片的时候,bitmap缓存机制。

弱引用(WeakReference):当垃圾回收器扫描到弱引用对象的时候,不管内存空间是否足够,都会直接被回收,不过也不用担心,垃圾回收器是一个优先级比较低的现场,不一定很快可以发现弱引用的对象。
google官方推荐Android开发者使用WeakReference,而不建议SoftReference引用。

String value = new String("sy");
WeakReference weakRefer = new WeakReference(value);//弱引用
SoftReference softRefer = new SoftReference(value);//软引用

System.gc();

三.Service的两种启动方式,及其各自的生命周期。
一种是通过startService()方式进行启动,另一种通过bindService()方式进行启动。
通过startService()这种方式启动的service,生命周期:调用startService()--->onCreat()--->onStartConmon()--->onDestroy().多次调用startService(),onCreate()方法只会被调用一次。调用stopService()的时候会调用onDestroy(),从而销毁服务。
通过bindService()方法进行绑定,生命周期:bindService()--->onCreate()--->onBind()--->unBind()--->onDestroy().
bindService()这种方式启动service好处是更加便利activity中操作service。

四.Activity的启动方式及其特点
从桌面launcher上点击相应的应用图标,launcher本身也是一个应用,点击时系统会调用startActivitySately(),一般情况下,所启动的activity的相关信息都会保存在intent中,比如action。category等。
startActivity有四种启动模式:
standard模式是Android的默认启动模式,每次都启动一个新的Activity。
SingleTop模式:位于任务栈栈顶的Activity,再启动的时候不会创建新的实例,如果不位于栈顶,就会创建新的实例。
SingleTask模式:Activity在同一栈里面只有一个实例,如果位于栈顶,系统不会创建新的Activity,如果没有位于栈顶,系统会把该Activity移到栈顶,并把其上的Activity出栈。任务内是单例的。
SingleInstance模式:也是单例的,但SingleTask是任务栈内单例的,SingleInstance是整个系统内单例的,系统会创建一个新的任务栈,并且这个任务栈内只有他一个Activity。启动时会慢一些,切换效果不是很好。多用于多个应用之间。打开新页面,使用完成后点击返回键,就回到之前启动他的应用,不影响用户体验 。

五.WebView与JS进行双向通讯
调用webView的loadUrl(),显示网页。本地文件用:webView.loadUrl("file:///android_asset/XX.html");本地文件存放在assets中。
调用setContentView()显示网页试图,代码块
重写Activity的onKeyDown()方法,让webView支持回退功能。
JS调用Android代码:通过WebView的addJavascriptInterface()进行对象映射,仅奖Android对象和JS对象映射即可,但存在较大漏洞,是因为JS拿到Android对象后,就可以调用这个Android对象的所有方法,包括系统类。
Google在Android4.2版本中规定,被调用的函数以@JavascriptInterface进行注解,从而避免漏洞攻击。
在Android4.2版本之前采用拦截prompt()进行漏洞修复。
通过WebViewClient的shouldOverrideUrlLoading()方法拦截url,检测到是预先约定好的协议,就调用相应的方法。

六.WebView对象销毁时需要做何种处理来回收内存,防止内存泄露。
在xml中创建通过findViewById()加载的webView,也可以在代码中创建webview。

 //创建一个LayoutParams宽高设定为全屏
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        //创建WebView
        mWebView = new WebView(getApplicationContext());
        //设置WebView的宽高
        mWebView.setLayoutParams(layoutParams);
        //把webView添加到容器中
        mLayout.addView(mWebView);

//销毁webView
@Override
protected void onDestroy() {
    if (mWebView != null) {
        //加载null内容
        mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
        //清除历史记录
        mWebView.clearHistory();
        //移除WebView
        ((ViewGroup) mWebView.getParent()).removeView(mWebView);
        //销毁VebView
        mWebView.destroy();
        //WebView置为null
        mWebView = null;
    }
     super.onDestroy();
}

七.View、ViewGroup事件分发
ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三个相关事件。
View包含dispatchTouchEvent、onTouchEvent两个相关事件。
dispatchTouchEvent()负责将事件分发到其子view或者当前view中。
onInterceptTouchEvent用于拦截点击事件,优先级高于onTouchEvent。
onTouchEvent中完成对点击事件的处理,可以拦截并消耗事件。
dispatchTouchEvent()是事件分发的入口,即所有的事件处理都从这里开始在view和ViewGroup中有不同的实现。
三者关系可以用一下伪代码表示:

public void dispatchTouchEvent(Motion e){
    boolean result = false;
    if(onInterceptTouchEvent(e)){
        //如果当前view截获事件,那么事件由当前view处理,及调用onTouchEvent();
        result = ouTouchEvent(e);
    }else{
        //如果不截获则交给子view来分发
        result = child.dispatchTouchEvent(e);
    }
}

View中常用的两个方法onTouchListener和onClick。在dispatchTouchEvent中会优先判断onTouchEvent是否返回true,返回false则会继续执行onClick方法。

八.View的绘制流程
onMeasure()----->onLayout()----->onDraw()
onMeasure():测量视图大小
onLayout():确定view位置,进行页面布局
onDraw():绘制视图

九.Activity生命周期
onCreat()--->onStart()--->onResume()--->onRestart()--->onPouse()--->onStop()--->onDestroy()
onCreat():第一次打开Activity的时候会调用onCreat()方法,会在这个方法中初始化布局setContentLayout()
onStart():当前activity是用户可见状态,但没有焦点,与用户不能交互,一般可在该方法中做一些动画初始化操作。
onResume():当前activity处于运行状态,可与用户交互。
onPouse():当另一activity覆盖当前activity时,此时被覆盖activity会进入到onPouse()方法中,当前activity是可见的,但不能与用户交互状态。
onStop():activity对用户不可见,在系统内存紧张的时候,可能会被系统进行回收,所以一般在当前方法可做资源回收。
onDestroy():结束当前activity。
onRestart():在用户按下home键之后,在此进入到当前activity的时候调用。调用顺序是
//按下home键关闭页面执行的方法    onPouse()-->onStop()
//重新打开该activity执行的方法   onRestart()-->onStart()-->onResume()

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值