android 面试题



前阵子面试了一间公司,有好几道题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个例子,真正面试时写出重点就行了,老实说程序员不怎么喜欢在纸上写代码吧(反正我不喜欢)

待会补充。。。。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值