分类目录归档:Android

Android开发那点儿事-。-!

Android动画Tween Animation详解(alpha、scale、translate、rotate)

前面讲了动画中的Frame动画,今天就来详细讲解一下Tween动画的使用。

同样,在开始实例演示之前,先引用官方文档中的一段话:

Tween动画是操作某个控件让其展现出旋转、渐变、移动、缩放的这么一种转换过程,我们成为补间动画。我们可以以XML形式定义动画,也可以编码实现。

如果以XML形式定义一个动画,我们按照动画的定义语法完成XML,并放置于/res/anim目录下,文件名可以作为资源ID被引用;如果由编码实现,我们需要使用到Animation对象。

如果用定义XML方式实现动画,我们需要熟悉一下动画XML语法:

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android"  
    android:interpolator="@[package:]anim/interpolator_resource"  
    android:shareInterpolator=["true" | "false"] >  
    <alpha  
        android:fromAlpha="float"  
        android:toAlpha="float" />  
    <scale  
        android:fromXScale="float"  
        android:toXScale="float"  
        android:fromYScale="float"  
        android:toYScale="float"  
        android:pivotX="float"  
        android:pivotY="float" />  
    <translate  
        android:fromX="float"  
        android:toX="float"  
        android:fromY="float"  
        android:toY="float" />  
    <rotate  
        android:fromDegrees="float"  
        android:toDegrees="float"  
        android:pivotX="float"  
        android:pivotY="float" />
    <set>  
        ...  
    </set>  
</set>

XML文件中必须有一个根元素,可以是<alpha>、<scale>、<translate>、<rotate>中的任意一个,也可以是<set>来管理一个由前面几个元素组成的动画集合。

<set>是一个动画容器,管理多个动画的群组,与之相对应的Java对象是AnimationSet。它有两个属性,android:interpolator代表一个插值器资源,可以引用系统自带插值器资源,也可以用自定义插值器资源,默认值是匀速插值器;稍后我会对插值器做出详细讲解。android:shareInterpolator代表<set>里面的多个动画是否要共享插值器,默认值为true,即共享插值器,如果设置为false,那么<set>的插值器就不再起作用,我们要在每个动画中加入插值器。

<alpha>是渐变动画,可以实现fadeIn和fadeOut的效果,与之对应的Java对象是AlphaAnimation。android:fromAlpha属性代表起始alpha值,浮点值,范围在0.0和1.0之间,分别代表透明和完全不透明,android:toAlpha属性代表结尾alpha值,浮点值,范围也在0.0和1.0之间。

<scale>是缩放动画,可以实现动态调控件尺寸的效果,与之对应的Java对象是ScaleAnimation。android:fromXScale属性代表起始的X方向上相对自身的缩放比例,浮点值,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍;android:toXScale属性代表结尾的X方向上相对自身的缩放比例,浮点值;android:fromYScale属性代表起始的Y方向上相对自身的缩放比例,浮点值;android:toYScale属性代表结尾的Y方向上相对自身的缩放比例,浮点值;android:pivotX属性代表缩放的中轴点X坐标,浮点值,android:pivotY属性代表缩放的中轴点Y坐标,浮点值,对于这两个属性,如果我们想表示中轴点为图像的中心,我们可以把两个属性值定义成0.5或者50%。

<translate>是位移动画,代表一个水平、垂直的位移。与之对应的Java对象是TranslateAnimation。android:fromXDelta属性代表起始X方向的位置,android:toXDelta代表结尾X方向上的位置,android:fromYScale属性代表起始Y方向上的位置,android:toYDelta属性代表结尾Y方向上的位置,以上四个属性都支持三种表示方式:浮点数、num%、num%p;如果以浮点数字表示,代表相对自身原始位置的像素值;如果以num%表示,代表相对于自己的百分比,比如toXDelta定义为100%就表示在X方向上移动自己的1倍距离;如果以num%p表示,代表相对于父类组件的百分比。

<rotate>是旋转动画,与之对应的Java对象是RotateAnimation。android:fromDegrees属性代表起始角度,浮点值,单位:度;android:toDegrees属性代表结尾角度,浮点值,单位:度;android:pivotX属性代表旋转中心的X坐标值,android:pivotY属性代表旋转中心的Y坐标值,这两个属性也有三种表示方式,数字方式代表相对于自身左边缘的像素值,num%方式代表相对于自身左边缘或顶边缘的百分比,num%p方式代表相对于父容器的左边缘或顶边缘的百分比。

另外,在动画中,如果我们添加了android:fillAfter=”true”后,这个动画执行完之后保持最后的状态;android:duration=”integer”代表动画持续的时间,单位为毫米。

如果要把定义在XML中的动画应用在一个ImageView上,代码是这样的:

ImageView image = (ImageView) findViewById(R.id.image);  
Animation testAnim = AnimationUtils.loadAnimation(this, R.anim.test);  
image.startAnimation(testAnim);

下面重点介绍一下插值器的概念:

首先要了解为什么需要插值器,因为在补间动画中,我们一般只定义关键帧(首帧或尾帧),然后由系统自动生成中间帧,生成中间帧的这个过程可以成为“插值”。插值器定义了动画变化的速率,提供不同的函数定义变化值相对于时间的变化规则,可以定义各种各样的非线性变化函数,比如加速、减速等。下面是几种常见的插值器:

