|
4 | 4 |
|
5 | 5 | * FrameLayout(框架布局)
|
6 | 6 |
|
7 |
| - 此布局是五中布局中最简单的布局,Android中并没有对child view的摆布进行控制,这个布局中所有的控件都会默认出现在视图的左上角,我们可以使用``android:layout_margin``,``android:layout_gravity``等属性去控制子控件相对布局的位置。 |
| 7 | + 此布局是五种布局中最简单的布局,Android中并没有对child view的摆布进行控制,这个布局中所有的控件都会默认出现在视图的左上角,我们可以使用``android:layout_margin``,``android:layout_gravity``等属性去控制子控件相对布局的位置。 |
8 | 8 |
|
9 | 9 | * LinearLayout(线性布局)
|
10 | 10 |
|
11 |
| - 一行只控制一个控件的线性布局,所以当有很多控件需要在一个界面中列出时,可以用LinearLayout布局。 |
| 11 | + 一行(或一列)只控制一个控件的线性布局,所以当有很多控件需要在一个界面中列出时,可以用LinearLayout布局。 |
12 | 12 | 此布局有一个需要格外注意的属性:``android:orientation=“horizontal|vertical``。
|
13 | 13 |
|
14 | 14 | * 当`android:orientation="horizontal`时,*说明你希望将水平方向的布局交给**LinearLayout** *,其子元素的`android:layout_gravity="right|left"` 等控制水平方向的gravity值都是被忽略的,*此时**LinearLayout**中的子元素都是默认的按照水平从左向右来排*,我们可以用`android:layout_gravity="top|bottom"`等gravity值来控制垂直展示。
|
|
20 | 20 |
|
21 | 21 | * RelativeLayout(相对布局)
|
22 | 22 |
|
23 |
| - 这个布局也是相对自由的布局,Android 对该布局的child view的 水平layout& 垂直layout做了解析,由此我们可以FrameLayout的基础上使用标签或者Java代码对垂直方向 以及 水平方向 布局中的views任意的控制. |
| 23 | + 这个布局也是相对自由的布局,Android 对该布局的child view的 水平layout& 垂直layout做了解析,由此我们可以FrameLayout的基础上使用标签或者Java代码对垂直方向 以及 水平方向 布局中的views进行任意的控制. |
24 | 24 |
|
25 | 25 | * 相关属性:
|
26 | 26 |
|
|
68 | 68 | **任务栈**是一种后进先出的结构。位于栈顶的Activity处于焦点状态,当按下back按钮的时候,栈内的Activity会一个一个的出栈,并且调用其``onDestory()``方法。如果栈内没有Activity,那么系统就会回收这个栈,每个APP默认只有一个栈,以APP的包名来命名.
|
69 | 69 |
|
70 | 70 | * standard : 标准模式,每次启动Activity都会创建一个新的Activity实例,并且将其压入任务栈栈顶,而不管这个Activity是否已经存在。Activity的启动三回调(*onCreate()->onStart()->onResume()*)都会执行。
|
71 |
| - - singleTop : 栈顶复用模式.这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,所以它的启动三回调就不会执行,同时Activity的``onNewIntent()``方法会被回调.如果Activity已经存在但是不在栈顶,那么作用于*standard模式*一样. |
| 71 | + - singleTop : 栈顶复用模式.这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,所以它的启动三回调就不会执行,同时Activity的``onNewIntent()``方法会被回调.如果Activity已经存在但是不在栈顶,那么作用与*standard模式*一样. |
72 | 72 | - singleTask: 栈内复用模式.创建这样的Activity的时候,系统会先确认它所需任务栈已经创建,否则先创建任务栈.然后放入Activity,如果栈中已经有一个Activity实例,那么这个Activity就会被调到栈顶,``onNewIntent()``,并且singleTask会清理在当前Activity上面的所有Activity.(clear top)
|
73 | 73 | - singleInstance : 加强版的singleTask模式,这种模式的Activity只能单独位于一个任务栈内,由于栈内复用的特性,后续请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了
|
74 | 74 |
|
@@ -128,9 +128,9 @@ Activity的堆栈管理以ActivityRecord为单位,所有的ActivityRecord都放
|
128 | 128 |
|
129 | 129 | 总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。另外,需要注意的几点:
|
130 | 130 |
|
131 |
| -1.布局中的每一个View默认实现了onSaveInstanceState()方法,这样的话,这个UI的任何改变都会自动的存储和在activity重新创建的时候自动的恢复。但是这种情况只有在你为这个UI提供了唯一的ID之后才起作用,如果没有提供ID,将不会存储它的状态。 |
| 131 | +1.布局中的每一个View默认实现了onSaveInstanceState()方法,这样的话,这个UI的任何改变都会自动地存储和在activity重新创建的时候自动地恢复。但是这种情况只有在你为这个UI提供了唯一的ID之后才起作用,如果没有提供ID,app将不会存储它的状态。 |
132 | 132 |
|
133 |
| -2.由于默认的onSaveInstanceState()方法的实现帮助UI存储它的状态,所以如果你需要覆盖这个方法去存储额外的状态信息时,你应该在执行任何代码之前都调用父类的onSaveInstanceState()方法(super.onSaveInstanceState())。 |
| 133 | +2.由于默认的onSaveInstanceState()方法的实现帮助UI存储它的状态,所以如果你需要覆盖这个方法去存储额外的状态信息,你应该在执行任何代码之前都调用父类的onSaveInstanceState()方法(super.onSaveInstanceState())。 |
134 | 134 | 既然有现成的可用,那么我们到底还要不要自己实现onSaveInstanceState()?这得看情况了,如果你自己的派生类中有变量影响到UI,或你程序的行为,当然就要把这个变量也保存了,那么就需要自己实现,否则就不需要。
|
135 | 135 |
|
136 | 136 | 3.由于onSaveInstanceState()方法调用的不确定性,你应该只使用这个方法去记录activity的瞬间状态(UI的状态)。不应该用这个方法去存储持久化数据。当用户离开这个activity的时候应该在onPause()方法中存储持久化数据(例如应该被存储到数据库中的数据)。
|
@@ -217,7 +217,7 @@ public void onRestoreInstanceState(Bundle savedInstanceState) {
|
217 | 217 | android:enabled="true" />
|
218 | 218 | ```
|
219 | 219 |
|
220 |
| -**广播(Boardcast Receiver)的两种动态注册和静态注册有什么区别。** |
| 220 | +**广播(Broadcast Receiver)的两种动态注册和静态注册有什么区别。** |
221 | 221 |
|
222 | 222 | * 静态注册:在AndroidManifest.xml文件中进行注册,当App退出后,Receiver仍然可以接收到广播并且进行相应的处理
|
223 | 223 | * 动态注册:在代码中动态注册,当App退出后,也就没办法再接受广播了
|
@@ -247,7 +247,7 @@ public void onRestoreInstanceState(Bundle savedInstanceState) {
|
247 | 247 | * 【结论】如果在极度极度低内存的压力下,该service还是会被kill掉,并且不一定会restart()
|
248 | 248 |
|
249 | 249 | **onDestroy方法里重启service**
|
250 |
| - * service +broadcast 方式,就是当service走ondestory()的时候,发送一个自定义的广播,当收到广播的时候,重新启动service |
| 250 | + * service +broadcast 方式,就是当service走onDestory()的时候,发送一个自定义的广播,当收到广播的时候,重新启动service |
251 | 251 | * 也可以直接在onDestroy()里startService
|
252 | 252 | * 【结论】当使用类似口口管家等第三方应用或是在setting里-应用-强制停止时,APP进程可能就直接被干掉了,onDestroy方法都进不来,所以还是无法保证
|
253 | 253 |
|
@@ -306,7 +306,7 @@ Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一
|
306 | 306 |
|
307 | 307 | **如何判断应用被强杀**
|
308 | 308 |
|
309 |
| -在Applicatio中定义一个static常量,赋值为-1,在欢迎界面改为0,如果被强杀,application重新初始化,在父类Activity判断该常量的值。 |
| 309 | +在Application中定义一个static常量,赋值为-1,在欢迎界面改为0,如果被强杀,application重新初始化,在父类Activity判断该常量的值。 |
310 | 310 |
|
311 | 311 | **应用被强杀如何解决**
|
312 | 312 |
|
|
0 commit comments