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

 

posted @ 2018-03-09 11:39  Jason_Jan  阅读(210)  评论(0编辑  收藏  举报