Interpolator对象 资源ID 功能作用
AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator 先加速再减速
AccelerateInterpolator @android:anim/accelerate_interpolator 加速
AnticipateInterpolator @android:anim/anticipate_interpolator 先回退一小步然后加速前进
AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator 在上一个基础上超出终点一小步再回到终点
BounceInterpolator @android:anim/bounce_interpolator 最后阶段弹球效果
CycleInterpolator @android:anim/cycle_interpolator 周期运动
DecelerateInterpolator @android:anim/decelerate_interpolator 减速
LinearInterpolator @android:anim/linear_interpolator 匀速
OvershootInterpolator @android:anim/overshoot_interpolator 快速到达终点并超出一小步最后回到终点

然后我们可以这样使用一个插值器:

<set android:interpolator="@android:anim/accelerate_interpolator">  

...  

</set>
<alpha android:interpolator="@android:anim/accelerate_interpolator"  

    .../>

如果只简单地引用这些插值器还不能满足需要的话,我们要考虑一下个性化插值器。我们可以创建一个插值器资源修改插值器的属性,比如修改AnticipateInterpolator的加速速率,调整CycleInterpolator的循环次数等。为了完成这种需求,我们需要创建XML资源文件,然后将其放于/res/anim下,然后再动画元素中引用即可。我们先来看一下几种常见的插值器可调整的属性:

<accelerateDecelerateInterpolator> 无

<accelerateInterpolator> android:factor 浮点值,加速速率,默认为1

<anticipateInterploator> android:tension 浮点值,起始点后退的张力、拉力数,默认为2

<anticipateOvershootInterpolator> android:tension 同上 android:extraTension 浮点值,拉力的倍数,默认为1.5(2  * 1.5)

<bounceInterpolator> 无

<cycleInterplolator> android:cycles 整数值,循环的个数,默认为1

<decelerateInterpolator> android:factor 浮点值,减速的速率,默认为1

<linearInterpolator> 无

<overshootInterpolator> 浮点值,超出终点后的张力、拉力,默认为2

下面我们就拿最后一个插值器来举例:

<?xml version="1.0" encoding="utf-8"?>  
<overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"  
    android:tension="7.0"/>

上面的代码中,我们把张力改为7.0,然后将此文件命名为my_overshoot_interpolator.xml,放置于/res/anim下,我们就可以引用到自定义的插值器了:

<scale xmlns:android="http://schemas.android.com/apk/res/android"  
    android:interpolator="@anim/my_overshoot_interpolator"  
    .../>

如果以上这些简单的定义还不能满足我们的需求,那么我们就需要考虑一下自己定义插值器类了。

我们可以实现Interpolator接口,因为上面所有的Interpolator都实现了Interpolator接口,这个接口定义了一个方法:float getInterpolation(float input);

此方法由系统调用,input代表动画的时间,在0和1之间,也就是开始和结束之间。

线性(匀速)插值器定义如下:

public float getInterpolation(float input) {  
    return input;  
}

加速减速插值器定义如下:

public float getInterpolation(float input) {  
    return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;  
}

有兴趣的话,大家可以尝试一下自定义一个插值器。

讲了这么久的概念,下面我们就结合实例来演示一下几种Tween动画的应用。

先来介绍一下旋转动画的使用,布局文件/res/layout/rotate.xml如下:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout  
  xmlns:android="http://schemas.android.com/apk/res/android"  
  android:orientation="vertical"  
  android:layout_width="fill_parent"  
  android:layout_height="fill_parent"  
  android:background="#FFFFFF">  
  <ImageView  
        android:id="@+id/piechart"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_gravity="center_horizontal"  
        android:src="@drawable/piechart"/>  
  <Button  
        android:id="@+id/positive"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:text="顺时针"  
        android:onClick="positive"/>  
  <Button  
        android:id="@+id/negative"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:text="逆时针"  
        android:onClick="negative"/>       
</LinearLayout>

我们定义了一个ImageView,用于显示一个饼状图,演示旋转动画,然后定义了两个按钮,用以运行编码实现的动画。动画定义文件/res/anim/rotate.xml如下:

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android"  
    android:interpolator="@android:anim/accelerate_decelerate_interpolator">  
    <rotate  
        android:fromDegrees="0"  
        android:toDegrees="+360"  
        android:pivotX="50%"  
        android:pivotY="50%"  
        android:duration="5000"/>  
</set>

最后再来看一下RotateActivity.java代码:

package com.scott.anim;  

import android.app.Activity;  
import android.os.Bundle;  
import android.view.View;  
import android.view.animation.Animation;  
import android.view.animation.AnimationUtils;  
import android.view.animation.LinearInterpolator;  
import android.view.animation.RotateAnimation;  

