android面试题集

来源:互联网 发布:c 语言中cost 编辑:程序博客网 时间:2024/05/16 22:10
  1. 了解Android系统架构 
  1. 应用层: Java 应用开发工程师开发的所有应用程序比如地图,浏览器,QQ等属于该层, 手机中的短信,拨号,浏览器等这些应用程序都是可以被开发人员开发的其他应用程序所替换, 这点不同于其他手机操作系统固化在系统内部的系统软件,更加灵活和个性化 应用框架层: Java framework层源码 OS定制开发 为应用层开发人员提供API 系统运行库层: C语言 包括C语言标准库,多媒体库,OpenGL ES, SQLite, Webkit,Dalvik虚拟机等, 该层是对应用框架层提供支持的层, Java访问硬件需通过NDK实现 Linux内核层: Android是基于Linux2.6内核,其核心系统服务如安全性、内存管理、进程管理、网路协议以及驱动模型都依赖于Linux内核

DVM与JVM区别
http://yxwang0615.iteye.com/blog/947245
区别一:dvm执行的是.dex格式文件 jvm执行的是.class文件 android程序编译完之后生产.class文件,然后,dex工具会把.class文件处理成.dex文件,然后把资源文件和.dex文件等打包成.apk文件。apk就是android package的意思。 jvm执行的是.class文件。
区别二:dvm是基于寄存器的虚拟机 而jvm执行是基于虚拟栈的虚拟机。寄存器存取速度比栈快的多,dvm可以根据硬件实现最大的优化,比较适合移动设备。
区别三:.class文件存在很多的冗余信息,dex工具会去除冗余信息,并把所有的.class文件整合到.dex文件中。减少了I/O操作,提高了类的查找速度

  1. 掌握如何搭建Android开发环境
  1. 需准备的工具与开发包(32位/64位, Windows/Linux) : JDK eclipse ADT SDK 1) 安装JDK 配置环境变量(bin) 2) 安装eclipse 3) eclipse安装ADT插件---离线安装
    4) eclipse指定SDK目录 5) 配置SDK 环境变量(toots , platform-tools) 注: Linux常用操作系统: Red Hat, Ubuntu
  1. 掌握Android项目目录结构 
  1. 1.src目录: src(即Source Code),src目录用来存放应用程序中所有的源代码,代码的源文件一般存放在该目录下的相应的包下。 2.gen目录:gen目录,该目录下一般只有一个 文件,即R文件。该文件夹下面有个R.java文件,R.java是在建立项目时自动生成的,定义该项目所有资源的索引。 3.Android4.1目录:该文件夹下包含android.jar文件,这是一个Java归档文件,其中包含构建应用程序所需的所有的Android SDK库(如Views、Controls)和APIs。 通过android.jar将自己的应用程序绑定到Android SDK和Android Emulator,这允许你使用所有Android的库和包,且使你的应用程序在适当的环境中调试。 4.assets目录: 该目录存放应用程序中使用的外部资源文件,如声音 视频等,在Android程序中可以通过输入/输出流对该目录中的文件进行读写。 5.res目录: 该目录用来存放程序这用到的图片、界面布局文件及XML格式的描述文件。该目录下有多个目录。新建一个Android项目,在res目录下一般 会有 drawable,layout,valuse三个目录。drawable用来存放图片资源,目录下一般会有三个目录分别存放高中低三种不同分辨率的图片,layout目录用来存放应用程序的 界面布局文件,values目录下存放字符串资源,颜色资源,数组资源等XML文件。 6.AndroidManifest.xml
  1. Android中asset文件夹和raw文件夹区别? 
  1. 答:res/raw和assets的相同点: 两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。 res/raw和assets的不同点: 1)res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即 R.raw.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。 2)res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹 3)读取文件资源举例: 读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作 InputStream is = getResources().openRawResource(R.raw.filename); 读取assets下的文件资源,通过以下方式获取输入流来进行写操作 AssetManager am = null; am = getAssets(); InputStream is = am.open("filename");
  1. 掌握AndroidManifest.xml结构(应用程序入口)
  1.  AndroidManifest.xml 是每个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities,services, 等等),他们各自的实现类,各种能被处理 的数据和启动位置。 除了能声明程序中的Activities, ContentProviders, Services,和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试) AndroidManifest.xml结构 Android程序入口: action节点中的android.intent.action.MAIN表明它所在的Activity是整个应用程序的入口点
  1. 掌握模拟器的使用以及常用adb命令 
  1. adb devices查看当前连接设备
  2. adb kill-server 终止adb进程
  3. adb start-server 启动adb进程
  4. adb shell 进入shell模式(Linux模式),当连接有多个设备时,需执行命令 adb -s 设备名 shell 注: 进入shell模式后序执行Linux命令
  5. adb install apk路径 安装apk至设备,当连接有多个设备时,需执行命令 adb -s 设备名 install apk路径 当设备之前装有次apk时,替换安装序执行命令 adb install -r apk路径
  6. adb uninstall 要卸载的应用包名 卸载已安装的应用
  7. adb push 要拷贝的文件路径 设备上存放次文件的路径 将文件拷贝至设备sdcard,如 adb push F:Android授课资料项目实训1205Aapkcom.moluo.android_100111.apk /sdcard
  8. adb pull 设备上文件路径 电脑存放文件路径 将文件从设备拷贝到电脑, 如 adb pull /sdcard/com.moluo.android_100111.apk E:/
  9. adb logcat 命令行的方式查看日志 若希望将日志保存至某文件, adb logcat -> E:/test.txt
  10. android list avd 查看当前创建的所有模拟器列表
  11. emulator @模拟器名字 启动某个模拟器
  12. 命令行操作数据库 adb shell cd data/data cd package cd databases /cd shared_prefs/ cd files sqlite3 test.db >.tables 即可执行响应sql语句
  1. 掌握Activity的生命周期及各方法调用时机 
  1. 答:共有七个周期函数: void onCreate(Bundle savedInstanceState) 第一次创建时调用 void onStart() 被用户可见时调用 void onRestart() 当Activity处于stop状态又被重新启动时调用 void onResume() 当获得焦点即可与用户交互时调用 void onPause() 当失去焦点时调用 void onStop() 当不可见时调用 void onDestroy() 当销毁时调用 Activity A---> Activity B, B将A完全覆盖时生命周期调用流程: onPause(A) --> onCreate(B) --> onStart(B) --> onResume(B) --> onStop(A) 此时按"Back"按键,证明周期调用流程 onPause(B) --> onRestart(A) --> onStart(A) -->onResume(A) --> onStop(B) --> onDestroy(B) 
  1. 屏幕方向发生改变时如何生命周期 ? Android的5个进程等级?
  1. Activity四种启动模式 
  1. 在AndroidManifest.xml清单文件中的标签中通过android:launchMode设置Activity启动模式 standard 默认值, 表示在startActivity时即创建其实例 singleTop 首先检查栈顶是否有该Activity实例,有责返回,无责创建其实例 singleTask 检查整个堆栈有无该Activity实例,有责返回,无责创建其实例 singleInstance 单实例模式, 一个Activity实例独享一个任务堆栈, 并且只能有一个堆栈中有该Activity的实例
  1. AndroidManifest.xml清单文件标签中属性android:excludeFromRecents="true" android:screenOrientation="portrait" android:configChanges="orientation|locale"的含义
  1.  答: android:excludeFromRecents表示是否可被显示在最近打开的activity列表里,true表示否,false表示是 android:screenOrientation表示activity显示的模式, 一般用来设置activity横屏显示(horizontal)或竖屏显示(portrait) android:configChanges=[oneormoreof:"mcc""mnc""locale""touchscreen""keyboard""keyboardHidden""navigation""orientation""fontScale"] 是当所指定属性(Configuration Changes)发生改变时,通知程序调用 onConfigurationChanged()函数,比如orientation屏幕方向发生改变,locale语言环境发生改变时
  1. 如何将一个Activity设置成窗口的样式
  1.  答:在清单文件AndroidManifest.xml中相应的标签内设置属性android:theme=”@android:style/Theme.Dialog”
  1. Activity的 onSaveInstanceState() 和 onRestoreInstanceState() 
  1. 答: Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。 另外,当屏幕的方向发生了改变, Activity会被摧毁并且被重新创建,如果你想在Activity被摧毁前缓存一些数据,并且在Activity被重新创建后恢复缓存的数据。可以重写Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法。
  2. 列举Android中各种UI特效
    答: 两个Activity切换时动画设置: startActivity之后调用overridePendingTransition(int enterAnim, intexitAnim)
    Fragment切换时动画效果
    图片轮播效果: 通过Gallery配合Timer定时器实现
    瀑布流效果:
    & 侧滑菜单:
    CoverFlow:
    Path菜单:
    & 关键字飞入飞出效果:
    翻页效果:
    ViewPager:
    Fragment:
    自定义Tabhost:
    发表评论图文混排:

  3. 自定义组件的实现思路
    答: Android自定义组件有三种实现思路:
    1) 继承某个现有组件,在其基础上添加额外功能,如继承Gallery实现CoverFlow效果
    2) 复合型组件定义: 继承某个Layout,实现复合组件自定义,如TextView和EditText组合实现登录注册组件
    3) 继承View,实现onDraw()方法,实现自己绘制组件,如翻页效果组件

  4. 谈谈UI中, Padding和Margin有什么区别,gravity与layout_gravity的区别
    答:Padding 用来指定组件内的内容距离组件边界的距离;
    Margin用来指定控件与控件之间的距离
    Gravity用来指定组件内的内容相对于组件本身的位置
    Layout_gravity用来指定组件相对于其父组件的位置

  5. 哪个组件可以实现手风琴效果,用来实现设置界面的类,实现抽屉效果, 悬浮窗口?
    答:实现手风琴效果(ExpandableListView)
    设置界面的类(PreferenceActivity)保存到sharedpreference中
    抽屉效果(slidingDrawer)组件
    悬浮窗口: PopWindow,可以实现类似Dialog和菜单的效果

  6. listview优化策略?
    答:1)、自定义Adapter的getView(), 对convetView进行判空,是当convertView不为空的时候直接重新使用convertView
    从而减少了很多不必要的View的创建
    2)定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可
    3)、当ListView加载数据量较大时可以采用分页加载和图片异步加载

