安卓常用知识汇总

来源:互联网 发布:python写一个整点提醒 编辑:程序博客网 时间:2024/05/21 06:23

一、广播

1、广播接收器可在代码中注册,也可在配置文件中注册。

2、广播接收器注册后可注销,unregisterReceiver(mBatteryInfoReceive)。

3、广播接收器能接收自定义的广播消息,也可接收系统广播如网络状态改变等。

4、BroadcastReceiver是对发送出来的广播进行过滤接收并响应的一类组件

5、每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver方法中执行完时销毁

6、定义广播接收器类需要继承BroadcastReceiver基类,并且必须要重写onReceive()方法

二、Activity

1、保存 Activity 状态

管理 Activity 生命周期的引言部分简要提及,当 Activity 暂停或停止时,Activity 的状态会得到保留。确实如此,因为当 Activity 暂停或停止时,Activity 对象仍保留在内存中 — 有关其成员和当前状态的所有信息仍处于活动状态。因此,用户在 Activity 内所做的任何更改都会得到保留,这样一来,当Activity 返回前台(当它“继续”)时,这些更改仍然存在。

不过,当系统为了恢复内存而销毁某项 Activity 时,Activity 对象也会被销毁,因此系统在继续 Activity 时根本无法让其状态保持完好,而是必须在用户返回 Activity 时重建 Activity 对象。但用户并不知道系统销毁 Activity 后又对其进行了重建,因此他们很可能认为 Activity 状态毫无变化。 在这种情况下,您可以实现另一个回调方法对有关Activity 状态的信息进行保存,以确保有关 Activity 状态的重要信息得到保留:onSaveInstanceState()。

系统会先调用 onSaveInstanceState(),然后再使 Activity 变得易于销毁。系统会向该方法传递一个 Bundle,您可以在其中使用 putString() 和 putInt() 等方法以名称-值对形式保存有关 Activity 状态的信息。然后,如果系统终止您的应用进程,并且用户返回您的Activity,则系统会重建该Activity,并将Bundle 同时传递给 onCreate() 和onRestoreInstanceState()。  您可以使用上述任一方法从 Bundle 提取您保存的状态并恢复该 Activity 状态。如果没有状态信息需要恢复,则传递给您的 Bundle 是空值(如果是首次创建该 Activity,就会出现这种情况)。

2、退出

Finish():activity的finish方法退出程序

抛出异常而退出

System.exit(0)退出整个程序

注意,stop()方法只能让Activity进入生命周期中的一个状态,并不是退出Activity

3、生命周期

(1)未设置Activity的android:configChanges属性,API上这样说"the activity will be restarted if any of these configurationchanges happen in the system.";如何配置有改变,就会重启activity

(2)launchMode为singleTask的时候,通过Intent启到一个Activity, 如果系统已经存在一个实例,系统就会将请求发送到这个实例上, 但这个时候,系统就不会再调用通常情况下我们处理请求数据的onCreate方法,而是调用onNewIntent方法

(3)生命周期:

Activity实例是由系统自动创建,并在不同的状态期间回调相应的方法。一个最简单的完整的Activity生命周期会按照如下顺序回调:onCreate -> onStart-> onResume -> onPause -> onStop -> onDestroy。称之为entire lifetime。

所谓的典型的生命周期就是在有用户参与的情况下,Activity经历从创建,运行,停止,销毁等正常的生命周期过程。我们这里先来介绍一下几个主要方法的调用时机,然后再通过代码层面来验证其调用流程。

(1)onCreate : 该方法是在Activity被创建时回调,它是生命周期第一个调用的方法,我们在创建Activity时一般都需要重写该方法,然后在该方法中做一些初始化的操作,如通过setContentView设置界面布局的资源,初始化所需要的组件信息等。

(2)onStart : 此方法被回调时表示Activity正在启动,此时Activity已处于可见状态,只是还没有在前台显示,因此无法与用户进行交互。可以简单理解为Activity已显示而我们无法看见摆了。

