Android知识点

Android 中数据存储方式有哪些?

xml、sharedpreferences、SQLiteDataBase、ContentProvider、文件存储,网络存储

Android 的安全机制

1、Android 是基于Linux 内核的,因此Linux 对文件权限的控制同样适用于Android

在Android 中每个应用都有自己的/data/data/包名文件夹,该文件夹只能该应用访问,而其他应用则无权访问。

2、Android 的权限机制保护了用户的合法权益

如果我们的代码想拨打电话、发送短信、访问通信录、定位、访问sdcard 等所有可能侵犯用于权益的行为都是必须要在AndroidManifest.xml 中进行声明的,这样就给了用户一个知情权。

3、Android 的代码混淆保护了开发者的劳动成果

Android 的四大组件都需要在清单文件中注册吗?

Activity 、Service 、ContentProvider 如果要使用则必须在AndroidManifest.xml 中进行注册, 而

BroadcastReceiver 则有两种注册方式,静态注册和动态注册。其中静态注册就是指在AndroidManifest.xml 中进行注册,而动态注册时通过代码注册

Android 中进程的级别有哪些?

Foreground process、Visible process、Service process、Background process、Empty process

Activity 的状态都有哪些?

Foreground Activity、Visible Activity、Background process、Empty process

Activity 生命周期 here

如何保存Activity 的状态?

Activity 的状态通常情况下系统会自动保存的,只有当我们需要保存额外的数据时才需要使用到这样的功能。

一般来说, 调用onPause()和onStop()方法后的activity 实例仍然存在于内存中, activity 的所有信息和状态数据不会消失, 当activity 重新回到前台之后, 所有的改变都会得到保留。

但是当系统内存不足时, 调用onPause()和onStop()方法后的activity 可能会被系统摧毁, 此时内存中就不会存有该activity 的实例对象了。如果之后这个activity 重新回到前台, 之前所作的改变就会消失。为了避免此种情况的发生,我们可以覆写onSaveInstanceState()方法。onSaveInstanceState()方法接受一个Bundle 类型的参数, 开发者可以将状态数据存储到这个Bundle 对象中, 这样即使activity 被系统摧毁, 当用户重新启动这个activity 而调用它的onCreate()方法时, 上述的Bundle 对象会作为实参传递给onCreate()方法, 开发者可以从Bundle 对象中取出保存的数据, 然后利用这些数据将activity 恢复到被摧毁之前的状态。

需要注意的是, onSaveInstanceState()方法并不是一定会被调用的, 因为有些场景是不需要保存状态数据的. 比如用户按下BACK 键退出activity 时, 用户显然想要关闭这个activity, 此时是没有必要保存数据以供下次恢复的, 也就是onSaveInstanceState()方法不会被调用. 如果调onSaveInstanceState()方法, 调用将发生在onPause()或onStop()方法之前。

横竖屏切换时Activity 的生命周期

不设置Activity 的android:configChanges,切屏会重新调用各个生命周期。默认先销毁然后重新加载。

设置Activity 的android:configChanges="orientation|keyboardHidden|screenSize"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged 方法

将一个Activity 设置成窗口的样式

Activity 配置属性android:theme="@android:style/Theme.Dialog"

如何退出Activity?如何安全退出已调用多个Activity 的Application?

1、记录打开的activity,遍历数组去finish

2、发送特定广播

Activity四种启动模式

1、standard:进出栈,没有特别的

2、singleTop:如果在栈顶,就不会new对象

3、singleTask:在此Activity顶部的会出栈

4、singleInstance:独占一个栈

在AndroidManifest.xml里面有局限性,一般是在intent.setFlags里设置FLAG_ACTIVITY_CLEAR_TOP and FLAG_ACTIVITY_SINGLE_TOP使用,可以更加灵活的达到singleTask和singleTop的效果。

Service 的生命周期 here

什么是IntentService? here

Service 里面可以弹吐司么?

可以。有一个Context 就行

Activity 调用Service 中的方法 here

Activity 如何给Service 发送Message?

Service 如何给Activity 发送Message? activity和service通信

描述BroadcastReceiver

无序广播:完全异步,逻辑上可以被任何广播接收者接收到。优点是效率较高。缺点是一个接收者不能将处理结果传递给下一个接收者,并无法终止广播intent 的传播。

有序广播:按照被接收者的优先级顺序,在被接收者中依次传播。比如有三个广播接收者A,B,C,优先级是A >B > C。那这个消息先传给A,再传给B,最后传给C。每个接收者有权终止广播,比如B 终止广播,C 就无法接收到。

本地广播:

全局广播:

此外A 接收到广播后可以对结果对象进行操作,当广播传给B 时,B 可以从结果对象中取得A 存入的数据

Android常用布局

