Android API Guide学习笔记

来源:互联网 发布:inventor软件多少钱 编辑:程序博客网 时间:2024/06/03 19:13

闲来无事,看看Android API Guid,了解一下设计意图,记录一些Android API Guid学习笔记

Activities:

1.由于系统在onPause,onStop和onDestory时可能会直接kill掉对应的APP进程,而onPause是第一个状态,所以在onPause中完成数据的持久化是最妥帖的位置,否则有可能由于Activity没有进入到后面两个状态,导致数据没有保存
2.onSaveInstanceState()并不保证一定会被调用,只有在用户没有通过back返回时才会调用,而用户点击back返回的情况下,onSaveInstanceState()不会被调用,也就是说此时系统认为状态无需保存。应该使用onSaveInstanceState()保存暂态数据而非持久化数据。
3.Fragment不一定必须有UI,也可以仅仅Activity功能的一个子模块。不实现onCreateView即可。
4.FragmentTransaction.addToBackStack()调用是将对应的FagmentTransaction放到了backstack而不是Fragment。每次popup是回退了一次transaction.
5.Loader的作用是异步加载数据。
6.initLoader的ID参数作用:当ID存在时,重用最后创建的loader,否则,调用LoaderCallbacks的onCreateLoader()
7.Android5.0提出了Document和Task的概念,同一个Activity的不同Document会显示在overview screen当中,与Task类似。使用Intent标志FLAG_ACTIVITY_NEW_DOCUMENT和FLAG_ACTIVITY_MULTIPLE_TASK来标示。
8.Task是一个Activity的集合,其中的Activity被放置在一个backstack中
9.对lauchmode的设置,同一种lauchmode代码中通过Intent flag的设置优先级要高于manifest文件的配置。


Services:

1.Service可以同时支持startService和bindService,即一个Service被start之后还可以被bind
2.android:exported可以防止本应用之外的其它应用启动service
3.IntentService有几个特性:
(1)会创建一个默认的工作线程,不是工作在主线程
(2)会将请求排队,因此不必在意多线程同步的问题
(3)处理完start的所有请求后,会自动停止,不需要调用stop
(4)默认实现的onBind返回null
(5)默认实现的onStartCommand将intent发送到工作队列,然后交由onHandleIntent处理
(6)重载除onHandleIntent和onBind之外的回调方法时,要记得调用父类的对应方法,并返回该返回值,返回之前可以做一些自己的事情,以使工作线程正确执行。
4.如果希望Service可以返回结果,可以传递给Service一个PendingIntent.getBroadcast()产生的intent,然后再service内可以通过broadcast借助于该intent传递一个结果。
5.系统只在第一次bind时调用onBind并返回IBinder,之后返回的将是相同的IBinder,并且不会再调用onBind
6.绑定的Service可以有三种实现方式:
(1)扩展Binder class,不涉及IPC
(2)使用Messenger,涉及IPC,可以双向通信
(3)使用AIDL,跨进程,涉及IPC
7.可以从Service,Activity,ContentProvider绑定到一个Service,但是从Service无法绑定到Service
8.ServiceConnection.onServiceDisconnected()在unBind时不会被调用,只有Service异常终止时(崩溃或者被kill)才会被调用
9.最好不要在onResume和onPause时bind和unbind Service,这两个方法应该尽可能快的结束。
10.当onUnBind时返回true,Service再次被bind时,调用onRebind,否则调用onBind,如图:



11.AIDL中不允许写static域,只允许写方法。
12.使用AIDL注意线程安全的问题。调用方最好在线程中进行,防止发生ANR.
13.通过AIDL传递自定义对象,类需要实现Parcelable接口,同时AIDL声明parcelable 类名


ContentProvide:

1.如果希望将数据绑定到ListView,必须提供_ID列。
2.ContentResolver.query()的selection和selectionArgs主要是出于安全性考虑,如果只是使用selection,而不采用?占位符,用户书写SQL语句,比如DROP TABLE *,则存在安全隐患。
3.ContentProvider不提供读写权限时,外部应用无法访问,但是本应用有读写权限。
4.访问ContentProvider的方式有三种:批量ContentResolver.applyBatch(),异步访问Loader和Intent访问
5.以下情况可以考虑使用ContentProvider:
(1)有复杂的数据和文件想要提供给其他应用程序
(2)希望有数据可以被其他应用程序复制
(3)使用搜索框架
否则,只在自己的应用程序中使用SQLite或其他数据持久化方式即可


animation

1.view animation只是修改了视图的绘制位置,但是视图本身并未改变,例如动画移动一个Button,但是响应点击的仍然在原来的位置上。需要使用property animation
2.ValueAnimator,ObjectAnimator和AnimatorSet都属于属性动画,ObjectAnimator派生自ValueAnimator,ObjectAnimator作用的对象属性需要提供存取方法,AnimatorSet是动画的集合。
3.为使动画生效,又是针对一些属性可能需要在onAnimationUpdate()中调用invalidate()
4.使用ViewPropertyAnimator和可替换的方法

Multiple ObjectAnimator objects

ObjectAnimator animX = ObjectAnimator.ofFloat(myView, "x", 50f);ObjectAnimator animY = ObjectAnimator.ofFloat(myView, "y", 100f);AnimatorSet animSetXY = new AnimatorSet();animSetXY.playTogether(animX, animY);animSetXY.start();

One ObjectAnimator

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f);PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f);ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start();

ViewPropertyAnimator

myView.animate().x(50f).y(100f);


0 0
原创粉丝点击