2.在一个应用程序中,主线程通常用于接收用户的输入,以及将运算的结果反馈给用户,所以说对于一些可能会产生阻塞的操作,必须放置在Worker Thread中。
3.隐藏Activity的标题栏:
在Activity的onCreate()方法中添加一行代码
super.onCreate(saveInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); //就是这一行代码
setContentView(R.layout.firstlayout);
4.隐藏继承自ActionBarActivity的标题栏:
在Activity的的onCreate()方法中添加一行代码
super.onCreate(savedInstanceState);
this.getSupportActionBar().hide(); //就是这一行代码
setContentView(R.layout.activity_main);
隐藏顶部状态栏,进入全屏显示状态:
//设置activity全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
//设置显示的XML,需要注意的是去掉状态栏和全屏的操作要放在setContentView之前,不然会报错。
5.ProgressBar和ProgressDialog的setCancelable方法注意事项:
注意如果在 setCancelable()中传入了 false, 表示 ProgressDialog 是不能通过 Back 键取消
掉的,这时你就一定要在代码中做好控制,当数据加载完成后必须要调用 ProgressDialog 的
dismiss()方法来关闭对话框,否则 ProgressDialog 将会一直存在。
6.android:gravity 是用于指定文字在控件中的对齐方式,而 android:layout_gravity 是用于指定控件在布局中的对齐方式。
7.Activity只有在3.0以上才会默认显示ActionBar,在3.0以下对ActionBar进行一些设置会报告空指针异常,如:(requestWindowFeature(Window.FEATURE_NO_TITLE);ActionBarActivity是v7包中的组件,在全平台都可以使用,只要注意方法的使用,不会出现类似空指针的错误,同时这个组件还能实现在5.0以下使用5.0中的TitleBar等组件,这应该也是google官方将ActionBarActivity作为默认父类的原因之一。
8.startActivityForResult()方法也是用于启动Activity的, 但这个方法期望在Activity销毁的时候能够返回一个结果给上一个活动。毫无疑问,这就是我们的.startActivityForResult()方法接收两个参数,第一个参数还是 Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。
9.动态添加Fragment主要分为5步:
- 创建待添加的Fragment实例
- 获取到FragmentManager,在Activity中可以直接调用getFragmentManager方法
- 开启一个事务,通过方法beginTransaction来开启
- 向容器内加入Fragment,一般使用replace方法实现,需要出入容器的ID和待添加的Fragment实例
- 提交事务,通过调用commit方法来实现
10.
FragmentTransaction 中提供了一个 addToBackStack()方法,可以用于将一个事务添加到返回栈中。
11.Activity和Fragment之间的交互:
- Activity调用Fragment的方法:
- Fragment调用Activity的方法:
有了Activity实例之后, 在Fragment中调用Activity里的方法就变得轻而易举了。 另外当Fragment中需要使用 Context 对象时, 也可以使用 getActivity()方法, 因为获取到的Activity本身就是一个 Context对象了。
- Fragment之间的通信:
12. 使用本地广播的几点优势:
- 可以明确地知道正在发送的广播不会离开我们的程序, 因此不需要担心机密数据泄漏的问题。
- 其他的程序无法将广播发送到我们程序的内部, 因此不需要担心会有安全漏洞的隐患。
- 发送本地广播比起发送系统全局广播将会更加高效。
13.为了确保你的应用程序是安全的,总是使用显式intent当开启一个服务并且不要为它声明intent filter。使用隐式intent来开启一个服务是不不安全的,因为你不能确定到底是哪一个service响应了这个intent用户也看不见哪一个service被启动了。从Android5.0开始,当你用隐式的intent调用bindService()的时候,系统会抛出异常。
14.View类默认的onMeasure()方法只支持EXACTLY模式,如果你继承View定义一个控件,它是不支持wrap_content属性的,所以就要重写onMeasure()方法来指定wrap_content的大小.
15.对于view而言,它的MeasureSpec由父容器的MesaureSpec和自身的LayoutParams共同决定.
16.当View采用固定的宽/高的时候,不管父容器的MeasureSpec是什么,View的MeasureSpec都是EXACTLY模式,并且大小遵循LayoutParams的大小.
17.当View的宽/高是match_parent的时候,如果父容器的模式是EXACTLY,那么View也是EXACTLY模式,并且大小是父容器的剩余空间;如果父容器是AT_MOST模式的时候,那么View也是AT_MOST模式,并且大小不会超过父容器的剩余空间;
18.当View的宽/高是wrap_content的时候,不管父容器的模式是EXACTLY还是AT_MOST,View的模式总是AT_MOST,并且大小不能超过父容器的剩余空间.
19.在自定义ViewGroup的时候,通常会去重写onLayout()方法来控制其子View显示的逻辑.同样,如果需要支持wrap_content属性,那么它还必须重写onMeasure()方法,这点与View是相同的.
20.ViewGroup如果没有指定背景颜色的时候,不会调用onDraw()方法,而是调用dispatchDraw()方法,来遍历所有的子View,并调用子View的绘制方法.
21.数据库的操作很重,一次读写操作花费 10~20ms 是很常见的,这样的耗时很容易造成界面的卡顿。所以通常情况下,如果可以的话一定要避免在主线程中处理数据库。