Android开发

原创
2016/11/18 14:49
阅读数 14

快捷键(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的守护进程。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部