public class RotateActivity extends Activity {  
    private int currAngle;  
    private View piechart;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.rotate);  

        piechart = findViewById(R.id.piechart);  
        Animation animation = AnimationUtils.loadAnimation(this, R.anim.rotate);  
        piechart.startAnimation(animation);  
    }  

    public void positive(View v) {  
        Animation anim = new RotateAnimation(currAngle, currAngle + 180, Animation.RELATIVE_TO_SELF, 0.5f,  
                Animation.RELATIVE_TO_SELF, 0.5f);  
        /** 匀速插值器 */  
        LinearInterpolator lir = new LinearInterpolator();  
        anim.setInterpolator(lir);  
        anim.setDuration(1000);
  
        /** 动画完成后不恢复原状 */  
        anim.setFillAfter(true);  
        currAngle += 180;  
        if (currAngle > 360) {  
            currAngle = currAngle - 360;  
        }  
        piechart.startAnimation(anim);  
    }  

    public void negative(View v) {  
        Animation anim = new RotateAnimation(currAngle, currAngle - 180, Animation.RELATIVE_TO_SELF, 0.5f,  
                Animation.RELATIVE_TO_SELF, 0.5f);  
        /** 匀速插值器 */  
        LinearInterpolator lir = new LinearInterpolator();  
        anim.setInterpolator(lir);  
        anim.setDuration(1000);  

        /** 动画完成后不恢复原状 */  
        anim.setFillAfter(true);  
        currAngle -= 180;  
        if (currAngle < -360) {  
            currAngle = currAngle + 360;  
        }  
        piechart.startAnimation(anim);  
    }  
}

然后,看一下渐变动画,布局文件/res/layout/alpha.xml如下:

<?xml version="1.0" encoding="utf-8"?>  
<FrameLayout  
  xmlns:android="http://schemas.android.com/apk/res/android"  
  android:layout_width="fill_parent"  
  android:layout_height="fill_parent"  
  android:background="#FFFFFF">  
  <ImageView  
      android:id="@+id/splash"  
      android:layout_width="fill_parent"  
      android:layout_height="fill_parent"  
      android:layout_gravity="center"  
      android:src="@drawable/splash"/>  
  <Button  
      android:layout_width="fill_parent"  
      android:layout_height="wrap_content"  
      android:layout_gravity="bottom"  
      android:text="alpha"  
      android:onClick="alpha"/>    
</FrameLayout>

动画定义文件/res/anim/alpha.xml如下:

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android">  
    <alpha  
        android:fromAlpha="0.0"  
        android:toAlpha="1.0"  
        android:duration="3000"/>  
</set>

AlphaActivity.java代码如下:

package com.scott.anim;  

import android.app.Activity;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.View;  
import android.view.animation.AlphaAnimation;  
import android.view.animation.Animation;  
import android.view.animation.Animation.AnimationListener;  
import android.view.animation.AnimationUtils;  
import android.widget.ImageView;  

public class AlphaActivity extends Activity implements AnimationListener {  
    private ImageView splash;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.alpha);  
     
        splash = (ImageView) findViewById(R.id.splash);  
        Animation anim = AnimationUtils.loadAnimation(this, R.anim.alpha);  
        anim.setAnimationListener(this);  
        splash.startAnimation(anim);  
    }  

    public void alpha(View view) {  
        Animation anim = new AlphaAnimation(1.0f, 0.0f);  
        anim.setDuration(3000);  
        anim.setFillAfter(true);  
        splash.startAnimation(anim);  
    }  
  
    @Override  
    public void onAnimationStart(Animation animation) {  
        Log.i("alpha""onAnimationStart called.");  
    }  

    @Override  
    public void onAnimationEnd(Animation animation) {  
        Log.i("alpha""onAnimationEnd called");  
    }  
 
    @Override  
    public void onAnimationRepeat(Animation animation) {  
        Log.i("alpha""onAnimationRepeat called");  
    }  
}

接着看一下位移动画,布局文件/res/layout/translate.xml如下:

<?xml version="1.0" encoding="utf-8"?>  
<FrameLayout  
  xmlns:android="http://schemas.android.com/apk/res/android"  
  android:orientation="vertical"  
  android:layout_width="fill_parent"  
  android:layout_height="fill_parent">  
  <ImageView  
    android:id="@+id/trans_image"  
    android:layout_width="wrap_content"  
    android:layout_height="wrap_content"  
    android:layout_weight="1"  
    android:src="@drawable/person"/>  
  <Button  
    android:id="@+id/trans_button"  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:layout_gravity="bottom"  
    android:text="translate"  
    android:onClick="translate"/>  
</FrameLayout>

动画定义文件/res/anim/translate.xml如下:

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android"  
    android:interpolator="@android:anim/bounce_interpolator">  
    <translate  
        android:fromXDelta="0"  
        android:fromYDelta="0"  
        android:toXDelta="200"  
        android:toYDelta="300"  
        android:duration="2000"/>  
</set>

然后TranslateActivity.java代码如下:

package com.scott.anim;  
  
import android.app.Activity;  
import android.os.Bundle;  
import android.view.View;  
import android.view.animation.Animation;  
import android.view.animation.AnimationUtils;  
import android.view.animation.OvershootInterpolator;  
import android.view.animation.TranslateAnimation;  
import android.widget.ImageView;  
  
public class TranslateActivity extends Activity {  
     
    private ImageView trans_iamge; 
      
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.tanslate);  
        trans_iamge = (ImageView) findViewById(R.id.trans_image);  
        Animation anim = AnimationUtils.loadAnimation(this, R.anim.translate);  
        anim.setFillAfter(true);  
        trans_iamge.startAnimation(anim);  
    }  
      
    public void translate(View view) {  
        Animation anim = new TranslateAnimation(20003000);  
        anim.setDuration(2000);  
        anim.setFillAfter(true);  
        OvershootInterpolator overshoot = new OvershootInterpolator();  
        anim.setInterpolator(overshoot);  
        trans_iamge.startAnimation(anim);  
    }  
}

