自己用来记录的,不是很完整,有需要可参考
onCreate()->onStart()->onResume()->onPause()->onStop()->onDestory()
A->B
onPause(A)->onCreate(B)->onStart(B)->onResume(B)->onStop(A)
A->Home
onPause(A)->onStop(A)
onStart():表示Activity正在启动,在后台运行
onResume():对用户可见,可交互
onPause():对用户不可见,不可交互
onStop():表示Activity即将被暂停,在后台
finish(); System.exit(0); this.onDestory();
android.os.Process.killProcess(android.os.Process.myPid());
标准模式、栈顶复用模式、栈内复用模式、单实例模式
Activity启动模式
Context的子类,有activity,service
用于在后台完成一个时间跨度比较大的工作,不关联界面
完成工作:
访问网络,播放音乐,文件io操作,大数据量数据库操作、OTA升级
特点:Service在后台,应用退出,服务不会停止
运行在主线程中,
本地service:service对象和启动者在同一个进程
远程service:service对象和启动者不在同一个进程
是不是同一个应用
不可以。 Service和activity是运行在当前app所在的main thread(UI主线程)中的,而耗时操作(如:网络请求、拷贝数据、大文件、OTA升级)会阻塞主线程,出现ANR。
理解,注册方式,应用场景
注册:动态注册、静态注册
(1)ContentProvider是应用间通用的共享数据的方法,Android中通讯录、短信等用到该方式;
(2)也用于跨进程数据分享;
自定义ContentProvider
Margin:容器外距离
Padding:容器内部与边框距离
Gravity:内部元素的对齐方式
Layout-gravity:自身相对于父容器的对齐方式
Android实现用户圆形头像和模糊背景设计
(1)A到B
intent,Bundle
(2)B到A传参,B直接finish()
startActivityForResult
应用未响应
应用卡顿长时间卡顿,无法与用户交互就会报错弹出异常对话框
activity5S内未能响应用户的操作,broadcastReceiver的onreceive方法超过10S,Service执行时间超过20S,一般是在这些组件所在的主线程中执行了耗时操作,IO操作,错误的线程操作等
优化方法:基本都是将耗时操作和IO操作放在子线程中执行
1.Handler消息机制
2.AsyncTask异步任务
3.降低子线程的优先级
4.使用IntentService
文件存储、内容提供者、Message、SQlite
单例模式
构造者模式
责任链模式
状态模式
工厂模式
抽象工厂模式
策略模式
约束布局,减少嵌套
include,merge,ViewStub标签
Android布局优化之include、ViewStub、merge标签
Android之学习Handler原理的理解与常见问题
Activity 代表了一个屏幕的主体,而Fragment可以作为Activity的一个组成元素。
一个Activity可以有若干个(0或n)Fragment构成。你可以把Fragment想象成Activity中的一个控件,只不过相对于一般控件,Fragment与Activity联系更为紧密,随着Activity的生命周期变化,Fragment也随之相应不同的生命周期函数。
(1)Activity向Fragment传数据
(2)Fragment回传数据给Activity?
A、fragment中准备回调接口 接口中声明传值的回调方法
B、在fragment中定义变量 private MyListener myListener
C、重写fragment中的onAttach()方法:listener = (MyLisener)getActivity();
D、fragment触发事件时回传值
E、Activity中实现回调接口 重写回调方法获取回传的值并显示
只能在UI线程里面更新界面吗?
不一定,之所以子线程不能更新界面,是因为Android在线程的方法里面ViewRootImpl类中采用checkThread进行判断是否是主线程,这个类是在onResume里面才生成的,因此,如果这个时候子线程在onCreate方法里面生成更新UI,而且没有做阻塞,就是耗时多的操作,还是可以更新UI的。
(1)嵌入式数据库,体积小
(2)数据库是由底层的sqlite.c执行程序的代码动态生成的,不用人为去创建数据库
(3)SQLiteOpenHelper,使用的时候可以创建一个工具类继承这个抽象类,具体步骤是:
一是继承onCreate、onUpgrade方法,这两个方法升级时候使用;
onCreate方法里面创建表,如果已经初始化,第二次不会调用
二是需要有构造函数,需要传入数据库的版本号、数据库名字等;
三是对外提供函数,可以调用SQliteOpenHelper的字段,instance,单例模式创建,定义数据库的信息。
源码中表示传入数据库的版本号需要从1开始,方便数据库升级。
(4)databases文件的创建需要靠这句话
(5)创建表,在onCreate()方法内通过写sql语句创建表,数据库初始化时候只会创建一次表,第二次不会创建。
_id、主键唯一、自动增长(autoincrement)、类型(Text);
(6)增删改查
通过sql语句查询返回的是游标,然后迭代游标取数据,取完后记得关闭游标,否则耗费性能,数据库也需要关;
插入通过sql语句插入,注意最好监测数据库是否打开再进行操作。