(3)onResume : 当此方法回调时,则说明Activity已在前台可见,可与用户交互了(处于前面所说的Active/Running形态),onResume方法与onStart的相同点是两者都表示Activity可见,只不过onStart回调时Activity还是后台无法与用户交互,而onResume则已显示在前台,可与用户交互。当然从流程图,我们也可以看出当Activity停止后(onPause方法和  onStop方法被调用),重新回到前台时也会调用onResume方法,因此我们也可以在onResume方法中初始化一些资源,比如重新初始化在onPause或者onStop方法中释放的资源。

(4)onPause : 此方法被回调时则表示Activity正在停止(Paused形态),一般情况下onStop方法会紧接着被回调。但通过流程图我们还可以看到一种情况是onPause方法执行后直接执行了onResume方法,这属于比较极端的现象了,这可能是用户操作使当前Activity退居后台后又迅速地再回到到当前的Activity,此时onResume方法就会被回调。当然,在onPause方法中我们可以做一些数据存储或者动画停止或者资源回收的操作,但是不能太耗时,因为这可能会影响到新的Activity的显示——onPause方法执行完成后,新Activity的onResume方法才会被执行。

(5)onStop : 一般在onPause方法执行完成直接执行,表示Activity即将停止或者完全被覆盖(Stopped形态),此时Activity不可见,仅在后台运行。同样地,在onStop方法可以做一些资源释放的操作(不能太耗时)。

(6)onRestart :表示Activity正在重新启动,当Activity由不可见变为可见状态时,该方法被回调。这种情况一般是用户打开了一个新的Activity时,当前的Activity就会被暂停(onPause和onStop被执行了),接着又回到当前Activity页面时,onRestart方法就会被回调。

(7)onDestroy :此时Activity正在被销毁,也是生命周期最后一个执行的方法,一般我们可以在此方法中做一些回收工作和最终的资源释放。

4、startActivityForResult()方法,如果是A跳转B,B的launchMode属性为singleInstance,A的onActivityResult()回调方法的调用?

B返回的时候调用

5、launchMode

(1)standard:每次跳转系统都会在task中生成一个新的activity实例,并且放在栈结构的顶部,back时,回到原来activity实例。

(2)singleTop:从A跳B时,系统发现有B实例,但不是位于栈顶,则重新生成一个实例,如果B位于栈顶,重复调用,不需生成新实例。

(3)singleTask:如果发现有对应的Activity实例,则该activity实例之上的其它activity实例统统出栈,该实例成为栈顶。

(4)singleInstance:activity作为一个独立个体存在,当退出并重新打开时,无需创建新实例,系统会自动查找,存在则直接利用。

6、未设置Activity的android:configChanges属性,切换屏幕横纵方向时会重新调用onCreate()方法;当再次启动某个launchMode设置为singletask的Activity,它的onNewIntent()方法会被触发

三、Intent

1、在 android 中,Intent对象是用来传递信息的

2、Intent 对象可以把值传递给广播或 Activity

3、利用 Intent 传值时,可以传递一部分值类型

4、隐式Intent:

    Intentintent=new Intent(Intent.ACTION_SEND);

intent.putExtra(Intent.EXTRA_TEXT,textMessage);

intent.setType("text/plain");

startActivity(intent);

5、传递的数据类型:

(1) 8种基本数据类型及其数组

(2)String(String实现了 Serializable )/CharSequence实例类型的数据及其数组

(3)实现了Parcelable的对象及其数组

(4)实现了 Serializable的对象及其数组

6、IntentService

IntentService是继承Service的,那么它包含了Service的全部特性,当然也包含service的生命周期,那么与service不同的是,IntentService在执行onCreate操作的时候,内部开了一个线程,去你执行你的耗时操作。

四、SharedPreferences

    1、是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activity暂停时,将此activity的状态保存到SharedPereferences中;当Activity重载,系统回调方法onSaveInstanceState时,再从SharedPreferences中将值取出。

2、以xml方式来保存

3、以键值对形式保存的