17.ListView分页加载实现思路?
通常实现分页加载有两种方式,一种是在ListView底部设置一个按钮,用户点击即加载。另一种是当用户滑动到底部时自动加载。
在ListView底部设置一个按钮,用户点击即加载实现思路:
// 加上底部View,注意要放在setAdapter方法前

ListView.addFooterView(moreView);bt.setOnClickListener(new OnClickListener() {@Override        public void onClick(View v) {            pg.setVisibility(View.VISIBLE);// 将进度条可见            bt.setVisibility(View.GONE);// 按钮不可见             handler.postDelayed(new Runnable() {                 @Override                public void run() {                    loadMoreDate();// 加载更多数据                    bt.setVisibility(View.VISIBLE);                    pg.setVisibility(View.GONE);                    mSimpleAdapter.notifyDataSetChanged();// 通知listView刷新数据                }             }, 2000);        }    }); 

19.view有哪几种更新方式当用户滑动到底部时自动加载实现思路:
实现OnScrollListener 接口重写onScrollStateChanged 和onScroll方法,使用onscroll方法实现”滑动“后处理检查是否还有新的记录,如果有,添加记录到adapter, adapter调用 notifyDataSetChanged 更新数据;如果没有记录了,则不再加载数据。使用onScrollStateChanged可以检测是否滚到最后一行且停止滚动然后执行加载.
18.ListView图片异步加载实现思路?
1.先从内存缓存中获取图片显示(内存缓冲)
2.获取不到的话从SD卡里获取(SD卡缓冲,,从SD卡获取图片是放在子线程里执行的,否则快速滑屏的话会不够流畅)
3.都获取不到的话从网络下载图片并保存到SD卡同时加入内存并显示(视情况看是否要显示)

答: 在主线程(UI线程)可以直接调用View.invalidate() ; 在子线程需要更新UI可以直接调用View.postInvalidate(),也可以通过Handler发送消息给主线程,然后在handleMessage方法中通过View.invalidate() 更新UI;还可以在子线程中需要更新UI的时候调用runOnUIThread(Runnable )方法,然后在此方法中更新UI,同时可以使用AsyncTask异步任务, 在doInBackground执行耗时操作, 然后在onPostExcute方法中执行刷新UI动作

20. Intent的原理,作用,可以传递哪些类型的参数?
答:intent是连接Activity, Service, BroadcastReceiver, ContentProvider四大组件的信使,,可以传递八种基本数据类型以及string, Bundle类型,以及实现了Serializable或者Parcelable的类型。
Intent可以划分成显式意图和隐式意图。
显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

21.Android的四大组件是什么?它们的作用是什么?
答:Android有四大组件:Activity、Service、Broadcast Receiver、Content Provider。
Activity :应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。
Service 服务:一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。
BroadcastReceive广播接收器:你的应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息。
Content Provider内容提供者 :主要用于多个应用间数据共享。这些数据可以存储在文件系统中或SQLite数据库。

  1. 描述下Service的生命周期,Service有哪些启动方法,有什么区别,怎样停用Service?
  1.  http://blog.csdn.net/huanyufeng/article/details/5873407 答:Service的生命周期:onCreate, onStartCommand, onDestroy,onBind和onUnbind。 通常有两种方式启动一个Service,它们对Service生命周期的影响是不一样的。 1) 通过context.startService() onCreate-->onStartCommand-->onDestroy Service会经历 onCreate 到 onStartCommand ,然后处于运行状态,stopService的时候调用onDestroy方法。 如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。 如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行 onStartCommand ()方法。 2) 通过context.bindService() onCreate--> onBind--->onUnbind-->onDestroy Service会运行onCreate,然后是调用onBind,这个时候调用者和Service绑定在一起。调用者退出了,Srevice就会调用onUnbind->onDestroyed方法。 所谓绑定在一起就共存亡了。调用者也可以通过调用unbindService方法来停止服务,这时候Srevice就会调用onUnbind->onDestroyed方法。 注: onStartCommand()有四种返回值: http://wenku.baidu.com/view/0c2b1af8910ef12d2af9e7b5.html START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。 START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统将会把它置为started状态,系统不会自动重启该服务,直到startService(Intent intent)方法再次被调用;。 START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。 START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

  1. AIDL的全称是什么?有什么样的功能? 
  2. 答: AIDL全称: Android interface definition language(android接口定义语言) , 功能: 用来跨进程的访问方法,即访问远程服务的方法 http://blog.csdn.net/stonecao/article/details/6425019 aidl实现的步骤 aidl可以传递的数据类型 
  3. 24.如何防止Android应用中的Service被系统回收? 
  4. <方案一>: 通过设置setForeground()提升Service优先级,将其设置为前台进程 或者通过在清单文件中标签内通过设置android:priority="1000",提升其优先级 
  5. <方案二>: 在startCommand()方法中返回START_STICKY或START_REDELIVER_INTENT则Service销毁之后会重启
  6. 25.Service是否运行在主线程,Service与Activity是否运行在同一个线程? Service与Activity与BroadcastReceiver同样都运行在UI主线程, 如果有耗时操作都会引发ANR问题
  7. 26.IntentService的用法 
  8. http://android.blog.51cto.com/268543/528166 http://blog.csdn.net/zhf198909/article/details/6906786 是Service的子类,主要用来解决在Service中处理耗时操作. IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请 求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程
  9. 注册广播有几种方式,这些方式有什么特点和区别? 
  10. 答: 第一种:在清单文件中声明,添加 第二种使用代码进行注册如: IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); IncomingSMSReceiver receiver = new IncomgSMSReceiver(); registerReceiver(receiver.filter); 两种注册类型的区别是: 1)第二种不是常驻型广播,也就是说广播跟随程序的生命周期。 2)第一种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