最后,我们再来看以下缩放动画,布局文件/res/layout/scale.xml如下:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout  
  xmlns:android="http://schemas.android.com/apk/res/android"  
  android:orientation="vertical"  
  android:layout_width="fill_parent"  
  android:layout_height="fill_parent">  
  <ImageView  
    android:id="@+id/scale_image"  
    android:layout_width="wrap_content"  
    android:layout_height="wrap_content"  
    android:layout_gravity="center"  
    android:layout_weight="1"  
    android:src="@drawable/person"/>  
  <Button  
    android:id="@+id/scale_button"  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:layout_gravity="bottom"  
    android:text="scale"  
    android:onClick="sclae"/>  
</LinearLayout>

动画定义文件/res/anim/scale.xml如下:

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android"  
    android:interpolator="@android:anim/bounce_interpolator">  
    <scale  
        android:fromXScale="1.0"  
        android:toXScale="2.0"  
        android:fromYScale="1.0"  
        android:toYScale="2.0"  
        android:pivotX="0.5"  
        android:pivotY="50%"  
        android:duration="2000"/>  
    <alpha  
        android:fromAlpha="0.0"  
        android:toAlpha="1.0"  
        android:duration="3000"/>  
</set>

然后ScaleActivity.java代码如下:

package com.scott.anim;  
  
import android.app.Activity;  
import android.os.Bundle;  
import android.view.View;  
import android.view.animation.Animation;  
import android.view.animation.AnimationUtils;  
import android.view.animation.BounceInterpolator;  
import android.view.animation.ScaleAnimation;  
import android.widget.ImageView;  
  
public class ScaleActivity extends Activity {  
      
    private ImageView scale_iamge;  
      
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.scale);  
        scale_iamge = (ImageView) findViewById(R.id.scale_image);  
        Animation anim = AnimationUtils.loadAnimation(this, R.anim.scale);  
        anim.setFillAfter(true);  
        scale_iamge.startAnimation(anim);  
    }  
      
    public void sclae(View view) {  
        Animation anim = new ScaleAnimation(2.0f, 1.0f, 2.0f, 1.0f,   
                Animation.RELATIVE_TO_SELF, 0.5f,   
                Animation.RELATIVE_TO_SELF, 0.5f);  
        anim.setDuration(2000);  
        anim.setFillAfter(true);  
        BounceInterpolator bounce = new BounceInterpolator();  
        anim.setInterpolator(bounce);  
        scale_iamge.startAnimation(anim);  
    }  
}

 

Android面试题整理

Java部分

1.GC是什么? 为什么要有GC?

GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

2.XML包括哪些解释技术,区别是什么?

DOM和SAX
DOM将文档解析成一颗文档树,可在节点上进行遍历、增加、修改和删除。一次性读入内存,对内存消耗大。
SAX至上而下解析文档,以事件进行驱动。不会一次性读入内存,对内存消耗小,不能任意读取节点,并且不能对节点进行增加、修改和删除。

3.switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

switch能作用在byte、char、short和int上,JDK1.7后可以作用在String上。

4.”==”和equals方法究竟有什么区别?

==和equals都可以比较地址。==是运算符,equals是方法,方法可以通过重写改变其行为,如String的equals就是比较字符串内容。

5.构造方法能否被重写和重载?

构造方法不能被重写但是能被重载。

6.面向对象的特征有哪些?

封装、继承、多态和抽象。

7.抽象类和接口的区别?

1).抽象类是abstract class修饰,接口是interface修饰。
2).抽象类可以有任意类型的属性,接口只能有静态常量修饰的属性。
3).抽象类可以有普通方法和抽象法方法,接口的方法都是抽象方法。
4).抽象类和接口都不能实例化,但是抽象类有构造方法,接口没有构造方法。
5).抽象类只能单根继承,接口可以多重实现。

8.内部类可以引用它的包含类的成员吗?有没有什么限制?

可以引用。如果需要指定当前类时要用外部类.this来引用。如果引用局部变量,需要将局部变量指定为final。

9.String s = new String(“xyz”);创建了几个String Object? 二者之间有什么区别?

2个对象。”xyz”创建在字符串常量池中,new String()创建在堆中。

10.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

会在return前执行。

11.Integer与int的区别

Integer为包装类,int是基本数据类型。包装类拥有方法和属性,基本数据类型不具备。包装类可以通过intValue来转换成基本数据类型,也可以通过new Integer()将基本数据类型转换为包装类。在JDK1.5后,包装类和基本数据类型可以实现自动转换。

12.sleep()和wait()有什么区别?

sleep是Thread类的方法,wait是Object类的方法。
sleep是自动唤醒,wait需要其他线程来唤醒。
sleep不会释放同步锁,wait会释放同步锁。
sleep可以用在任意方法中,wait只能用在同步方法或同步块中。
Sleep()不会释放对象锁到时自动恢复, wait()会释放对象锁 进入等待此对象的等待锁定池 发出notify()方法后 才进入等待锁定池准备对象锁的获 取进入运行状态

13.同步和异步有何异同,在什么情况下分别使用他们?

同步指同一时间只能一个线程执行该方法,其他线程需要等待。异步指多个线程可以同时执行某个方法,并共享同一资源。
同步可以让访问的资源具有安全性,因为同一时间只能一个线程对其进行访问。但是效率不高。
异步对访问的资源会造成不稳定性,比如多个线程同时访问一个资源,一个在修改、一个在删除、一个在读取,这样可能会造成资源的混乱。但是由于同时运行, 执行效率得到提高。

