四大组件

Activity、Service、Broadcast Receiver 、Content Provider

五大布局 : FrameLayout、LinearLayout、AbsoluteLayout、RelativeLayout 、TableLayout

  1. FrameLayout (帧布局)
    这个布局中所有的控件都会默认出现在视图的左上角,我们可以使用android:layout_margin,android:layout_gravity等属性去控制子控件相对布局的位置。
  2. LinearLayout (线性布局)
    这个布局根据属性 (android:orintation = "horizontal|vertical")进行布局。horizontal 横向布局,所有子控件按水平方向从左至右布局;vertical 垂直布局,所有子空间按垂直方向从上至下布局。
  3. AbsoluteLayout (绝对布局)
    布局中所有控件根绝自定义的x,y坐标布局
  4. RelativeLayout (相对布局)
    子控件元素可以相互之间相对布局,也可以相对父控件布局,默认都在左上角。
  5. TableLayout (表格布局)
    将子元素的位置分配到行或列中,一个TableLayout由许多的TableRow组成

Activity 生命周期

Paste_Image.png

如下常用情景:

  • 启动Activity : onCreate() --> onStrart() -->onResume() ,Activity 进入运行态
  • Activity退居后台(当前Activity跳转到新的Activity界面或按Home键回到主屏:onPause() --> onStop()),进入停滞状态。
  • Activity返回前台: onRestart() --> onStart() --> onResume() ,再次回到运行状态。
  • Activity退居后台,且系统内存不足, 系统会杀死这个后台状态的Activity(此时这个Activity引用仍然处在任务栈中,只是这个时候引用指向的对象已经为null),若再次回到这个Activity,则会走onCreate()–>onStart()—>onResume()(将重新走一次Activity的初始化生命周期)
  • 锁屏:onPause()->onStop()
  • 解锁:onReStart() ->onStart()->onResume()

Fragment的生命周期

Paste_Image.png

Fragment 与 Activity 生命周期对照

Paste_Image.png

Activity 四种启动模式: startdard | singleInstance | singleTask | singleTop

//在Manifest.xml文件中设置Activity的启动模式android:launchMode="standard|singleInstance|singleTask|singleTop"  ```1. standard(标准模式): ,每次启动Activity都会创建一个新的Activity实例,并且将其压入任务栈栈顶,而不管这个Activity是否已经存在。Activity的启动三回调(onCreate()->onStart()->onResume())都会执行。2. singleTop(栈顶复用模式):这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,所以它的启动三回调就不会执行,同时Activity的onNewIntent()方法会被回调.如果Activity已经存在但是不在栈顶,那么作用与standard模式一样。3. singleTask(栈内复用模式):创建这样的Activity的时候,系统会先确认它所需任务栈已经创建,否则先创建任务栈.然后放入Activity,如果栈中已经有一个Activity实例,那么这个Activity就会被调到栈顶,onNewIntent(),并且singleTask会清理在当前Activity上面的所有Activity.(clear top)。4. singleInstance(独栈模式)。加强版的singleTask模式,这种模式的Activity只能单独位于一个任务栈内,由于栈内复用的特性,后续请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了。### Service(服务)Service的两种启动方法1. 在Context中通过public boolean bindService(Intent service,ServiceConnection conn,int flags) 方法来进行Service与Context的关联并启动,并且Service的生命周期依附于Context(不求同时同分同秒生!但求同时同分同秒死!!)。2. 通过public ComponentName startService(Intent service)方法去启动一个Service,此时Service的生命周期与启动它的Context无关。3. 要注意的是,whatever,都需要在xml里注册你的Service,就像这样:

android:name=".packnameName.youServiceName"
android:enabled="true" />