28.广播的发送方式有哪些
sendBroadcast(),sendOrderedBroadcast()和sendStickyBroadcast()三种
sendBroadcast()这个方法的广播是能够发送给所有广播接收者,按照注册的先后顺序,如果你这个时候设置了广播接收者的优先级,优先级如果恰好与注册顺序相同,则不会有任何问题,如果顺序不一样,会出leaked IntentReceiver 这样的异常,并且在前面的广播接收者不能调用abortBroadcast()方法将其终止,如果调用会出BroadcastReceiver trying to return result during a non-ordered broadcast的异常,当然,先接收到广播的receiver可以修改广播数据。
sendOrderedBroadcast()方法顾名思义就是priority的属性能起作用,并且在队列前面的receiver可以随时终止广播的发送。还有这个api能指定final的receiver,这个receiver是最后一个接收广播时间的receiver,并且一定会接收到广播事件,是不能被前面的receiver拦截的。实际做实验的情况是这样的,假设我有3个receiver依序排列,并且sendOrderedBroadcast()方法指定了一个finalReceiver,那么intent传递给这4个Receiver的顺序为Receiver1-->finalReceiver-->Receiver2-->finalReceiver-->Receiver3-->finalReceiver。这个特性可以用来统计系统中能监听某种广播的Receiver的数目。
sendStickyBroadcast()字面意思是发送粘性的广播,使用这个api需要权限android.Manifest.permission.BROADCAST_STICKY,粘性广播的特点是Intent会一直保留到广播事件结束,而这种广播也没有所谓的10秒限制,10秒限制是指普通的广播如果onReceive方法执行时间太长,超过10秒的时候系统会将这个广播置为可以干掉的candidate,一旦系统资源不够的时候,就会干掉这个广播而让它不执行。
注: (下面是广播接收者的生命周期以及一些细节部分:
1.广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
2.广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框
3.最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉
4.耗时的较长的工作最好放在服务中完成)

