史上最详细 最基础的 android 面试 知识点总结(二)

http://blog.csdn.net/u011733020/article/details/45722603



16 介绍下 contentprovider 是如何 实现数据共享的。 

  什么是内容提供者  ?

内容提供者是android 中的四大组件之一,可以将应用各种的数据 对外进行共享(比如我们应用的数据库,只有我们应用有权限读写,如果让其他应用访问,就需要共享出去)。

内容提供者将数据风筝,只暴露出我们洗完共提供给其他程序的数据

内容提供者将数据访问方式统一(crud),不必针对不同数据类型采取

怎么使用contentprovider?

跟 其他三大组件一样, 只要我们自己写一个类 继承 Contentprovider 类,然后实现父类的方法即可,注意  四大组件 都需要在 清单文件中注册才可以生效。

  清单文件中注册<provider android:name=".xx" android:authorities=".xxx"> 内容提供者其实就是通过url  name 就是我们自定义的provider 子类 名,这个authorities 其实就是 一个别名,供其他应用 找到 我们定义的这个类。

在其他应用中,我们要拿到一个 contentresolver。  然后获取到uri. 内容提供者 就是通过uri 进行数据共享的, uri 有三部分组成

       1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content://。
       2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
       3.路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:

•         要操作contact表中id为10的记录,可以构建这样的路径:/contact/10
•         要操作contact表中id为10的记录的name字段, contact/10/name
•         要操作contact表中的所有记录,可以构建这样的路径:/contact


然后拿contentresolver对象 就可以访问 内容提供者的方法。


17  android  的数据存储方式 都有哪些?

  1.文件   访问权限  sdcard      /data/data/包名/files..

  2.数据库 sqlite

  3。 sharedpreferences

  4.网络

  5、内容提供者

18. 为什么使用 内容提供者 contentprovider 与  sql 语句 有什么区别 

内容提供者 可以在不同应用间共享数据,比如 有些 数据是私有的, 让没有权限的其他应用访问 本应用中的数据,同时  内容提供者 可以屏蔽掉 数据存储的细节,,只提供用户访问方式不需要去关心怎么实现的,内容提供者既可以操作数据库 也可以操作xml  本地文件等,sql 只能操作数据库。

19.系统安装了多个浏览器,怎么显示的指定 某一浏览器去访问某一 连接。

 如果我们知道 包名 类型,可以通过intent 显式的指定 


       Intent  intent=new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
        intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);

      或者  intent.setClassName("com.android.browser", "com.android.browser.BrowserActivity");

若我们不知道包名,那么 我们可以通过 packagemanager 拿到  能开启的所有activity  去便利 ,代码如下

Intent  intent=new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse("http://www.baidu.com"));
PackageManager pm = getPackageManager();
List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
for (ResolveInfo resolveInfo : resolveInfos) {
System.out.println("pm-----------------"+resolveInfo.activityInfo.applicationInfo.packageName+" ====="+resolveInfo.activityInfo.applicationInfo.className);

05-14 18:01:02.207: I/System.out(16983): pm-----------------com.android.browser =====com.android.browser.Browser
05-14 18:01:02.207: I/System.out(16983): pm-----------------com.browser2345 =====com.browser2345.Browser
05-14 18:01:02.207: I/System.out(16983): pm-----------------com.ijinshan.browser_fast =====com.ijinshan.browser.KApplication
}

可以看到  我这里 的三个 浏览器包名 类名。

20. 谈谈 对 主线程的理解。

四大组件 都是运行在主线程中的, 主线程负责维护一些与生命周期相关的方法的回调, 比如 activity  oncreate  onstart 这些与生命周期相关的方法都是运行在主线程中的

所有界面的更新 都是通过主线程来处理的。比如显示一个button。还有广播,比如电量低 ,插入sd卡,发出的广播 也都是通过主线程消息机制 完成的。主线程非常重要,不能做耗时操作,否则 会导致 ANR。

21 listview 如何提高其效率?

   复用 convertview,使用   viewholder 将少findviewbyid的次数 ,大数据量  采用分页加载,分批加载 异步加载。 一些图片等资源 采用缓存机制啊,本地保存  内存保存等等, 提前把数据加载进内存,而不是用的时候再去加载。

22. android  中 Task 栈的分配。

   android 的任务栈 有四种启动模式, standard  singletop  singletask singleInstance

  standard模式 : 也是标准的 启动模式 此模式下 启动一个activity   就会有一个activity的实例加载到 任务栈中,对于使用频率启动频率一般的activity  使用standard 很合适 所以它是默认方式。

 singletop : 大部分时候跟standard 一致,区别在于,当前activity 正在栈顶 时,再次启动不会去创建一个新的activity 。android  自带浏览器的书签activity 就是使用的 singletop 模式。

singletask 与 singleInstance  都是另外开辟任务栈的模式。 标志位 singletask 的activity  ,最多仅有一个实例存在,并且 以它位根的task中 所有对该activity的请求吗,都会跳到该activity的task 中进行,singletask 很想概念中的单例模式, 所有的修改都是基于一个实例, 这通常用在 构造成本很大,但切换成本叫小的activity,比如 浏览器的主activity, 天是展示当前的tab, 当前内容的窗口, 它的构造成本很大,但是也没的切换 还是比较快的,于是 singletask 相配合 

singleInstance: 与singletask的不同就是 ,如果activity 设置了singleInstance  那么 它所在的任务栈中仅有自己一个activity, 如果涉及到其他activity  都在其他的任务栈中,

扩展     有些时候 我们希望不同程序 中一些activity 运行在相同的任务栈中 , 我们可以在清单文件中的activity 或者application 节点下设置着两个属性 ,

    android:allowTaskReparenting="true"  允许重新寻找父母任务栈
    android:taskAffinity="name..亲缘关系"  任务栈亲缘关系

23 android 中,怎么节省内存的使用,怎么主动回收内存。

  尽量多使用内部类,提高变成效率

  官方推荐   在我们的javabean 中将变量 用public 修饰, 直接访问,而不是使用get set 方法

  application 这个变量 的生命周期很长,只有当进程结束 才会回收,所以不必要的对象 不要放在application 中。

合理设置变量的 作用范围,比如  只在一个方法中用到的变量 不要定义成全局变量, 只在一个activity 中的变量 不要定义在application节点中。

手动提示 我们  dalivk 虚拟机去回收垃圾, system.gc()

24, 不同工程中的方法是否可以相互调用。

   可以的 AIDL 跨进程通信 访问远程服务。。。 比如支付宝 ,就是在其他应用中调用支付宝服务。

25 dvm进程 和 linux进程是否是同一个概念。

DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。 

26,sim卡的 ef 文件有什么作用,

与sim卡有关的东西,存储了一些数据,一般都是一些标示信息之类的,文件头,只要有文档 就可以解析。

26. 如何判断是否 有SD卡?

 Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 如果是true  则有。


27 一条最长的短信占多少byte.

其实 说 70个汉字,140byte 都是不标准的,这个 与手机的制式有关,可以查看发送短信 通过 SmsManager 对象 调用dividemessage。 看这个源码你会发现跟phonetype 有关   最大值有两种一种是 153个字母  134字节(小灵通手机最大支持67个汉字)

另一种是 160英文字母  140byte(传统的tsm cdma 等等手机是 70个汉字 )

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值