快捷键(mac)
alt+enter :导入class command+[:退回到前一个编辑点 command+]:退到后一个编辑点 command+shift+o:查找文件 alt+F7:查找所有使用变量或者方法的地方1 Activity生命周期。
创建activity:onCreate()->onStart()->onResume() 弹出对话框activity1:当前的activity->onPause(),关闭activity1,activity->onResume() 按home键切换到后台:当前的activity->onPause()->onStop(),再次启动App:activity->onRestart()->onStart()->onResume() 。通过Intent启动新的activity也会走这个流程。 关闭activity或者程序,onDestroy()2 activity回收时数据的保存:
pause:如果activity由于某原因被系统回收了,那么持久数据保存(插入数据库)的步骤应当放在onPause里面。onStop和onDestory方法不能保证调用。onPause可以保证在任何情况下都会调用。onSaveInstanceState(Bundle state):在onPause和onStop之间执行(不能保证所有情况下都执行,点击back键就不会执行)。该方法用于保存一些临时数据,比如文本框内编辑的文本 。在下一次打开activity A的时候就会在onCreate的时候加上保存的数据。
3 activity是以堆栈的方式存放的,启动方式有以下4种。
standard:默认的启动方式。每次启动都创建新的activity。activity可以创建同样类型的activity,也是new。
singleTop:某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建(同样的activity可能存在多个)。 singleTask:待创建的activity如果在任务栈中存在,那么将该activity置为栈顶,并清除他以上的activity。如果不存在activity,那么新建一个放到栈顶。 singleInstance:该类型的Activity永远只存在一个(与singleTask相似)。不同之处在于该activity 将独占一个task(感觉task可以理解为进程),独占一个task的activity与其说是activity,倒不如说是一个应用,这个应用与其他activity是独立的,它有自己的上下文activity。4 启动activity,设置flag(intent.setFlags)
FLAG_ACTIVITY_CLEAR_TOP与singleTask一样。
FLAG_ACTIVITY_SINGLE_TOP与singleTop一样。5 清除所有的activity。
a 利用singleTask的特性。将该activity先放入任务栈,然后打开该activity就清除了他上面的所有activity。再关闭这个activity。b 设置intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)。
6 service:服务。按照运行地点分为本地服务和远程服务。远程服务就是其他进程创建的服务。本地服务指的是主进程创建的服务。本地服务和thread的区别在于,service运行在主线程。并非单独的线程。
启动Service的方式有两种 一、通过startService启动Service:onCreate、onStart、onDestory。service已经启动后,多次调用不会调用onCreate,但会多次调用onStart。onDestroy在stopService的时候调用。多次调用startService,只需要调用一次stopService就会销毁service。 二、通过bindService绑定Service:onCreate、onBind、onUnbind、onDestory。已经绑定service后多次调用并不会多次调用onCreate、onBind(注意2个方法都不调用)。可以通过bindService(intent, conn, Service.BIND_AUTO_CREATE);的conn获取到服务实例。但必须要在Service里面的onBind里面返回binder给conn,binder可以获取服务实例。 如果是想启动一项长期后台服务,那么startservice就可以了。 如果是想与运行中的service取得联系,那么用bindservice。实现activity与service的交互。7 broadCast广播。
广播注册方式2种: 一是在AndroidManifest.xml中配置:app关闭后依然接受广播事件。 二是在代码里面注册:app关闭后不再接收广播。 代码注册: MyReceiver receiver = new MyReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("com.example.kk.myapplication"); ActivityXXX.this.registerReceiver(receiver, filter); 若是在某个activity里面注册广播事件,当activity finish的时候,事件自动被移除。也可手工调用unregisterReceiver()移除。 不管谁发送的广播,广播接收器的onReceive总是在main thread里面执行。实现流程:
a.广播接收者BroadcastReceiver通过Binder(进程间通信)机制向AMS(Activity Manager Service)进行注册;
b.广播发送者通过binder机制向AMS发送广播; c.AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中; d.消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。8 Content Provider内容提供者,可以用于应用程序间共享数据。可以通过ContectResolver来读取数据。
使用表(和sqllite里面的表差不多)的方式解析数据。通过URI标识资源,格式如下: content://com.example.zhangyi.contentProvider/user 标识一张表的所有数据 content://com.example.zhangyi.contentProvider/user/# 标识一条数据(#为通配符) 自定义ContentProvider需要继承自ContentProvider,病重写他的关键方法。 在AndroidManifest.xml中配置 <provider android:name="com.example.zhangyi.contentProvider.DataServiceContentProvider" android:authorities="com.example.zhangyi.contentProvider" > </provider> 获取contentprovider中的数据: ContentResolver contentResolver = getContentResolver(); Uri uri = Uri.parse("content://com.android.contacts/contacts"); Cursor cursor = contentResolver.query(uri, null, null, null, null);9 动画2种:tween动画和帧动画。
10.新版本的android sdk在申请联系人权限的时候,必须要在程序内部动态申请,只是在配置里面申请权限还不行。
11.SQLiteOpenHelper:SQLite的辅助类,帮忙管理数据库创建和更新。
public DBOpenHelper(Context context, String dateBaseName, int version) { this(context, name, null, version); } 构造的时候传入数据库名dateBaseName,版本号version,如果数据库不存在就创建数据库,并执行onCreate(SQLiteDatabase db)创建表之类的操作。注意数据库若是存在就不执行onCreate。 如果版本号大于之前的版本号,就会执行onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) ; 创建完毕后,在activity里面实例化SQLiteOpenHelper,通过getWritableDatabase()或getReadableDatabase()方法来操作数据库。这两个方法都是以读写方式打开数据库,区别在于当数据库磁盘空间满的时候前者会报错,但后者会以只读方式打开数据库。12.每一个android程序会有一个Application。可以在manifests里面配置。
<application android:name=".MyApplication" ... </application> 如果不配置,则会使用默认的android.app.Application。可以通过getApplication获取。注意getApplicationContext也是获取的这个对象(不明白2种方法的区别)。13.Context:上下文对象,描述的是对象的android运行环境信息。有些地方需要activity作为context,有些地方又可以直接使用application的context。区别在于一般ui的显示需要使用activity的context。这样可以使用acivity栈。其他地方可以使用全局的application context,这样可以减少activity之间的对象引用,避免内存无法释放。
14.android app(进程)间通信方式(都是使用Binder IPC机制):
a.启动另一个app的activity b.启动另一个app的服务 c.contentprovider d.广播15. Activity和service间的通信:
a 可以通过bindService获取到service的实例 b 可以在service里面发送广播,Activity监听该广播16.activity的android:theme属性可以控制activity的样式。
17.android布局:
1)、 LinearLayout : 线性布局。 orientation – 容器内元素的排列方式。vertical: 子元素们垂直排列;horizontal: 子元素们水平排列 gravity – 内容的排列形式。常用的有 vertical: left(默认), right, center horizontal:top(默认), bottom,center 2)、 AbsoluteLayout : 绝对布局。 layout_x – x 坐标。以左上角为顶点 layout_y – y 坐标。以左上角为顶点 3)、 TableLayout : 表格式布局 表格布局主要以行列的形式来管理子控件,其中每一行即一个TableRow对象,每个TableRow对象可以添加子控件,并且每加入一个控件即相当于添加了一列 4)、 RelativeLayout : 相对布局。 a 相对容器 layout_alignParentTop: 相对容器上方 layout_alignParentBottom: 相对容器底部 layout_alignParentLeft: 相对容器左边 layout_alignParentRight: 相对容器右边 layout_centerHorizontal: 容器水平中点 layout_centerVertical: 容器垂直中点 layout_centerInParent: 容器中心点 b 当然可以设置相对某个同层级的某个widget 可以通过layout_marginTop、layout_marginLeft、layout_marginRight、layout_marginEnd设置距离相对点的距离。 5)、 FrameLayout : 层叠布局。以左上角为起点,将 FrameLayout 内的元素一层覆盖一层地显示,在帧布局中,先添加的图片会被后添加的图片覆盖。18.Intent(意图)。封装了请求信息。包括对activity、service、broadcast的操作请求。分为显式intent和隐式intent。以启动activity为例:
a、显式intent: Intent intent = new Intent(Activity1.this , Activity2.class); startActivity(intent); b、隐式intent: Intent intent = new Intent(); intent.setAction("com.example.project.SHOW"); startActivity(intent); 此时需要在在mainfest里面配置 <activity android:name=".Activity2" > <intent-filter> <action android:name="com.example.project.SHOW" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>19.xml解析:dom、sax、pull
dom:构造解析树,加载所有结点,消耗内存 sax:逐行解析。省内存。但是不能控制解析过程 pull:和sax相似,但是可以控制解析过程,中断解析20.打开activity,传递序列化对象
Person是一个可序列化对象(实现Serializable) 启动activity: intent.putExtra("person", new Person("kk",30));获取参数:
Intent intent = getIntent(); Person person = (Person)intent.getSerializableExtra("person");21.Parcelable和Serializable区别
Serializable是java序列化对象的方法。可以将序列化的对象传递到网络,本地文件和数据库。 Parcelable是专门为Android设计的序列化方法。性能比Serializable高。用于在android组件间和app间传递数据。数据只能存在雨内存中。22.AIDL(Android Interface Definition Language):binder是android 中ipc的一种常用方法。AIDL是Binder机制向外提供的接口,目的就是为了方便对Binder的使用。当然你也可以直接继承binder来实现。
23.守护进程。独立于终端,周期性执行某种任务或者等待处理某种事件的进程。ServiceManager就是binder的守护进程。