14.启动一个线程是用run()还是start()?

start()方法启动线程,run方法是线程执行的主方法。

15.java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

java中有三种流,分别是字节流(InputStream、OutputStream)、字符流(Reader、Writer)、对象流(ObjectInputStream、 ObjectOutputStream)。

16.字节流与字符流的区别?

字节流用于读取或写出二进制数据,比如图片、影像等数据。
字符流用于读取或写出字符数据,比如传输字符串。
所有的数据都可以通过字节流来进行处理,不过如果是字符数据,用字节流还需要进行转换后传输,如果使用字符流可以方便数据的转换。

17.error和exception有什么区别?

error是系统错误,代码不能处理的错误,比如内存溢出、堆栈溢出等。
exception是程序异常,可以通过代码try-catch进行处理,比如空指针异常,数组越界等。

18.谈谈final,finally,finalize的区别?

final是修饰符,可以修饰类(不能被继承)、属性(常量)、和方法(不能被重写)。
finally是异常处理块中的代码块,表示无论如何都会执行的代码块。
finalize是Object类的方法,该方法在对象被垃圾回收之前执行的方法。

19.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

如果其他方法没有加synchronized的话是可以进入的。

20.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

java中只有值传递,如果传递的对象,实际也是传递该对象的地址。

21.作用域public,private,protected,以及不写时的区别

public公共修饰符,表示任意类都可以访问。
protected为受保护的修饰符,表示同类、同包以及不同包但是父子关系的是可以访问。
不写表示默认修饰符,或者称为package修饰符,该修饰符表示只有同类或同包下的类可以访问,出了这个包就不能访问了。
private为私有修饰符,表示只有同类中可以访问,出了这个类就不能访问了。

22.用最有效率的方法算出2乘以8等於几 2《 3

将2的二进制向左移3位。java中用<<来移位。

23.heap和stack有什么区别。

heap表示堆,stack表示栈。堆中放对象,栈中放引用变量。
堆空间是一个无序的空间,栈是先进后出的结构。

24.运行时异常与一般异常有何异

运行时异常是指继承于RuntimeException的异常,这些异常在编译时可以不进行处理,当运行时如果出现问题才会抛出。如NullPointException、 ArrayIndexOutOfBoundsException
一般异常也称为编译时异常,这些异常是继承Exception但又不属于RuntimeException的子类,如果程序中出现这些异常,在编译时必须进行捕获或抛出,否 则编译无法通过。如IOException、FileNotFoundException

25.垃圾回收的优点和原理。并考虑2种回收机制

Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存 管理。由于有个垃圾回收机制,Java中的对象不再有”作用域”的概念,只有对象的引用才有”作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用 的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能 实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

26.描述一下JVM加载class文件的原理机制?

JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。

27.是否可以从一个static方法内部发出对非static方法的调用?

不能,除非先创建非static方法所在类的对象。

28.什么是java序列化,如何实现java序列化?

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序 列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化 的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的 writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

29.Anonymous Inner Class(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

匿名内部类可以继承类或实现接口,但不是显示的使用extends或implements来继承或实现。

30.ArrayList和Vector的区别,HashMap和Hashtable的区别?

ArrayList是JDK1.2的集合类并且线程不安全,Vector是1.0的集合类并且线程安全,二者用法类似。
HashMap线程不安全且能放空键或空值,Hashtable线程安全且不能放空键或空值。

31.String 和StringBuffer有什么差别?在什么情况下使用它们?

String字符串的基本类,该字符串是不可变的。StringBuffer是利用堆来存储字符串,并且可以对字符串的内容进行改变。

32.new一个类对象和使用类名创建一个对象有什么区别?二者使用时应该注意什么?

new对象是最常见的创建对象的方式,利用类模板是通过反射来创建对象。虽然new对象时在底层也会通过类模板来创建对象,但是new对象的效率要比直接通过类 模板创建对象的方式要高。
但是使用类模板的方式可以让程序的灵活性提高。

33.LinkedList和ArrayList的区别?

1)LinkedList是链表结构的集合,ArrayList数组结构的集合。
2)LinkedList在中间或前面增加或删除数据时效率比ArrayList高。
3)LinkedList在最后添加或删除数据时效率比ArrayList低。
4)遍历数据时ArrayList效率高于LinkedList。

34.介绍JAVA开发中常用的Collection FrameWork(集合框架)?

Java中集合框架分为Collection和Map接口,Collection接口下的集合每个元素都由一个值组成,Map接口下的集合类每个元素都是由键值对组成。
Collection接口下面有List和Set接口,List接口下常见的类有ArrayList、LinkedList、Vector。它们中的元素可以重复,并且是有序的。Set接口下常 见的类有HashSet、TreeSet。它们中的元素不能重复,并且是无序的。

35.在异常当中 throw和throws 有什么区别和联系?

throw是在代码中抛出一个异常,后面跟的是异常对象,虚拟机运行到这里时会立即引发一个异常。
throws是写在方法声明上的,表示声明该方法可能会抛出异常,后面跟的是异常类型。调用该方法的时候可以选择处理它或继续往外抛。

36.重载和重写的区别