### Broadcast Receiver(广播) - 静态注册:在AndroidManifest.xml文件中进行注册,当App退出后,Receiver仍然可以接收到广播并且进行相应的处理- 动态注册:在代码中动态注册,当App退出后,也就没办法再接受广播了### Service (保证不被杀死,没有绝对的方法)1. Service设置成START_STICKY    kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样2. 提升service优先级    在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。  结论:目前看来,priority这个属性貌似只适用于broadcast,对于Service来说可能无效3. 提升service进程优先级    - Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收    - 当service运行在低内存的环境时,将会kill掉一些存在的进程。因此进程的优先级将会很重要,可以在startForeground()使用startForeground()将service放到前台状态。这样在低内存时被kill的几率会低一些。    - 结论:如果在极度极度低内存的压力下,该service还是会被kill掉,并且不一定会restart()onDestroy方法里重启service4. service +broadcast 方式  当service走onDestory()的时候,发送一个自定义的广播,当收到广播的时候,重新启动service也可以直接在onDestroy()里startService 结论:当使用类似口口管家等第三方应用或是在setting里-应用-强制停止时,APP进程可能就直接被干掉了,onDestroy方法都进不来,所以还是无法保证监听系统广播判断Service状态5. 通过系统的一些广播  比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,别忘记加权限   结论:这也能算是一种措施,不过感觉监听多了会导致Service很混乱,带来诸多不便6. 在JNI层,用C代码fork一个进程出来这样产生的进程,会被系统认为是两个不同的进程.但是Android5.0之后可能不行root之后放到system/app变成系统级应用7.  放一个像素在前台(手机QQ),现在也不行的。### 动画:1. tween 补间动画。通过指定View的初末状态和变化时间、方式,对View的内容完成一系列的图形变换来实现动画效果。 Alpha Scale Translate Rotate。2. frame 帧动画 AnimationDrawable 控制 animation-list xml布局3. PropertyAnimation 属性动画,修改View的属性值。### Android数据存储形式:1. SQLite:SQLite是一个轻量级的数据库,支持基本的SQL语法,是常被采用的一种数据存储方式。 Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的api2. SharedPreference: 除SQLite数据库外,另一种常用的数据存储方式,其本质就是一个xml文件,常用于存储较简单的参数设置。3. File: 即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。4. ContentProvider: Android系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。每个Content Provider都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用Content Provider为这些数据定义一个URI,然后其他的应用程序就通过Content Provider传入这个URI来对数据进行操作。### Asset目录与 res目录的区别:res 目录下面有很多文件,例如 drawable,mipmap,raw 等。res 下面除了 raw 文件不会被压缩外,其余文件都会被压缩。同时 res目录下的文件可以通过R 文件访问。Asset 也是用来存储资源,但是 asset 文件内容只能通过路径或者 AssetManager 读取。 [官方文档](https://developer.android.com/studio/projects/index.html)###Android怎么加速启动Activity。 分两种情况,启动应用 和 普通Activity 启动应用 :Application 的构造方法,onCreate 方法中不要进行耗时操作,数据预读取(例如 init 数据) 放在异步中操作 启动普通的Activity:A 启动B 时不要在 A 的 onPause 中执行耗时操作。因为 B 的 onCreate 方法必须等待 A 的 onPause 执行完成后才能运行。### IntentService的使用场景与特点IntentService是Service的子类,是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁Service的问题优点: 1. 一方面不需要自己去new Thread 2. 另一方面不需要考虑在什么时候关闭该ServiceonStartCommand中回调了onStart,onStart中通过mServiceHandler发送消息到该handler的handleMessage中去。最后handleMessage中回调onHandleIntent(intent)。### 如何自定义控件:View与View Group分类。自定义View过程:onMeasure()、onLayout()、onDraw()。1. 自定义属性的声明和获取    1. 分析需要的自定义属性    2. 在res/values/attrs.xml定义声明    3. 在layout文件中进行使用2. 在View的构造方法中进行获取3. 测量onMeasure4. 布局onLayout(ViewGroup)5. 绘制onDraw6. onTouchEvent7. onInterceptTouchEvent(ViewGroup)8. 状态的恢复与保存

更多相关文章

  1. android 在SD卡创建文件夹
  2. android 用VideoView播放本地视频文件
  3. Android(安卓)读写文件的N种写法
  4. tools:context =“activityname”布局文件中定activity的渲染上
  5. Android下各文件方法获取的路径
  6. 大话企业级android读书笔记(三)
  7. Android定制出厂默认输入法
  8. Android我自己的简易(秒表)计时器Chronometer
  9. android manifest.xml中元素含义android

随机推荐

  1. 《第一行代码》学习笔记之服务
  2. android手机开发课小结
  3. Android实现图片宽度100%ImageView宽度且
  4. Android中需要手动关闭的地方总结
  5. 十大技巧优化Android(安卓)App性能
  6. Android硬件加速注意事项
  7. 如何自学Android编程?(Android入门到精通的
  8. 【Android(安卓)Training - Multimedia】
  9. android 打造变化多端的SeekBar(垂直和水
  10. Android热修复原理总结