【Android进阶】Android面试题目整理与解说

这一篇文章专门整理一下研究过的Android面试题,内容会随着学习不断的添加。假设答案有错误。希望大家能够指正

1.简述Activity的生命周期


当Activity開始启动的时候,首先调用onCreate()。onStart()。onResume()方法。此时Activity对用户来说,是可见的状态

当Activity从可见状态变为被Dialog遮挡的状态的时候,会调用onPause()方法,此时的Activity对用户可见,可是不能相
应用户的点击事件

当Activity从可见状态变为被其它的Activity全然覆盖或者是点击Home进入后台的时候,会依次调用onPause(),onStop()方法,假设在这个期间,系统内存不足。导致Activity被回收的话。还会调用onDestory()方法

当Activity从被Dialog遮挡的状态恢复的时候。会调用onResume()方法,从而恢复能够点击的状态

当Activity从被其它Activity遮挡或者是进入后台状态恢复,并且没有被系统回收的时候。会依次调用onRestart(),onStart(),onResume()。恢复到能够与用户进行交互的状态

当Activity从被其它Activity遮挡或者进入后台,并且被系统回收的时候,相当于又一次打开一个Activity。既调用onCreate(),onStart(),onResume()方法,从而能够与用户进行交互

在onPause()方法运行后,系统会停止动画等消耗 CPU 的操作。同一时候我们应该在这里保存数据,由于这个时候程序的优先级减少。有可能被系统收回。

在这里保存的数据,应该在 onResume 里读出来,帮用户恢复之前的状态。


在onDestroy()运行后,activity就被真的干掉,能够用 isFinishing()来推断它。假设此时有 Progress Dialog显示,我们应该在onDestroy()里 cancel 掉,否则线程结束的时候。调用Dialog 的 cancel 方法会抛异常。

2.Intent启动Activity有几种方式,怎样实现?

Intent启动Activity有两种方式,分别为显式意图,隐式意图
第一种。显示意图的实现。
Intent intent = new Intent(this,OtherActivity.class);  
startActivity(intent);  
显式意图还有第二种形式。
Intent intent = new Intent();  
ComponentName component = new ComponentName(this, OtherActivity.class);  
intent.setComponent(component);  
startActivity(intent);  
事实上这两种形式事实上是一样的,我们看一下Intent构造函数的代码

public Intent(Context packageContext, Class<?> cls) {  
        mComponent = new ComponentName(packageContext, cls);  
}  

这样我们就一目了然了,事实上我们常常使用的Intent的构造方法是另外一种方式的简化版
另外一种,是隐式意图的实现。
首先我们看一下隐式意图的调用方式
Intent intent = new Intent();
intent.setAction("other");
startActivity(intent);
隐式意图是通过setAction来进行区分究竟跳转到哪一个界面,那么我们肯定要在须要跳转的页面设置一标志。我们须要在AndroidManifest.xml中对这个进行设置
<activity android:name="com.example.lifecicledemo.OtherActivity" >
     <intent-filter>
         <action android:name="other" />

         <category android:name="android.intent.category.DEFAULT" />
     </intent-filter>
</activity>

这样当我们使用setAction的时候。就能够知道我们究竟是想跳转到哪一个页面了。


3.Android中获取图片有哪几种方式

方式一
Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
		img.setImageDrawable(drawable);
方式二
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
				R.drawable.ic_launcher);
img.setImageBitmap(bitmap);

方式三

AssetManager assetManager = getResources().getAssets();
try {
	InputStream is = assetManager.open("ic_launcher.png");
	Bitmap bitmap = BitmapFactory.decodeStream(is);
	img.setImageBitmap(bitmap);
} catch (IOException e) {
	e.printStackTrace();
}

方式四

AssetManager assetManager = getResources().getAssets();
try {
	InputStream is = assetManager.open("ic_launcher.png");
	Drawable drawable = Drawable.createFromStream(is, null);
	img.setImageDrawable(drawable);
} catch (IOException e) {
	e.printStackTrace();
}

1. ArrayList,Vector, LinkedList 的存储性能和特性

ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便添加和插入元素,它们都同意直接按 序号索引元素,可是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 因为使用了 synchroni zed 方法(线程安全),通常性能上较 ArrayList 差,而 LinkedList 使用双向链表实现存储,按序号索引数据须要进行前向或后 向遍历,可是插入数据时仅仅须要记录本项的前后项就可以,所以插入速度较快。

 

2.Collection 和 Collections 的差别

Collection 是集合类的上级接口,继承与他的接口主要有 Set 和 List. Collections 是针对集合类的一个帮助类。他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

3.HashMap 和 Hashtable 的差别

HashMap 是 Hashtable 的轻量级实现(非线程安全的实现)。他们都完毕了 Map 接口,主要差别在于 HashMap 同意空(null)键值(key),因为非线程安全,效率上可能高于 Hashtable。

HashMap 同意将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不同意。 

HashMap 把 Hashtable 的 contains 方法去掉了。改成 containsvalue 和 containsKey。由于 contains 方法easy让人引起误解。 Hashtable 继承自 Dictionary 类,而 HashMap 是 Java1.2 引进的 Map interface 的一个实现。 最大的不同是。Hashtable 的方法是 Synchronize 的。而 HashMap 不是,在多个线程訪问 Hashtable 时。不须要自己为它的 方法实现同步,而 HashMap 就必须为之提供外同步。
Hashtable 和 HashMap 採用的 hash/rehash 算法都大概一样。所以性能不会有非常大的差异。

 

4.sleep() 和 wait() 有什么差别

sleep 是线程类(Thread)的方法,导致此线程暂停运行指定时间,给运行机会给其它线程。可是监控状态依旧保持,到时 后会自己主动恢复。

调用 sleep 不会释放对象锁。

 

wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池。仅仅有针对此对象发 出 notify 方法(或 notifyAll)后本线程才进入对象锁定池准备获得对象锁进入执行状态。 

5.Overload 和 Override 的差别

Overloaded 的方法能否够改变返回值的类型?

方法的重写 Overriding 和重载 Overloading 是 Java 多态性的不同表现。

重写 Overriding 是父类与子类之间多态性的一种表现,重载 Overloading 是一个类中多态性的一种表现。假设在子类中定义某方法与其父类有同样的名称和參数,我们说该方法被重写 (Overriding)。子类的对象使用这种方法时,将调用子类中的定义。对它而言,父类中的定义如同被"屏蔽"了。假设在一个类 中定义了多个同名的方法,它们或有不同的參数个数或有不同的參数类型,则称为方法的重载(Overloading)。Overloaded 的 方法是能够改变返回值的类型。 

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

假设数据将在线程间共享。

比如正在写的数据以后可能被还有一个线程读到,或者正在读的数据可能已经被还有一个线程写过了。 那么这些数据就是共享数据,必须进行同步存取。

当应用程序在对象上调用了一个须要花费非常长时间来运行的方法,而且不希望让程序等待方法的返回时,就应该使用异步编程, 在非常多情况下採用异步途径往往更有效率。




posted @ 2017-07-05 09:18  jzdwajue  阅读(95)  评论(0编辑  收藏  举报