FrameLayout、RelativeLayout、LinearLayout、AbsoluteLayout、TableLayout、GrideLayout(Android 4.0 推出)

Android 中布局的优化措施都有哪些?

1、尽可能减少布局的嵌套层级:

可以使用sdk 提供的hierarchyviewer 工具分析视图树,帮助我们发现没有用到的布局。

2、不用设置不必要的背景,避免过度绘制:

比如父控件设置了背景色,子控件完全将父控件给覆盖的情况下,那么父控件就没有必要设置背景。

3、使用标签复用相同的布局代码:

4、使用标签减少视图层次结构:

5、通过实现View 的延迟加载:

ListView 如何提高其效率?

1、复用ConvertView

2、自定义静态类ViewHolder

3、分页加载

4、使用WeakReference引用ImageView

更新ListView

使用adapter的notifyDataSetChanged(),使listView重新绘制

ListView 可以显示多种类型的条目吗?

这个当然可以的,ListView 显示的每个条目都是通过baseAdapter 的getView(int position, View convertView,ViewGroup parent)来展示的,理论上我们完全可以让每个条目都是不同类型的view,除此之外adapter 还提供了getViewTypeCount()和getItemViewType(int position)两个方法。在getView 方法中我们可以根据不同的viewtype 加载不同的布局文件。

ListView 如何定位到指定位置

list.setSelection(position);

如何在ScrollView 中如何嵌入ListView

通常情况下我们不会在ScrollView 中嵌套ListView,但是如果面试官非让我嵌套的话也是可以的。

在ScrollView 添加一个ListView 会导致listview 控件显示不全,通常只会显示一条,这是因为两个控件的滚动事件冲突导致。所以需要通过listview 中的item 数量去计算listview 的显示高度,从而使其完整展示。

ListView 中如何优化图片

1、处理图片的方式:

如果ListView 中自定义的Item 中有涉及到大量图片的,一定要对图片进行细心的处理,因为图片占的内存是ListView 项中最头疼的,处理图片的方法大致有以下几种:

①、不要直接拿路径就去循环BitmapFactory.decodeFile;使用Options 保存图片大小、不要加载图片到内存去。

②、对图片一定要经过边界压缩尤其是比较大的图片,如果你的图片是后台服务器处理好的那就不需要了

③、在ListView 中取图片时也不要直接拿个路径去取图片,而是以WeakReference(使用WeakReference 代替强引用。比如可以使用WeakReference mContextRef)、SoftReference、WeakHashMap 等的来存储图片信息。

④、在getView 中做图片转换时,产生的中间变量一定及时释放

2、异步加载图片基本思想:

1)、先从内存缓存中获取图片显示(内存缓冲)

2)、获取不到的话从SD 卡里获取(SD 卡缓冲)

3)、都获取不到的话从网络下载图片并保存到SD 卡同时加入内存并显示(视情况看是否要显示)

原理:

优化一:先从内存中加载,没有则开启线程从SD 卡或网络中获取,这里注意从SD 卡获取图片是放在子线程里执

行的,否则快速滑屏的话会不够流畅。

优化二:于此同时,在adapter 里有个busy 变量,表示listview 是否处于滑动状态,如果是滑动状态则仅从内存中获取图片,没有的话无需再开启线程去外存或网络获取图片。

优化三:ImageLoader 里的线程使用了线程池,从而避免了过多线程频繁创建和销毁,如果每次总是new 一个线程去执行这是非常不可取的,好一点的用的AsyncTask 类,其实内部也是用到了线程池。在从网络获取图片时,先是将其保存到sd 卡,然后再加载到内存,这么做的好处是在加载到内存时可以做个压缩处理,以减少图片所占内存。

ListView 中图片错位的问题是如何产生的 here

scrollView 嵌套listview 方式除了测量还有什么方法?

Android 中如何调用C 语言

当我们的Java 需要调用C 语言的时候可以通过JNI 的方式,Java Native Interface。Android 提供了对JNI 的支持,因此我们在Android 中可以使用JNI 调用C 语言。在Android 开发目录的libs 目录下添加xxx.so 文件,不过xxx.so文件需要放在对应的CPU 架构名目录下,比如armeabi,x86 等。

在Java 代码需要通过System.loadLibrary(libName);加载so 文件。同时C 语言中的方法在java 中必须以native 关键字来声明。普通Java 方法调用这个native 方法接口,虚拟机内部自动调用so 文件中对应的方法。

播放网络视频

除了使用Android 提供的MediaPlayer 和VideoView 外通常还可以使用第三方开源万能播放器,ijkplayer,VitamioPlayer等

Serializable 和Parcelable 的区别 here and here

Intent 和Intentfilter here

你可能感兴趣的:(Android知识点)