重载是指在一个类中,两个或两个以上的方法具有相同方法名和不同参数列表,则表示这些方法为重载方法。
重写是指在父类和子类中,子类的方法和父类的方法具有相同方法名、相同参数列表、相同返回类型、子类的访问修饰符范围不小于父类的访问修饰符范围,异常 的类型和个数不大于或多于父类的异常类型和个数,则表示该方法为重写方法。换句话说重载方法是区分同一个类中相同方法名的方法,重写方法是找到父类相同 方法名的方法并重新改变方法的行为。

37.Java中try catch finally的执行顺序

先执行try中代码发生异常执行catch中代码,最后一定会执行finally中代码

38.内存泄露的原因:

  • 资源对象没关闭。
    如Cursor、File等资源。他们会在finalize中关闭,但这样效率太低。容易造成内存泄露。
    SQLiteCursor,当数据量大的时候容易泄露
  • 使用Adapter时,没有使用系统缓存的converView。
  • 即时调用recycle()释放不再使用的Bitmap。
    适当降低Bitmap的采样率,如:
    BitmapFactory.Options options = newBitmapFactory.Options();
    options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一
    Bitmap bitmap =BitmapFactory.decodeStream(cr.openInputStream(uri), null, options); preview.setImageBitmap(bitmap);
  • 使用application的context来替代activity相关的context。
    尽量避免activity的context在自己的范围外被使用,这样会导致activity无法释放。
  • 注册没取消造成内存泄露
    如:广播
    集合中的对象没清理造成的内存泄露我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会 越来越大。如果这个集合是static的话,那情况就更严重了。
  • Handler应该申明为静态对象, 并在其内部类中保存一个对外部类的弱引用。如下:
    static class MyHandler extends Handler
    {

     WeakReference<Activity > mActivityReference;
     MyHandler(Activity activity)
    { 
          mActivityReference= new WeakReference<Activity>(activity);
    }
    

    @Override
    public void handleMessage(Message msg)
    {

     final Activity activity = mActivityReference.get();
     if (activity != null)
    {
           mImageView.setImageBitmap(mBitmap);
    }    
    

    }
    }

39.Iterator和Enumeration的不同

  • 函数接口不同
    Enumeration只有2个函数接口。通过Enumeration,我们只能读取集合的数据,而不能对数据进行修改。 Iterator只有3个函数接口。Iterator除了能读 取集合的数据之外,也能数据进行删除操作。
  • Iterator支持fail-fast机制,而Enumeration不支持。 Enumeration 是JDK 1.0添加的接口。使用到它的函数包括Vector、Hashtable等类,这些类 都是JDK 1.0中加入的,Enumeration存在的目的就是为它们提供遍历接口。Enumeration本身并没有支持同步,而在Vector、Hashtable实现 Enumeration时,添加了同步。而Iterator 是JDK 1.2才添加的接口,它也是为了HashMap、ArrayList等集合提供遍历接口。
    Iterator是支持fail-fast 机制的:当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。
    ail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线 程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异 常,产生fail-fast事件。

40.接口的注意点

  • 接口中的字段全部默认为 public static类型。
  • 接口中的方法全部默认为 public类型。
  • 接口中可以申明内部类,而默认为public static,正因为是static,只是命名空间属于接口,代码逻辑不属于接口。所以不违法接口定义。
  • 接口本身可以申明为public或者缺省。
  • 抽象类继承自某接口。如果在抽象类中实现了父类(接口)中的方法,在其子类可以不用实现,否则在子类必须实现。

41.final方法

将方法声明为final那有两个原因,第一就是说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。第二就是允许编译器将所有对此方法的调用转化为inline调用的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。

ANDROID部分

1.activity、Service、BroadcastReceiver的作用(android)

Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑
service:后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的指令,定义好需要接受的Intent提供同步和异步的接口
BroadCast Receiver:接受一种或者多种Intent作触发事件,接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型

2.描述一个完整的Android activity lifecycle

activity的生命周期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory();

3.显式intent和隐式intent的区别是什么(android)

Intent定义:Intent是一种在不同组件之间传递的请求消息,是应用程序发出的请求和意图。作为一个完整的消息传递机制,Intent不仅需要发送端,还需要接收端。
显式Intent定义:对于明确指出了目标组件名称的Intent,我们称之为显式Intent。
隐式Intent定义:对于没有明确指出目标组件名称的Intent,则称之为隐式Intent。
说明:Android系统使用IntentFilter 来寻找与隐式Intent相关的对象。

4.Android中线程同步的方法

线程同步的方法可以采用同步方法和同步块。

5.怎么将一个Activity封装成对话框的样子? 怎样将Activity封装成长按Menu菜单的样子?

简单你只需要设置 一下Activity的主题就可以了在AndroidManifest.xml 中定义 Activity的地方一句话:
Xml代码
android :theme=”@android:style/Theme.Dialog”
android:theme=”@android:style/Theme.Dialog”
这就使你的应用程序变成对话框的形式弹出来了,或者
Xml代码
android:theme=”@android:style/Theme.Translucent”
android:theme=”@android:style/Theme.Translucent”
就变成半透明的。
重写OnCreateOptionMenu方法来处理按下menu后的行为,然后再该方法中弹出对话框形式的Activity。
也可以利用事件监听来监听menu按键,并在该按钮按下后弹出对话框形式的Activity。

6.介绍一下Android系统的体系结构

应用层:android的应用程序通常涉及用户界面和交互。
应用框架层:UI组件、各种管理器等。
函数库层:系统C库、媒体库、webkit、SQLite等。
linux核心库:linux系统运行的组件。

