Android面试收集录 Android组件
1.请说出Android SDK支持哪些方式显示富文本信息?
- 使用TextView组件可以显示富文本信息,如果要实现图文混排,需实现ImageGetter接口
- 使用WebView组件显示HTML页面
- 自定义View,覆盖onDraw方法,可以直接绘制富文本
- TextView组件显示图像还可以使用ImageSpan对象
2.TextView组件如何显示图像?
- 使用<img>标签在TextView组件中显示图像,需要CharSequence配合
- 使用ImageSpan对象在TextView组件中显示图像,需要SpannableString配合
3.TextView有一个URL,点击后要跳转到一个活动,怎么实现?
- 采用SpannableString定义文字
- 通过SpannableString的一个setSpan方法+注册ClickableSpan点击事件
- textView设置spannableString
- textView设置LinkMovementMethod对象
4.如何为TextView组件中显示的文本添加背景色?
- 使用BackgroundColorSpan对象可以设置文字背景色。
5.如何设计电子词典程序,当输入单词时,应显示输入单词开头的单词列表?
- 使用AutoCompleteTextView
- 配合TextWatcher的afterTextChanged实现,数据通过检索数据库用游标获取
6.如何让一个显示图像的按钮在不同状态下显示不同的图像?
- 使用drawable资源
- 在drawable目录中建立一个XML文件,在<selector>标签中农指定各种状态对应的状态图像
- android:state_pressed="true",代表按钮按下的状态
- android:state_focused="true",代表按钮处于焦点时状态
7.如何实现图像的半透明度?
- 使用Paint.setAlpha方法设置
- 可以再不透明的图层上覆盖一层半透明的膜
8.如何在ImageView组件中显示图像的一部分?
- 使用Bitmap.createBitmap方法,Bitmap.createBitmap(sourceBitmap,20,20,100,100)截取坐标范围图像。
- 利用图像剪切资源实现,局限性是只能截取一端的图像。
9.请描述如何使用Matrix对象旋转和缩放图像?
首先生成一个Matrix对象。 Matrix matrix=new Matrix();
- 旋转:matrix.setRotate(45)==>顺时针旋转45度。
- 缩放:matrix.setScale((float)0.5,(float)0.5);
10.ProgressBar的进度条颜色是否可以修改?
- 可以。
- ProgressBar有3种颜色,第一进度条颜色,第二进度条颜色,背景颜色。
- 可以使用图层列表layer-list修改这三种颜色。
- 然后再资源布局中的ProgressBar标签中使用android:progressDrawable属性指定资源id。
11.如何对GridView、ListView等列表组件中的数据进行增、删、改操作?
- 首先对数据源中的数据进行增删改操作
- 然后调用BaseAdapter.notifyDataSetInvalidated方法更新数据
12.如何优化类似于相册,一下子加载很多缩略图?
- 使用任务队列技术
- 可以使用数组或List对象建立任务队列和数据缓冲
- getView遇到比较耗时的操作,就将这个操作加入任务队列
- 用子线程从任务队列中取得任务,并执行相应的任务
- 最后调用BaseAdapter.notifyDataSetChanged方法刷新列表
13.如何使容器内的组件可以水平和垂直滑动?
- 将ScrollView和HorizontalScrollView组件结合使用
14.如何将可视化组件封装在jar文件中以及如何通过Java代码适应不同屏幕分辨率?
- 直接将.class文件放到jar文件中即可,组件使用的资源文件要放到res目录中。
- 屏幕分辨率主要是将dp或sp转换成实际的像素点。
15.如何编写一个自定义可视组件?
- 法1:扩展现有的组件,如继承TextView。
- 法2:组合多种组件,如继承容器,将多个组件放进去。
- 法3:直接继承View,从零开始编写。
- 注意点:要考虑屏幕分辨率的问题,将dp或sp转换为实际的像素点。
16.Android支持的四大组件可以封装在jar文件中吗?
- 可以
- 静态引用jar文件
- 仍然需要在AndroidManifest.xml文件中进行注册
17.如何将classes.dex文件打包成jar文件?
- jar cvf my.jar classes.dex
18.在Android应用程序中Java与JavaScript如何交互?
- 使用webView进行交互。
- 通过WebSetting配置webView的属性。
- webView通过addJavaScriptInterface来设置接口,处理相应逻辑。
19.写出安装apk程序的代码?
- Intent intent=new Intent(Intent.ACTION_VIEW);
- String filePath="/sdcard/...apk";
- intent.setDataAndType(Uri.parse("file://"+filePath),"application/vnd.android.package-archive");
- startActivity(intent);
20.如何配置Activity才能让程序启动时将该Activity作为启动窗口?
- 定义Main动作==><action android:name="android.intent.action.MAIN">
- 指定这个category==><category android:name="android.intent.category.LAUNCHER">
21.Activity生命周期?
- onCreate==>onStart==>onResume==>onPause==>onStop==>onRestart==>onDestroy
- 打开某个活动,再按了home键 ==>onCreate==>onStart==>onResume==>onPause==>onStop
- 然后又回到当前活动 ==>onRestart==>onStart==>onResume
22.在Activity之间如何传递数据的方式有哪些?
- Intent对象,与Bundle配合使用
- 静态变量
- 剪切板,将数据保存在剪切板中,需使用ClipboardManager
- 全局对象,Application
- 文件方式,sharePerference
23.调用系统活动的一些方法?
- 拨号:new Intent(Intent.ACTION_CALL,Uri.parse("tel:12345678900"));
- 传入拨号:new Intent(Intent.ACTION_DIAL,Uri.parse("tel:12345678900"));
- 调用拨号:new Intent("com.android.phone.action.TOUCH_DIALER");
- 调用系统浏览器:new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.baidu.com"));
- 查看联系人:new Intent("com.android.contacts.action.LIST_CONTACTS");
- 系统设置:new Intent("android.settings.SETTINGS");
- 查看WiFi:new Intent("android.settings.WIFI_SETTINGS");
24.如何将Activity变成半透明的对话框?
- 在清单中定义一个主题android:theme="@style/MyTheme"
- 然后再style资源文件中定义一个MyTheme,注意style的parent是@android:style/Theme.Dialog即可变成对话框形式
- 在资源文件中添加一个android:windowBackground属性
25.如何设置Activity显示和关闭时的动画效果?
- 首先在anim文件中定义两个动画,R.anim.fade_in,R.anim.fade_out
- 然后再startActivity后,添加overridePendingTransition(R.anim.fade_in,R.anim.fade_out);
26.如何接收广播?
- 编写一个广播接收器类,继承BroadcastReceiver或子类。(在重写的onReceive处理逻辑)
- 在AndroidManifest.xml文件中注册,采用<receiver>的标签注册
27.如何获取短信内容?
- 编写一个广播接收器,在清单中配置好短信广播<action android:name="android.provider.Telephony.SMS_RECEIVED">
- 在重写的onReceive中,从intent获取数据,和SmsMessage配合获取内容
28.如何拦截来电?
- 编写一个广播接收器,在清单中配置好来电广播<action android:name="android.intent.action.PHONE_STATE">
- 继续在清单中添加监听来电状态的权限
- 在重写的onReceive利用反射技术配合TelephonyManager处理来电
29.如何拦截手机屏幕休眠和唤醒的动作?
- 只能动态注册接收器,不能静态注册
- 利用IntentFilter.addAction(Intent.ACTION_ACREEN_ON)设置屏幕唤醒广播的动作
- 利用IntentFilter.addAction(Intent.ACTION_ACREEN_OFF)设置屏幕休眠广播的动作
30.如何让一个Activity在开机后自动显示?
- 编写一个广播接收器,在清单中配置<action android:name="android.intent.action.BOOT_COMPLETED">
- 重写onReceive方法,在广播接收器中显示Activity,必须设置FLAG_ACTIVITY_NEW_TASK,因为服务中没有前一个活动的栈
31.如何发送广播?
- 利用sendBroadcast方法
- 先指定广播动作:new Intent("mobile.android.MYBROADCAST");
- 添加category: 上面的intent.addCategory("mobile.android.mycategory");
- 设置广播数据:上面的intent.putExtra("name","broadcast_data");
- 发送广播:sendBroadcast(intent);
32.请描述一下Service的生命周期?
第一种方式startService+stopService
- onCreate()==>创建服务
- onStartCommand()==>开始服务
- onDestroy()==>销毁服务
第二种方式bindService+unbindService
- onCreate->onBind->onUnBind->onDestroy
33.请阐述一下开发AIDL服务的步骤?
- 创建一个扩展名为aidl的文件。
- make project==>自动生成一个Java接口文件。
- 建立一个服务类。
- 实现由aidl文件生成的Java接口。
- 在AndroidManifset.xml文件中配置AIDL服务。
34.如何编写一个可以传递Product对象的AIDL服务?
- 首先编写一个Product基础类型,实现了Parcelable接口(注意需要定义一个名为CREATOR的变量,里面还有两个重写的函数)
- 然后建立Product.aidl文件,里面只有一行代码:parcelable Product;
- 然后再建立一个服务IMyService.aidl,里面定义了一个服务接口IMyService,注意输入参数需要用in修饰
- 然后编写AIDL服务类MyService,里面定义了内部类继承了IMyService.Stub,在onBind中返回一个实例。
- 最后在AndroidManifest.xml配置AIDL服务,采用<service>标签配置MyService
- 客户端调用:bindService(intent,serviceConnection,Context.BIND_AUTO_CREATE);注意serviceConnection要自己定义,里面获得AIDL服务对象。
35.如何读取联系人信息?
- 使用Content Provider内容提供器来访问。
- 先用游标Cursor存储从ContactsContract.Contacts.CONTTENT_URI中查询的数据
- 在用SimpleCursorAdapter显示联系人列表
- 注意要在AndroidManifest.xml中添加权限READ_CONTRACTS
36.如何查询收发的短信信息?
- 使用Content Provider内容提供其来访问。
- 先用游标Cursor存储从Uri.parse("content://sms")中查询的消息
- 如果只查收件箱,则改成content://sms/inbox
- 如果只查发件箱,则改成content://sms/outbox
- 注意读取短信信息要在AndroidManifest.xml文件中打开权限READ_SMS
37.请描述Content Provider URI有那几部分组件?
- 有4部分组成
- content:// ==>相当于Http URI中的http://
- authority ==>相当于Http URI中的域名
- 路径(path)
- 参数(param)
- 例子:content://jason.android.mydata/table1/20
38.如何开发一个Content Provider?
- 编写一个类,继承ContentProvider
- 实现所有的抽象方法
- 定义Content Provider的URI,URI的形式为 content://authority/path/param
- 使用UriMatcher对象映射Uri和返回码
- 根据实际的需要实现相应的方法
- 实现query,insert,delete,update方法需要先用UriMatcher.match方法映射成返回码,然后进行相应的处理
- 在AndroidManifest.xml文件中使用<provider>标签注册
39.如何得知系统定义了哪些访问权限?
- 命令行:adb shell pm list permissions
既然选择了,便不顾风雨兼程。Just follow yourself.