五、ServiceConnection接口的onServiceConnected()方法的触发条件

1、bindService是异步调用和Service进行绑定, 如果绑定成功,则会调用ServiceConnection 的onServiceConnected。当调用bindService方法后就会回调Activity的onServiceConnected,在这个方法中会向Activity中传递一个IBinder的实例,Acitity需要保存这个实例。

2、对于一个已经存在的SharedPreferences 对象 setting ,想向其中存入一个字符串 ”person”,”setting” 应该先调用:

   1.通过Context上下文来过去到SharePreferences对象

   2.调用SharePreferences的edit()方法返回一个Editor对象

   3.在通过Editor的putString(key, value);方法设置数据

   4. 在通过Editor的  commit(); 方法 关闭对象

六、Android dvm的进程

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

七、使用AIDL完成远程service方法调用

    AIDL:AndroidInterface Definition Language,即Android接口定义语言。Android 使用AIDL提供公开服务接口,使得不同进程间可以相互通信。

建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下:

(1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。

(2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。

(3)建立一个服务类(Service的子类)。

(4)实现由aidl文件生成的Java接口。

(5)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,<action>标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。

八、屏幕显示

    在 Android 中, 1pt 大概等于 2.22sp以上供参考,

    与分辨率无关的度量单位可以解决这一问题。Android支持下列所有单位。

px(像素):屏幕上的点。     in(英寸):长度单位。

mm(毫米):长度单位。      pt(磅):1/72英寸。

dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。

dip:与dp相同,多用于android/ophone示例中。

sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。

分辨率:整个屏是多少点,比如800x480,它是对于软件来说的显示单位,以px为单位的点。 density(密度)值表示每英寸有多少个显示点,与分辨率是两个概念。apk的资源包中, 

当屏幕density=240时使用hdpi标签的资源 

当屏幕density=160时,使用mdpi标签的资源 

当屏幕density=120时,使用ldpi标签的资源。 

一般android设置长度和宽度多用dip,设置字体大小多用sp. 在屏幕密度为160,1dp=1px=1dip,1pt = 160/72 sp 1pt = 1/72 英寸.当屏幕密度为240时,1dp=1dip=1.5px.

九、Android进程

重要性依次是:前台进程、可见进程、服务进程、后台进程、空进程。所以销毁的顺序为逆方向。

1、前台进程:用户当前操作所必需的进程。如果一个进程满足以下任一条件,即视为前台进程:

(1)托管用户正在交互的 Activity(已调用 Activity 的 onResume() 方法)

(2)托管某个 Service,后者绑定到用户正在交互的 Activity

(3)托管正在“前台”运行的 Service(服务已调用 startForeground())

(4)托管正执行一个生命周期回调的 Service(onCreate()、onStart()或 onDestroy())

(5)托管正执行其 onReceive() 方法的 BroadcastReceiver

通常,在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。此时,设备往往已达到内存分页状态,因此需要终止一些前台进程来确保用户界面正常响应。

2、可见进程

没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程。 如果一个进程满足以下任一条件,即视为可见进程:

(1)托管不在前台、但仍对用户可见的 Activity(已调用其 onPause() 方法)。例如,如果前台 Activity 启动了一个对话框,允许在其后显示上一 Activity,则有可能会发生这种情况。

(2)托管绑定到可见(或前台)Activity 的 Service。

可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。

3、服务进程

正在运行已使用startService() 方法启动的服务且不属于上述两个更高类别进程的进程。尽管服务进程与用户所见内容没有直接关联,但是它们通常在执行一些用户关心的操作(例如,在后台播放音乐或从网络下载数据)。因此,除非内存不足以维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态。

4、后台进程

包含目前对用户不可见的Activity 的进程(已调用 Activity 的 onStop()方法)。这些进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程、可见进程或服务进程使用。 通常会有很多后台进程在运行,因此它们会保存在 LRU (最近最少使用)列表中,以确保包含用户最近查看的 Activity 的进程最后一个被终止。如果某个 Activity 正确实现了生命周期方法,并保存了其当前状态,则终止其进程不会对用户体验产生明显影响,因为当用户导航回该 Activity 时,Activity 会恢复其所有可见状态。 有关保存和恢复状态的信息,请参阅 Activity文档。

5、空进程

不含任何活动应用组件的进程。保留这种进程的的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。

十、SimpleAdapter

使用SimpleAdapter作为适配器时,支持三种类型的 View,而且是按照如下顺序进行匹配:1、继承Checkable接口(如compoundButton)2、TextView3、ImageView

十一、线程间通信

andriod提供了 Handler  和  Looper 来满足线程间的通信。 Handler 先进先出原则。 Looper 类用来管理特定线程内对象之间的消息交换(MessageExchange) 。 

1)Looper:  一个线程可以产生一个 Looper 对象,由它来管理此线程里的 MessageQueue( 消息队列 ) 。 

2)Handler:  你可以构造 Handler 对象来与 Looper 沟通,以便 push 新消息到 MessageQueue 里 ; 或者接收 Looper 从Message Queue 取出 ) 所送来的消息。 

