Activity生命周期
onCreate()->onStart()->onResume()
->onPause()->onStop()->onDestroy().
Activity启动模式
- standard,标准模式
- singleTop,重用栈顶模式
- singleTask,重用实例,并将实例回到栈顶
- singleInstance,创建新栈管理并共享该实例
随时随地退出程序
使用ActivityCollector管理启动的Activity,最后循环finish
public void finishAll() {
for (Activity activity : activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}
启动活动的最佳方法
在要启动的Activity中使用静态方法,并传递形参,减少开发麻烦
public static void actionStart(Context context, String param) {
Intent intent = new Intent(context, ShowAllBooksActivity.class);
intent.putExtra("param", param);
context.startActivity(intent);
}
布局
- LinearLayout中一个使用weight = “1”,另一个使用wrap_content,则第二个控件wrap_content,第一个控件占满剩余空间
- TabLayout中使用stretchColumns = “1”, 如果不能占满屏幕,指定第二列进行拉伸。
Nine-Patch图形
左边框和上边框喝点标记的区域是图片拉伸的区域
下边框和右边框表示内容被放置的区域
Fragment生命周期
onAttach()->onCreate()->onCreateView()->onStart()->onResume()
->onPause()->onStop()->onDestroyView()->onDestroy()->onDetach()
Fragment注意事项
- OnCreate()仅执行一次
- 使用addToBackBackStack() 时Fragment视图并不会销毁,此时onCreateView()方法也不会执行
- Fragment中也可以使用 savedInstanceState来保存数据,onCreate(),onCreateView(),onActivityCreated()中可以获取此bundle
- 通过限定符可以设置在不同屏幕下的显示效果
Smallest-width Qualifier:layout-sw600dp:屏幕宽度大于600dp时,加载其文件夹下的布局。
广播接收者
- 标准广播是一种完全异步的广播,所有广播接收器几乎 同一时刻接收广播
- 有序广播是一种同步执行的广播,广播是一级一级的传递的,优先级高的可以截断正在传递的广播
静态注册的广播在清单文件中注册,动态注册的广播在代码中注册,且一定要取消注册才行 - 静态广播不需要程序启动即可接收到
- onReceive()方法中不能执行耗时操作
- 广播是一种跨进程通信的方式,要保证只有本应用能接受到,需要用到LocalBroadCastReceiver
- 本地广播无法通过静态注册的方式来接收
持久化
- 文件data/data/$packagename/files/
openFileOutput("data",Context.MODE_PRIVATE);
openFileInput("data",Context.MODE_PRIVATE);
- SharedPreferences
SharedPreferences sf = getSharedPreferences(name,Mode);
SharedPreferences.Editor editor = sf.edit();
editor.apply();
- 数据库
继承SQLiteOpenHelper抽象类
getReadableDatabase();
getWritableDatabase();
多数情况下我们使用的是数据库框架来做
内容提供器
使用一个Uri(由权限和路径组成)进行数据库的增删改查操作。
权限一般使用包名,用于区分程序的
- 路径即表名,用于对表做区分的,实例:
content://com.example.app.provider/table1
query对应的参数:
uri:应用程序表
projection:查询列名
selection:where 约束
selectionArgs:位where中的占位符提供具体的值
orderBy:结果排序方式UriMatcher:内容uri匹配
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(AUTHORITY,PATH, CODE);
注意方法:
getType():获取Uri对象所对应的MIME类型
MIME分为三部分:
以vnd开头
后接android.cursor.dir (以路径结尾)或者android.cursor.item(以id结尾)
最后:vnd.<authority>.<path>
结尾
实例:vnd.android.cursor.dir/vnd.com.example.app.provider.table1uri.getPathSegments():将Uri权限之后的部分以“/”进行分隔。
Service
service执行在主线程
onCreate在服务第一次创建的时候掉用,onStartCommand()则在每次启动服务的时候都会掉用,
Activity和Service通信需要借助binder对象,在Service中创建Binder的实例,在OnBind()方法中返回这个实例,Activity中提供ServiceConnection实例.
ServiceConnection的匿名类,在里面复写onServiceConnected()和 onServiceDisconnected(),这两个方法分别在成功绑定和解绑的时候掉用.onServiceConnected()中可以获取binder对象,进而与Service通信
在bindService中需要传递三个参数,第一个是启动Service的Intent对象,第二个是ServiceConnection实例,第三个是一个标志位。
开启前台服务startForeground(1,notification);//id 和 notification实例
IntentService,开启子线程执行Service,在执行完毕后自动stopService.
位置服务及传感器
通过系统内置的各种Manager及Listener来实现
单元测试
- 继承
AndroidTestCase
并在清单文件中注册instrumentation
和uses-library
标签. setUp()
: 所有的测试用例执行之前调用,用于做一些初始化操作tearDown()
:所有的测试用例执行之后调用,用于做一些资源释放操作- 用
assertEquals
断言的方式来测试相关方法