【Android】基础知识点备忘

1.原则上Worker线程不允许修改UI线程(即主线程)的内容或控件的,但是某些特殊的控件允许被修改,如ProgressBar。 

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之间进行通信, FragmentManager 提供了一个类似于 findViewById() 的方法,专门用于从布局文件中获取Fragment的实例,代码如下所示: RightFragment rightFragment = (RightFragment) getFragmentManager().findFragmentById(R.id.right_fragment);调用 FragmentManager 的 findFragmentById()方法, 可以在Activity中得到相应Fragment的实例,然后就能轻松地调用Fragment里的方法了。


  • Fragment调用Activity的方法:
掌握了如何在Activity中调用Fragment里的方法, 那在Fragment中又该怎样调用Activity里的方法呢?其实这就更简单了,在每个Fragment中都可以通过调用 getActivity()方法来得到和当前Fragment相关联的Activity实例,代码如下所示:MainActivity activity = (MainActivity) getActivity();
有了Activity实例之后, 在Fragment中调用Activity里的方法就变得轻而易举了。 另外当Fragment中需要使用 Context 对象时, 也可以使用 getActivity()方法, 因为获取到的Activity本身就是一个 Context对象了。

  • Fragment之间的通信:
首先在一个Fragment中可以得到与它相关联的Activity, 然后再通过这个Activity去获取另外一个Fragment的实例, 这样也就实现了不同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 是很常见的,这样的耗时很容易造成界面的卡顿。所以通常情况下,如果可以的话一定要避免在主线程中处理数据库。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章