前阵子面试了一间公司,有好几道题android 的基础题比较模糊,这些题都比较基础,
但平时开发不怎么注意文字上的表达,感觉这些基础还是很重要的,毕竟是敲门砖,
所以今天就一些基础面试题做一下总结。
现在总结一下:
选择题:
1.对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行( D ) A、onPause() B、onCreate() C、 onResume() D、onStart()
这道题尤其重要,因为是众多公司面试时必考的题目,当然要确切地弄清楚为什么是onStart。(当然我个人觉得onResume()也可以)
-------------------------------------------------------- 分界线 -----------------------------------------------------
填空题:
android activity 的启动模式:
1.standard(系统默认)
标准启动模式,每次激活Activity时都会创建activity,并放入任务栈中
2.singletop
如果在任务的栈顶正好存在该Activity 的实例,就重用该实例,若不是就会创建新的实例并放入栈顶(即使栈中已经存在该Activity的实例,只要其不在栈顶,都会创建实例)
3.singleTask
如果在栈中已经有该Activity 实例,就重用该实例(会调用是咧的onNewIntent()).重用时,会让该实例回到栈顶,因此在它上面的实例回被移除出栈,如果栈中不存在该实例,则将会创建新的实例放入栈中。
4.singleInstance
在一个新栈中创建该Acitivity实例,并让多个应用共享该栈中的该Activity实例。
android 的存储方式:
1.sharepreference
其本质就是一个xml文件,常用于存储较简单的参数设置,一些静态的键值对。
2.FileOutputStream/FileinputStream:
文件输出/输入流,常用存储大量的数据,缺点更新困难。
3.sqlite
轻量级数据库,常用
4.ContentPriovider
内容提供者,使用应用程序数据共享
service 的启动方式:
startService
bindService
这几道题是比较基础的填空题,必须要懂,而且要懂得写。
-------------------------------------------------------- 分界线 -----------------------------------------------------
分析题:
handler Runnale MessageQueue 和 loop的关系
handler 用于处理 Runnale 和message,而它们和线程相关联,而一个线程与有且知有一个MessageQueue 和 一个loop。
Handler简介:
Handler有两个主要的用途:(1)确定在将来的某个时间点执行一个或者一些Message和Runnable对象。(2)在其他线程(不是Handler绑定线程)中排入一些要执行的动作。
handler 有几个方法是常用的:
post(Runnable):Runnable在handler绑定的线程上执行,也就是说不创建新线程。
sendMessage(Message):
MessageQueue简介:
这是一个包含message列表的底层类。Looper负责分发这些message。Messages并不是直接加到一个MessageQueue中,而是通过MessageQueue.IdleHandler关联到Looper。
你可以通过Looper.myQueue()从当前线程中获取MessageQueue。
Looper简介:
Looper类被用来执行一个线程中的message循环。默认情况,没有一个消息循环关联到线程。在线程中调用prepare()创建一个Looper,然后用loop()来处理messages,直到循环终止。
大多数和message loop的交互是通过Handler。
下面是一个典型的带有Looper的线程实现。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public voidhandleMessage(Message msg) {
// process incomingmessages here
}
};
Looper.loop();
}
}
这道题到现在我还模糊不清,好似懂又非懂,就略懂吧!求大神能简要的说明一下!
-------------------------------------------------------- 分界线 -----------------------------------------------------
编程题:
1.将图片放大和缩小:
package com.example.bigsmallimage;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
private Button bigbutton;
private Button smallButton;
private ImageView imageview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bigbutton = (Button) findViewById(R.id.button1);
smallButton = (Button) findViewById(R.id.button2);
imageview = (ImageView) findViewById(R.id.imageView1);
bigbutton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Bitmap dddsss = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_launcher);
big(dddsss);
}
});
smallButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Bitmap dddsss = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_launcher);
small(dddsss);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
private float width = 1;
private float height = 1;
private int id = 0;
public void small(Bitmap bitmap) {
int bitmapwidth = bitmap.getWidth();
int bitmapheight = bitmap.getHeight();
double scare = 0.8;
width = (float) (width * scare);
height = (float) (height * scare);
Matrix matrix = new Matrix();
matrix.postScale(width, height);
Bitmap caschbitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmapwidth,
bitmapheight, matrix, true);
imageview.setImageBitmap(caschbitmap);
}
public void big(Bitmap bitmap)
{
int bitmapwidth = bitmap.getWidth();
int bitmapheight = bitmap.getHeight();
double scare = 1.2;
width = (float) (width * scare);
height = (float) (height * scare);
Matrix matrix = new Matrix();
matrix.postScale(width, height);
Bitmap caschbitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmapwidth,
bitmapheight, matrix, true);
imageview.setImageBitmap(caschbitmap);
}
}
2.编写一个ProgressBar 进度条的实现:
package com.example.threadtest;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.app.Activity;
import android.app.ProgressDialog;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
public class MainActivity extends Activity {
private ProgressBar ProgressBar1;
private Button kaishibutton;
private Button zantingbutton;
private Handler mhandler;
private ProgressBar ProgressBar2;
private ProgressDialog ProgressDialog1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ProgressBar1 = (ProgressBar) findViewById(R.id.progressBar1);
kaishibutton = (Button) findViewById(R.id.kaishi);
zantingbutton = (Button) findViewById(R.id.zanting);
ProgressBar2 = new ProgressBar(this);
ProgressDialog1 = new ProgressDialog(this);
ProgressDialog1.show();
Thread thread1 = new Thread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ProgressDialog1.dismiss();
}
});
// thread1.start();
mhandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
System.out.println("---" + msg.what);
ProgressBar1.setProgress(msg.what);
super.handleMessage(msg);
}
};
kaishibutton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
mhandler.post(threadRunnable);
}
});
zantingbutton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
mhandler.removeCallbacks(threadRunnable);
}
});
}
Thread thread = new Thread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
ProgressDialog1.show();
try {
thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ProgressDialog1.dismiss();
}
});
int i = 0;
Runnable threadRunnable = new Runnable() {
public void run() {
// TODO Auto-generated method stub
i++;
try {
thread.sleep(50);
Message msg = new Message();
msg.what = i;
mhandler.sendMessage(msg);
mhandler.post(threadRunnable);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (i == 100) {
mhandler.removeCallbacks(threadRunnable);
}
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
代码题不说了,做了2个例子,真正面试时写出重点就行了,老实说程序员不怎么喜欢在纸上写代码吧(反正我不喜欢)
待会补充。。。。