7.描述下横竖屏切换时候 activity 的生命周期

不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次.
设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次.
设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法.

8.android 中的动画有哪几种,它们的特点和区别是什么 ?

两种,一种是补间动画(Tween)动画、还有一种是帧动画(Frame)动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

9.一条最长的短信息约占多少 byte?

140byte,70个汉字。

10.描述handler 机制的原理

andriod提供了 Handler 和 Looper 来满足线程间的通信。
Handler 先进先出原则。
Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。
1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。

11.如何将 SQLite 数据库 (dictionary.db 文件 ) 与 apk 文件一起发布 ?

可以将dictionary.db文件复制到Eclipse Android工程中的res\raw目录中。所有在res\raw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。
使用openDatabase方法来打开数据库文件,如果该文件不存在,系统会自动创建/sdcard/dictionary目录,并将res\raw目录中的 dictionary.db文件复制到/sdcard/dictionary目录中

12.说说 android 中 mvc 的具体体现

mvc是model,view,controller的缩写,mvc包含三个部分:
模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,响应用户出发的相关事件,交给m层处理。
android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下:
1)视图(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入。
2)控制层(controller):android的控制层的重任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写过多的代码,要通过activity交割model业务逻辑层处理,这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。

13.请介绍下 Android 中常用的五种布局

帧布局(FrameLayout)
线性布局(LinearLayout)
表格布局(TableLayout)
相对布局(RelativeLayout)
绝对布局(AbsoluteLayout)

14.如何启用 Service ,如何停用 Service

1)startService用于启动Service、stopService停止Service。
2)bindService绑定Service,unbindService解除Service的绑定。

15.如何优化ListView

1、如果自定义适配器,那么在getView方法中要考虑方法传进来的参数contentView是否为null,如果为null就创建contentView并返回,如果不为null则直接使用。在这个方法中尽可能少创建view。
2、给contentView设置tag(setTag()),传入一个viewHolder对象,用于缓存要显示的数据,可以达到图像数据异步加载的效果。
3、如果listview需要显示的item很多,就要考虑分页加载。比如一共要显示100条或者更多的时候,我们可以考虑先加载20条,等用户拉到列表底部的时候再去加载接下来的20条。

16.描述4 种 activity 的启动模式

1)standard :系统的默认模式,一次跳转即会生成一个新的实例。假设有一个activity命名为MainActivity,执行语句:
startActivity(new Intent(MainActivity.this, MainActivity.class))后,MainActivity将跳转到另外一个MainActivity,也就是现在的Task栈里面有MainActivity的两个实例。按返回键后你会发现仍然是在MainActivity(第一个)里面。
2)singleTop:singleTop 跟standard 模式比较类似。如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。例:当MainActivity为 singleTop 模式时,执行跳转后栈里面依旧只有一个实例,如果现在按返回键程序将直接退出。
3)singleTask: singleTask模式和后面的singleInstance模式都是只创建一个实例的。在这种模式下,无论跳转的对象是不是位于栈顶的activity,程序都不会生成一个新的实例(当然前提是栈里面已经有这个实例)。这种模式相当有用,在以后的多activity开发中,经常会因为跳转的关系导致同个页面生成多个实例,这个在用户体验上始终有点不好,而如果你将对应的activity声明为 singleTask 模式,这种问题将不复存在。
4)singleInstance: 设置为 singleInstance 模式的 activity 将独占一个task(感觉task可以理解为进程),独占一个task的activity与其说是activity,倒不如说是一个应用,这个应用与其他activity是独立的,它有自己的上下文activity。

17.什么是Intent,如何使用?

Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。
通过startActivity() orstartActivityForResult()启动一个Activity;
过 startService() 启动一个服务,或者通过bindService() 和后台服务交互;
通过广播方法(比如 sendBroadcast(),sendOrderedBroadcast(),sendStickyBroadcast())发给broadcast receivers

18.Android用的数据库是什么样的?它和sql有什么区别?为什么要用ContentProvide?它和sql的实现上有什么差别?

Adnroid用的是SQLite数据库。它和其他网络数据库类似,也是通过SQL对数据进行管理。SQLite的操作非常简单,包括数据类型在建表时也可以不指定。
使用ContentProvider 可以将数据共享给其他应用,让除本应用之外的应用也可以访问本应用的数据。它的底层是用SQLite 数据库实现的,所以其对数据做的各种操作都是以Sql实现,只是在上层提供的是Uri。

19.通过Intent传递一些二进制数据的方法有哪些?

1)使用Serializable接口实现序列化,这是Java常用的方法。
2)实现Parcelable接口,这里Android的部分类比如Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见的。

20.对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行?

onResume()恢复数据、onPause()保存数据。

21.如何一次性退出所有打开的Activity

编写一个Activity作为入口,当需要关闭程序时,可以利用Activity的SingleTop模式跳转该Activity,它上面的所有Activity都会被销毁掉。然后再将该Activity关闭。
或者再跳转时,设置intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);这样也能将上面的Activity销毁掉。

22.说说Service的生命周期?

启动Service的方式有两种,各自的生命周期也有所不同。
一、通过startService启动Service:onCreate、onStartCommand、onDestory。
二、通过bindService绑定Service:onCreate、onBind、onUnbind、onDestory。

23.什么是AIDL?AIDL是如何工作的?