3) Message Queue( 消息队列 ): 用来存放线程放入的消息。 

4) 线程: UIthread  通常就是 main thread ,而 Android 启动程序时会替它建立一个 MessageQueue 。

在同一线程中肯定会调用一个 Loop.prepare() ,其中就生成一个 MessageQueue 。而代码中可以 new 出多个 Handler 发送各自的 Message 到这个 MessageQueue 中,最后调用 msg.target.dispatch 中这个target来捕获自己发送的massge,所以明显是 N 个Handler 对应一个 MessageQueue。

注意!!!!!Android间常用的跨进程通信工具:broadcast和AIDL

十二、android 的动画类型

   1.帧动画 Frame  一帧一帧的   

   2.补间动画   Tween  慢慢过渡,设置初值和末值,并用插值器来控制过渡

   3.属性动画   ObjectAnimation ValueAnimation   控制属性来实现动画。

属性动画是3.0以后加入的动画。三种动画各有各的好处和缺点

十三、AsyncTask

(1)onProgressUpdate()方法是在主线程中执行的

(2)如果同时执行多个AsyncTask的话,他们默认是串行执行

(3)AsyncTask的实例应在UI thread中创建实例

(4)AsyncTask中有两个线程池,一个是SerialExecutor 一个是 threadPoolExecutor,它们的区别在于,第一个线程池用于排队,第二个线程池用于执行指定的任务,在最初的 AsyncTask 中只支持串行工作,后在3.0之后加入了executeOnExecutor方法,该方法提供并行了并行操作,一般而言用法为

  newAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"...");

十四、menu重写方法

上下文菜单(通过在某元素上长按,来呼出菜单)

选项菜单(通过按手机上的菜单按钮,来呼出菜单)  

重写 onCreateContextMenu 用以创建上下文菜单

重写 onContextItemSelected 用以响应上下文菜单 

重写 onCreateOptionsMenu 用以创建选项菜单

重写 onOptionsItemSelected 用以响应选项菜单 

当每次Menu显示时,会调用方法onPrepareOptionsMenu,也可以在菜单每次被调用时,对菜单中的项重新生成,通过重载onPrepareOptionsMenu来实现,由于每次调用时都要重新生成,对于那些不经常变化的菜单,效率就会比较低。  

调用Menu.addSubMenu()方法,为某个菜单项添加子菜单

十五、NDK

1、NDK是一系列工具的集合

2、NDK 提供了一份稳定、功能有限的 API 头文件声明

3、使 “Java+C” 的开发方式终于转正,成为官方支持的开发方式

4、NDK 将是 Android 平台支持 C 开发的开端

十六、序列化

Android中实现序列化有两个选择:一是实现Serializable接口(是JavaSE本身就支持的),一是实现Parcelable接口(是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC))。实现Serializable接口非常简单,声明一下就可以了,而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。

