1.Activity类中定义了7个回调方法,分别是什么?
我的答案:
- onCreate()这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作,比如说加载布局、绑定事件等。
- onStart()这个方法在活动由不可见变为可见的时候调用。
- onResume()这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行状态。
- onPause()这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗 CPU 的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。
- onStop()第一行代码——Android58这个方法在活动完全不可见的时候调用。它和 onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么 onPause()方法会得到执行,而 onStop()方法并不会执行。
- onDestroy()这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。
- onRestart()这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。以上七个方法中除了 onRestart()方法,其他都是两两相对的,从而又可以将活动分为三种生存期。
2.简述Activity的3种生存期。
我的答案:
- 完整生存期活动在 onCreate()方法和 onDestroy()方法之间所经历的,就是完整生存期。一般情况下,一个活动会在 onCreate()方法中完成各种初始化操作,而在 onDestroy()方法中完成释放内存的操作。
- 可见生存期活动在 onStart()方法和 onStop()方法之间所经历的,就是可见生存期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两个方法,合理地管理那些对用户可见的资源。比如在 onStart()方法中对资源进行加载,而在 onStop()方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。
- 前台生存期活动在 onResume()方法和 onPause()方法之间所经历的,就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行相互的,我们平时看到和接触最多的也这个状态下的活动。
3.活动在生命周期中最多中能有几种状态?
我的答案: 一个活动在其存在,也就是生命周期中一共存在四种状态: 1.运行:位于栈顶,系统最不愿意回收的活动。 2.暂停:不是栈顶的位置,但是在界面依旧可见,并不是每一个活动都占满整个屏幕,当系统内存比较低的时候会回收。 3.停止:不是栈顶的位置,完全不可见,仍然会存一些成员变量的内容,当其他 地方需要内存的时候会回收。 4.销毁:从返回栈中移除之后,系统最喜欢的就是回收这种活动。
4.Android应用程序的四大核心组件分别是什么?
我的答案: activity,service,content provider,broadcast receiver
5.分别总结出显式Intent与隐式Intent的使用方法?
我的答案: 创建隐式Intent的主要的方法: 1.初始带Action:Intent(String action) 2.空的Intent: Intent(); 3.初始同时带Action和Uri: Intent(String action, Uri uri); 创建显式Intent的主要的方法: 1.创建方法。Intent intent = newIntent(Context context,Class<?> class); 2.创建方法。Intent intent = newIntent(Context context,Class<?> class);
6.Intent传递数据有两种方法?
我的答案: 一:使用putExtra() (1)开始传递:FirstActivity.java (2)接收数据:SecondActivity.java (3)传递结果: 二:使用bundle传递数据 (1)开始传递:FirstActivity.java (2)接收数据:SecondActivity.java (3)结果显示:
7.简述Serializable传递对象的步骤。
我的答案: 实现序列化(保存到一个文件)的步骤 1.Make a FileOutputStream FileOutputStream fs = new FileOutputStream(“foo.ser”); 2.Make a ObjectOutputStream ObjectOutputStream os = new ObjectOutputStream(fs); 39write the object os.writeObject(myObject1); 4.close the ObjectOutputStream os.close();
8.简述活动的四种启动模式。
我的答案: 活动(activity)的四种启动模式 1.standard模式 它是活动默认的启动模式,在不进行显示制定的情况下,所有活动都会自动使用这种启动模式。每次通过此模式来启动activity时,android总会为目标activity启动一个新的实例。 2.singleTop模式 它和standard模式有点类似,但是又一点是不同的:此模式下当将要被启动的activity已经位于Task栈顶时,系统不会重新创建目标activity实例,而是复用已有的activity实例。 如果将要被启动的activity没有位于Task栈顶时,此时系统会重新创建目标activity的实例,并将它加载到Task栈顶上。 3.singleTask模式 使用这种加载模式的activity在同一个Task内只有一个实例,当系统采用此singleTask模式启动activity时,可以分为三种情况: <1> 如果将要启动的activity不存在,系统将会创建目标activity实例,并将它加入到Task栈顶。 <2> 如果将要启动的activity已经位于Task栈顶,此时与singleTop模式的行为相同。 <3> 如果将要启动的activity已经存在,但没有位于Task栈顶,系统将会把位于该activity上面的所有activity移出Task栈,从而使得目标activity转入栈顶。 4.singleInstance模式 此加载模式下,无论从哪个Task中启动目标activity,只会创建一个目标activity实例,并会使用一个全新的Task栈来装载该activity实例。当系统采用singleInstance模式启动activity时,可以分为两种情况: <1> 如果将要启动的activity不存在,系统会先创建一个全新的Task、再创建目标activity的实例,并将它加入新的Task的栈顶。 <2> 如果将要启动的activity已经存在,无论它位于哪个应用程序中,无论它位于哪个Task中,系统将会把该activity所在的Task转到前台,从而使用该activity显示出来。 tips:需要指出的是,采用singleInstance模式加载activity总是位于Task栈顶,采用singleInstance模式加载activity所在Task只包含该activity。
9.什么是程序、进程、线程?
我的答案: 程序(program)是实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。为实现预期目的而进行的操作的一系列语句和指令。一般分为系统程序和应用程序量大类。计算机中的程序在港澳台地区称为程式。程序就是为使用电子计算机执行一个或多个操作,或执行某一任务,按序设计的计算机指令集合。 进程(有时被称为重量级进程)是程序的一次执行任务。每一个进程都有自己的地址空间、内存、数据栈以及其它记录器运行轨迹的辅助数据。操作系统管理子其运行的所有进程,并为这些进程公平地分配时间。 不过各个进程都有自己的内存空间,数据栈等,所以只能使用进程间通讯(IPC),而不能直接共享信息。 线程,有时被称为轻量级进程(lightweight process,LWP)是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其他吸纳成共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。每一个程序都至少有一个线程,那就是线程本身。
10.Android进程,按照优先顺序排列,分为哪几类?
我的答案: Andrid 5个进程及重要优先级 前台进程>可见进程>服务进程>后台进程>空进程, 它们的回收优先级则反之
11.对Android线程的理解?
我的答案: 在日常项目中比较常用的多线程操作主要有: 1.Handler
2.AsyncTask
3.IntentService
一:handler的理解 优点:对于对后台任务时,简单清晰 缺点:对于操作单个后台任务,代码过于繁琐 具体操作: 在主线程中创建Handler对象并实现handlmessage()方法, 创建runnable线程,先在线程中执行耗时操作, 开启一个线程会相应的产生一个looper,在初始化looper的时候会创建一个消息队列MessageQueue(); 执行完耗时操作,通过handler将消息发送到消息队列中、、looper轮询消息队列将消息取出来交给Handler, Handler接收到取出来的消息,并根据消息类型做出相应的处理
二:AsyncTask的理解 优点:操作简单方便,过程可控 缺点:对于多异步操作更新UI会变得很繁琐 具体操作: onPreExecute()运行在主线程中,开启线程前的准备操作, doInBackground()运行在子线程中, onPreExecute()之后的操作,用于处理耗时操作,通过调用publishProcess()向 onProcessUpdata()推送消息 onProcessUpdata()运行在主线程中,当调用 publishProcess()方法时就会开启此方法,接收到推送过来的数据,更新UI进度页面 onPostExecute()运行在主线程中,当子线程耗时操作执行完毕后会调用此方法, doInBackground()返回的参数传递到这里来用于更新UI 调用execute()方法开启AsyncTask,类似runnable的start()方法
三:IntentService的理解 IntentService和普通的Service区别在于,IntentService在oncreate()方法中单独开启一个线程用于耗时操作 通过onHandleIntent(Intent intent)方法来处理耗时操作 在耗时操作执行完毕之后,会自动关闭service不用手动关闭 如果同时new出多个IntentService对象进行耗时操作,oncreate()和ondestory()方法会执行一次,onstart()、onstartcommand()、onHandleIntent()会执行多次。 执行完毕自动关闭service
12.什么是服务。
我的答案: Service是一个应用组件,它用来在后台完成一个时间跨度比较大的工作,且没有关联任何界面。(生命周期在应用程序进程的主线程运行) 一个Service可以完成的工作:访问网络(在Service中启动分线程)、播放音乐、文件IO操作、大数据量的数据库操作等。如果需要在Service中处理一些网络连接等耗时的操作,那么应该将这些任务放在分线程中处理,避免在主线程中阻塞用户界面。 特点:Service在后台运行,不用与用户进行交互。即使应用退出,服务也不会停止。当应用进程被杀死时(例如一键清理),服务便会停止。
13.本地服务与远程服务的优缺点各是什么?
我的答案: 其实都是服务,提供的功能一致,只是一个在本地,一个在其它进程。 本地服务 --local service:服务运行在当前的应用程序里面 远程服务 --remote service:服务运行在其他的应用程序里面
14.如何实现本地服务绑定方式的启动与停止?
我的答案: 服务(Service)的停止和启动
1 .如果service是非绑定的,最终当任务完成时,为了节省系统资源,一定要停止service,可以通过stopSelf()来停止,也可以在其他组件中通过stopService()来停止。 绑定的service可以通过onUnBind()来停止service。
- 有了 Service 类我们如何启动他呢,有两种方法:
•Context.startService() •Context.bindService()
- 在同一个应用任何地方调用startService() 方法就能启动Service 了,然后系统会回调Service 类的 onCreate() 以及 onStartCommand() 方法。这样启动的Service 会一直运行在后台,直到Context.stopService() 或者 StopSelf() 方法被调用。另外如果一个Service 已经被启动,其他代码再试图调用startService() 方法,是不会执行onCreate() 的,但会重新执行一次onStartCommand() 。
- 另外一种 bindService() 方法的意思是,把这个Service 和调用 Service 的客户类绑起来,如果调用这个客户类被销毁,Service 也会被销毁。用这个方法的一个好处是,bindService() 方法执行后 Service 会回调上边提到的 onBind() 方法你可以从这里返回一个实现了 IBind 接口的类,在客户端操作这个类就能和这个服务通信了,比如得到 Service 运行的状态或其他操作。如果 Service 还没有运行,使用这个方法启动 Service 就会 onCreate() 方法而不会调用 的onStartCommand()。
15.简述服务的生命周期。我的答案:
1.Call to startService()-----onCreate()-----onStartCommand()-----Service running----(The service is stopped by itself or a client)-----onDestory() 2.Call to bindService()-----onCreate()-----onBind()-----Clients are bounding to service ----(All clients all unbind by calling unbindService)-----onUnBind()----onDestory()
16.简述广播的两种类型。
我的答案: 无序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,并且是没有先后顺序(同时收到)
有序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,但是会按照广播接收者的优先级来决定接收的先后顺序
17.广播的注册方式有哪几种?如何实现?请作一说明。
我的答案: 首先写一个类要继承BroadcastReceiver 第一种:在清单文件中声明,添加 <action android:name=‘android.provider.Telephony.SMS_RECEIVED’) 第二种使用代码进行注册如: IntentFilter filter = new IntentFilter(‘android.provider.Telephony.SMS_RECEIVED’); IncomingSMSReceiver receiver = new IncomgSMSReceiver(); registerReceiver(receiver.filter); 两种注册类型的区别是: 1)第二种不是常驻型广播,也就是说广播跟随程序的生命周期。 2)第一种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
18.Android系统的数据存储方式有哪几种?
我的答案: Android系统有五种数据存储形式,分别是文件存储、SP存储、数据库存储、contentprovider 内容提供者、网络存储。
19.SharedPreferences与普通内存文件存取数据有什么不同?
我的答案: 不同于文件的存储方式,SharedPreferences 是使用键值对的方式来存储数据的。也就是说当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把相应的值取出来。而且SharedPreferences 还支持多种不同的数据类型存储,如果存储的数据类型是整型,那么读取出来的数据也是整型的,存储的数据是一个字符串,读取出来的数据仍然是字符串。
20.SQLite数据库有哪些特点?
我的答案: SQLite的主要特征: 1). 管理简单,甚至可以认为无需管理。 2). 操作方便,SQLite生成的数据库文件可以在各个平台无缝移植。 3). 可以非常方便的以多种形式嵌入到其他应用程序中,如静态库、动态库等。 4). 易于维护。 综上所述,SQLite的主要优势在于灵巧、快速和可靠性高。SQLite的设计者们为了达到这一目标,在功能上作出了很多关键性的取舍,与此同时,也失去了一些对RDBMS关键性功能的支持,如高并发、细粒度访问控制(如行级锁)、丰富的内置函数、存储过程和复杂的SQL语句等。正是因为这些功能的牺牲才换来了简单,而简单又换来了高效性和高可靠性。
21.在SQLite数据库中如何创建数据表?
我的答案: 导入SQLite驱动: import sqlite3 连接到SQLite数据库 数据库文件是score.db 如果文件不存在,会自动在当前目录创建: conn=sqlite3.connect(“score.db”) 创建一个Cursor: cursor=conn.cursor() 执行一条SQL语句,创建score表: cursor.execute(‘create table score(id varchar(20) primary key, name varchar(20), st_score varchar(40))’) 继续执行一条SQL语句,插入一条记录: cursor.execute(‘insert into score(id,name,st_score) values (‘1’,‘Jack’,‘89’)’) 提交事务: conn.commit()
22.简述ContentProvider的工作原理。
我的答案: 1.系统管理类app,比如手机助手,有机会频繁使用ContentProvider 2.通讯录或者短信数据,是以ContentProvider的形式提供的 3.ContentProvider的本质是把数据存储在SQLit数据库中 4.ContentProvider读取数据使用了匿名共享内存(ASM),ASM实质上也是个Binder通信
23.平面图形的绘制有哪两种?
我的答案: 1.绘制几何图形 圆,弧,椭圆,矩形,点,三角形等。 Paint paint= new Paint(); paint.setColor(Color.YELLOW); //设置画笔 canvas.drawCircle(x, y, r, paint); //绘制圆形
2.绘制文字 drawText(String text, float x, float y, paint); //在指定的起始位置绘制文字 drawPosText(String text, float[]pos, paint ); //在指定位置数组,每组数据对应1个字的文字
3.绘制路径-Path类 addArc(xxx); //添加弧形路径 addCircle(x, y, r, dir); //添加圆形路径 moveTo(x, y); //移动到起点 close(); //闭合路径
canvas将路径绘制在画布上: canvas.drawPath(path, paint); //绘制路径 canvas.drawTextOnPath(string, path, hOffset, vOffset, paint); //绘制路径文字
4.绘制图片 drawBitmap(Bitmap source, Rect1, Rect2, paint); //从源位图挖取一块 drawBitmap(Bitmap source, x, y, paint); //从指定点绘制位图 // ImageView iv=findViewById(R.id.iv1); BitmapDrawable b=(BitmapDrawable) iv.getDrawable(); if(b!=null&&!b.getBitmap().isRecycled()){ //销毁资源 b.getBitmap().recycle(); }
5.其它: invalidate()触发onDraw()方法进行绘制。 context.getResources().getDisplayMetrics().widthPixels; //获取屏幕的宽度 触摸时间处理: ACTION_DOWN: path.moveTo(x, y) //移动到起始点 ACTION_MOVE: path.quadTo(x1, y1, x2, y2) //跟随路径. ACTION_UP: canvas.drawPath(path, paint); path.reset(); //绘制路径 将图片保存到文件中(png格式): FileOutputStream os=new FileOutputStream(file); //创建流 bitmap.compress(Bitmap.CompressFormat.PNG, 100, os); //定义格式,输出流 os.flush(); //写文件
6.使用选项菜单 @Override public boolean onCreateOptionsMenu(Menu menu){ MenuInflater inflater=new MenuInflater(this); //实例化MenuInflater对象 inflater.inflate(R.menu.toolsMenu, menu); //解析菜单文件 return super.onCreateOptionsMenu(menu); }
@Override public boolean onOptionsItemSelected(MenuItem item){ //菜单项被选择时,作相应的处理 }
24.简述MediaPlayer播放音频的基本步骤。
我的答案: MediaPlayer mp = new MediaPlayer();(1) //创建一个播放器
mp.setDataSource(“rtsp://10.0.149.217:554/stream1”); (2)//参数指定路径或url
mp.prepare(); (3)
mp.start(); (4)
25.调用摄像头拍照如何申请权限?
我的答案:
代码语言:javascript复制<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- 摄像头权限 -->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!-- 在SDCard中创建与删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 在SDCard读取数据的权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<uses-feature
android:name="android.hardware.Camera"
android:required="false" />
26.WebView组件的功能是什么?如何使用它加载网页?
我的答案: WebView可以用来展示网页,并且与网页进行交互,加载网页的四种方式1.loadUrl(String url) 2.loadUrl(Strig url,Map<String,String> additionalHttpHeaders) 3.loadData(String data,String mimeType,String encoding) 4.loadDataWithBaseURL(String baseUrl,String data,String data,String mimeType,String encoding,String historyUrl)
27.HttpURLConnection请求的GET和POST方法有什么区别?
我的答案: GET是从服务器上获取数据,POST是向服务器传送数据。 在客户端,GET方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放在HTML HEADER内提交。 对于GET方式,服务器端用Request.QueryString获取变量的值,对于POST方式,服务器用Request.Form获取提交的数据。 GET方式提交的数据不能大于2KB(主要是URL长度限制),而POST则没有此限制。 安全性问题。正如2中提到,使用GET的时候,参数会显示在地址栏上,而POST不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用GET;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用POST为好。
28.如何实现本地服务普通方式(非绑定)方式的启动与停止?
我的答案: 通常有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。 1.通过startService Service会经历 onCreate 到onStart,然后处于运行状态,stopService的时候调用onDestroy方法。 如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。 2.通过bindService Service会运行onCreate,然后是调用onBind, 这个时候调用者和Service绑定在一起。调用者退出了,Srevice就会调用onUnbind->onDestroyed方法。 所谓绑定在一起就共存亡了。调用者也可以通过调用unbindService方法来停止服务,这时候Srevice就会调用onUnbind->onDestroyed方法。