AIDL(Android接口描述语言)是一种接口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象。AIDL是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值.。

24.Android如何把文件存放在SDCard上?

在AndroidManifest.xml中加入访问SDCard的权限如下:
<!– 在SDCard中创建与删除文件权限 –>
<!– 往SDCard写入数据权限 –>
要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。
注意:访问SDCard必须在AndroidManifest.xml中加入访问SDCard的权限。
Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED。
Environment.getExternalStorageDirectory()方法用于获取SDCard的目录。

25.注册广播有几种方式,这些方式有何优缺点?

两种。一种是通过代码注册,这种方式注册的广播会跟随程序的生命周期。二种是在AndroidManifest.xml中配置广播,这种常驻型广播当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

26.什么是ANR 如何避免它?

在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。要避免它,应该尽量少在主线程做耗时太长的操作,应该将这些操作放在线程当中去做。

27.Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?诺有的话会导致什么问题?如何解决?

有可能,比如空指针异常、数组下表越界等异常,这些异常抛出后可能会导致程序FC。在编写代码时应该做好检测,多考虑可能会发生错误的情况,从代码层次解决这些问题。

28.为什么要用 ContentProvider?它和 sql 的实现上有什么差别?

使用ContentProvider 可以将数据共享给其他应用,让除本应用之外的应用也可以访问本应用的数据。它的底层是用SQLite 数据库实现的,所以其对数据做的各种操作都是以Sql实现,只是在上层提供的是Uri。

29.谈谈 UI 中, Padding 和 Margin 有什么区别?

padding指内边距,表示组件内部元素距离组件边框的距离。
marin指外边距,表示组件与组件之间的距离。

30.请介绍下 Android 的数据存储方式。

Android 提供了5种方式存储数据:
1)使用SharedPreferences存储数据;
2)文件存储数据;
3)SQLite数据库存储数据;
4)使用ContentProvider存储数据;
5)网络存储数据;

2016年Android面试题大全,最新整理

1. Intent的几种有关Activity启动的方式有哪些,你了解每个含义吗?

Intent的一些标记有
FLAG_ACTIVITY_BROUGHT_TO_FRONT 、FLAG_ACTIVITY_CLEAR_TOP、
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET、 FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS、
FLAG_ACTIVITY_MULTIPLE_TASK和FLAG_ACTIVITY_NEW_TASK等。
每种含义大家看SDK文档和具体跑下这样你的记忆会更深刻些。

2. Activity和Task的启动模式有哪些?每种含义是什么?

有关在AndroidManifest.xml中的android:launchMode定义,主要有standard、singleTop、 singleTask和singleInstance,同时对于android:taskAffinity这些问题大家也要了解。

3. 通过Intent传递一些二进制数据的方法有哪些?

1).使用Serializable接口实现序列化,这是Java常用的方法。
2).实现Parcelable接口,这里Android的部分类比如Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见的。

4. 能说下Android应用的入口点吗?

真正的Android入口点是application的main,你可以看下androidmanifest.xml的包含关系就清楚了。可以没有Activity但是必须有Application

5. Android都有哪些XML解析器,都熟练掌握吗?

这里XmlPull、SAX和DOM相信做过Web开发的都已经滚瓜烂熟了。

6. SQLite支持事务吗?添加删除如何提高性能?

SQLite作为轻量级的数据库,比MySQL还小,但支持SQL语句查询,提高性能可以考虑通过原始经过优化的SQL查询语句方式处理。

7. Android Service和Binder、AIDL你都熟练吗?

作为Android重要的后台服务,这些每个Android开发者都应该掌握,这也算是和JavaSE最大的不同了,具体的实例大家可以查看Android音乐播放器的源代码Music.git中的,这里不再赘述。

8.请描述下Activity的生命周期。

创建oncreate – 启动onstart – 恢复onResume – 暂停onPause – 结束onEnd–销毁onDestroy

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

在”暂停onPause”状态将数据保存。

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

设置Theme。

11.请介绍下Android中常用的五种布局。

线性布局LinearLayout,相对布局RelativeLayout
表单布局TableLayout,
绝对布局AbsLayout(已淘汰)帧布局FrameLayout

12.请介绍下Android的数据存储方式。

Preference,文件,数据库SQlite,网络存储

13.如何启用Service,如何停用Service。

启动:
Context.startService()
and Context.bindService().
关闭:
Context.stopService()
Service.stopSelf()orService.stopSelfResult()

14.你如何评价Android系统?优缺点。

优势:一、开放性三、丰富的硬件选择五、无缝结合的Google应用支持
缺点:一、安全和隐私二,开发商自定义,不够统一四、同类机型用户减少

15. android:paddingLeft与android:layout_marginLeft的区别

padding是内部间距,margin是外部间距。

16.Android动画有哪几种?描述一下

Android包含三种动画:View Animation(Tween Animation)、 Drawable Animation、Property Animation(属性动画,Android3.0新引入)

 

文/小程序(简书作者)
原文链接:http://www.jianshu.com/p/d5f650ac5f03
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

ScrollView内嵌ListView时进页面没有置顶问题,手动设置ScrollView滚动条置顶

最近遇到个需求,在一个页面中有两个ListView控件,这时发现,在进入页面之时,初始状态ScrollView没有置顶,反而是第一个ListView置顶了,这时就需要在进入页面的时候手动让ScrollView置顶。

代码如下:

scrollview.smoothScrollTo(0, 0)