注:Android中Intent传递对象有两种方法:一是Bundle.putSerializable(Key,Object),另一种是Bundle.putParcelable(Key,Object)。当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口。

Parcelable和Serializable 两者异同:

1、Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC;

2、在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。

3、Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。

十七、MVC模式

M是逻辑模型

V是视图模型,对应于android里面的View

C是控制器,android中的activity实现了这个职责

十八、适合在客户端做数据持久化存储的数据是什么

localstorage 代表本地存储,这个又可以分为手机存储和内存卡存储,这两种方式都是持久性保存,

UserData 代表用户的数据这个也可以进行保存,这个一般存储在用户的手机存储中。

十九、GLSurfaceView

1> 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。

2> 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。

3> 用户自定义渲染器(render)。

4> 让渲染器在独立的线程里运作,和UI线程分离。

5> 支持按需渲染(on-demand)和连续渲染(continuous)。

6> 一些可选工具,如调试。

二十、在滴滴打车点击到支付宝支付,出现密码输入框,到此时相关的Activity会发生的生命周期回调依次为?

onpause()  oncreate()  onstart()  onresume()

滴滴界面会onpausem由于支付宝是dialog形式的所以不会onstop.

支付宝界面会oncreate -onstart – onresume

二十一、Android架构图

LinuxKernel(Linux内核)、HardwareAbstraction Layer(硬件抽象层)、Libraries(系统运行库或者是c/c++ 核心库)、ApplicationFramework(开发框架包 )、Applications(核心应用程序)。

二十二、资源池与线程池

1、Message提供了消息池,有静态方法Obtain从消息池中取对象;

2、Thread默认不提供资源池,除非使用线程池ThreadPool管理;

3、AsynTask是线程池改造的,池里 默认提供(核数+1)个线程进行并发操作,最大支持(核数  * 2 + 1)个线程,超过后会丢弃其他任务;

4、Looper,每个Looper创建时创建一个消息队列和线程对象,也不是资源池;

二十三、复选框

RadioButton和CheckBox的区别:

1、单个RadioButton在选中后,通过点击无法变为未选中

   单个CheckBox在选中后,通过点击可以变为未选中

2、一组RadioButton,只能同时选中一个

   一组CheckBox,能同时选中多个

3、RadioButton在大部分UI框架中默认都以圆形表示

   CheckBox在大部分UI框架中默认都以矩形表示

RadioButton和RadioGroup的关系:

1、RadioButton表示单个圆形单选框,而RadioGroup是可以容纳多个RadioButton的容器

2、每个RadioGroup中的RadioButton同时只能有一个被选中

3、不同的RadioGroup中的RadioButton互不相干,即如果组A中有一个选中了,组B中依然可以有一个被选中

4、大部分场合下,一个RadioGroup中至少有2个RadioButton

5、大部分场合下,一个RadioGroup中的RadioButton默认会有一个被选中,并建议您将它放在RadioGroup中的起始位置

二十四、service生命周期

注意不是activity的周期!!!

    由于Android Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法。

二十五、在多个应用中读取共享存储数据时,需要用到的query方法,是哪个对象的方法

1、无论是ContentProvider还是ContentResolver都有各自的insert(),delte(),uapdte(),query(),四个方法。

2、使用ContentResolver是用来操作数据的。

二十六、Android四大组件的回调函数

1、Activity的onCreate():程序刚进入执行Activity的内容,属于UI线程;

2、IntentService的onHandleIntent():简易版的Service,可以更方便去执行耗时操作,实现这个方法,调用时属于UI线程;

3、BroadcastReceive的onReceive():onReceive广播接收的实现,属于UI线程;

4、ContentProvide的query():执行query操作时,如果数据量较大,查询慢,会造成ANR或用户体验差,所以查询一般放在其他线程。

二十七、数据持久化

1.文件IO(直接写入SD卡文件);

2.SQLite数据库;

3.使用Preferences。 Preferences其实也属于文件IO;

4.ContentProvider。作为android4大组件之一,其本身也是为了实现进程间数据共享。