29.简述Android中的IPC机制(进程间的通信机制) IPC(Inter-Process Communication,进程间通信).
由于android系统中应用程序之间不能共享内存。在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service。其中Activity可以跨进程调用其他应用程序的Activity;Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播;Service和Content Provider类似,也可以访问其他应用程序中的数据,但不同的是,Content Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。
aidl是 Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口.编译器可以通过扩展名为aidl的文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的.

30.什么是ANR 如何避免它?(Android线程间的通信方式? )
答:ANR:Application Not Responding(应用程序无响应).当出现下列情况时,Android就会显示ANR对话框了: 对输入事件(如按键、触摸屏事件)的响应超过5秒 意向接受器(intentReceiver)超过10秒钟仍未执行完毕Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。
解决方案有两种:
1. AsyncTask异步任务中,doInBackground()和onPostExecute(Result)两个方法非常重要
doInBackground() 这个方法运行在后台线程中,主要负责执行那些很耗时的操作,如移动护理系统中的网络连接、解析XML等操作。该方法必须重载。
onPostExecute(Result) 这个方法也运行于UI线程,在doInBackground(Params…)方法执行后调用,该方法用于处理后台任务执行后返回的结果。
2. 子thread + handler

  1. Handler的运行机制(运行原理)(Handler,Looper,MessageQueue,Message,Thread之间的关系)
    一个Handler允许你发送和处理Message和Runable对象,每个线程都有自己的Looper,每个Looper中封装着MessageQueue。Looper负责不断的从自己的消息队列里取出队头的任务或消息执行。每个handler也和线程关联,Handler负责把Message和Runable对象传递给MessageQueue(用到post ,sendMessage等方法),而且在这些对象离开MessageQueue时,Handler负责执行他们(用到handleMessage方法)。
    其中Message类就是定义了一个信息,这个信息中包含一个描述符和任意的数据对象,这个信息被用来传递给Handler.Message对象提供额外的两个int域和一个Object域。

  2. AsyncTask的主要方法有哪些?如何启动和停止AsyncTask?如何在AsyncTask中更新UI
    答: AsyncTask的主要方法有doInBackGround() 运行在后台子线程,执行耗时操作
    onPostExcute() 运行在UI主线程,用于执行刷新UI的代码
    启动通过execute()方法
    停止通过cancel(boolean flag)方法取消执行, 传入参数ture表示如果调用方法时异步任务正在执行则打断执行并取消, 如果传false表示执行完毕再取消
    刷新UI的代码一般卸载onPostExcute()方法中
    33.Android中的五种存储方式及其应用场景
    答:1)SharedPreferences

    存储路径:(data/data/packagename/shares_prefs), 轻量级存储,以键值对的形式存储在xml中,一般用来保存应用中的设置属性
    2)文件存储 SD卡存储多媒体文件, 文件缓存
    3) Sqlite数据库 嵌入式存储, 存储路径:(data/data/packagename/databases), 一种嵌入式数据库,支持sql语言,存储大量结构性数据
    4)ContentProvider 进程(应用程序)间数据共享,数据源可以是sqlite,也可以是xml,相关类: ContentResolver(内容解析器), ContentObserver(
    数据观察者)
    5) 网络存储 天气数据的xml,json格式等等,通过HttpUrlConnection,HttpClient,或者SOAP协议获取数据

  3. Android中的动画API,及项目中的应用
    答: Android中有两种动画, 帧动画和补间动画,补间动画又有平移,旋转,缩放,渐变动画
    3.0之后又有新特性属性动画
    项目中使用场景: 项目启动向导动画, Activity切换时动画效果(overriedPendingTransaction()),类似Tab标签页选中项背景的切换, Fragment切换时动画效果设置(setTransation()),
    ViewPager翻页时动画效果
    动画效果不可以在onCreate()方法中启动, 因为此时窗口没有完全渲染成功, 可以再onWindowFocusChanged()方法中启动动画

  4. 播放视频有哪些实现方式?
    答:1.使用系统自带的播放器来播放,指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型。
    //调用系统自带的播放器

    Intent intent = new Intent(Intent.ACTION_VIEW);

    intent.setDataAndType(uri, "video/mp4");

    startActivity(intent);

  5. 使用VideoView组件来播放, 可以结合MediaController来实现播控, 只是不能随意更改视频的大小及位置。

    1. 使用MediaPlayer和SurfaceView来实现,这种方式很灵活,可以自定义视频播放的大小和位置。
  6. 如何扫描SD卡所有的多媒体资源: 图片, 视频, 音频
    1). 通过文件过滤方式扫描(必须制定相应的后缀)
    2). 通过系统提供的ContentProvider获取

0 0