Android基础

一、广播

广播接收者简单地说就是接收广播意图的Java类,此Java类继承BroadcastReceiver类,重写:
public void onReceive(Context context,Intent intent),其中intent可以获得传递的数据;
广播意图就是通过Context.sendBroadcast(Intent intent)或Context.sendOrderedBroadcast(Intent intent)
发送的意图,通过这个语句,能够广播给所有满足条件的组件,比如intent设置了action="com.xiazdong",
则所有在AndroidManifest.xml中设置过<action android:name="com.xiazdong"/>的广播接收者都能够接收到广播;
 
注:onReceive方法必须在10秒内完成,如果没有完成,则抛“Application No Response”当广播接收者onReceive方法
需要执行很长时间时,最好将此耗时工作通过Intent发送给Service,由Service完成,并且不能使用子线程解决,
因为BroadcastReceiver是接收到广播后才创建的,并且生命周期很短,因此子线程可能在没有执行完就已经被杀死了。
 

二、Application类

Application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,
所以在不同的Activity,Service中获得的对象都是同一个对象。所以可以通过Application来进行一些,
如:数据传递、数据共享和数据缓存等操作。
 

三、tools:context

context属性其实正是的称呼是activity属性,有了这个属性,ide就知道在预览布局的时候该采用什么样的主题。
同时他还可以在android studio的java代码中帮助找到相关的文件(Go to Related files)
 

四、Android中Bundle类的作用

 

五、Bundle类的作用

1、Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值。相对于Map,它提供了各种常用类型的putXxx()/getXxx()方法,如:
putString()/getString()和putInt()/getInt(),
putXxx()用于往Bundle对象放入数据,
getXxx()方法用于从Bundle对象里获取数据。
Bundle的内部实际上是使用了HashMap<String, Object>类型的变量来存放putXxx()方法放入的值:
 

2、Intent附加数据的两种写法

第一种写法,用于批量添加数据到Intent:
  Intentintent = new Intent();
  Bundlebundle = new Bundle();//该类用作携带数据
  bundle.putString("name","传智播客");
  intent.putExtras(bundle);//为意图追加额外的数据,意图原来已经具有的数据不会丢失,但key同名的数据会被替换

第二种写法:这种写法的作用等价于上面的写法,只不过这种写法是把数据一个个地添加进Intent,这种写法使用起来比较方便,而且只需要编写少量的代码。
  Intentintent = new Intent();
  intent.putExtra("name","XXX");
  Intent提供了各种常用类型重载后的putExtra()方法,如: putExtra(String name, String value)、putExtra(String name, long value),在putExtra()方法内部会判断当前Intent对象内部是否已经存在一个Bundle对象,如果不存在就会新建Bundle对象,以后调用putExtra()方法传入的值都会存放于该Bundle对象,
 
 

六、notifyDataSetChanged的作用

      notifyDataSetChanged方法通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容,可以实现动态的刷新列表的功能。
 

七、Activity的生命周期和Fragment的生命周期

☆、Activity的生命周期http://blog.csdn.net/liuhe688/article/details/6733407
 

1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。

2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。

3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。

4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。

5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。

7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

但是知道这些还不够,我们必须亲自试验一下才能深刻体会,融会贯通。

 
onCreate(Bundle savedInstanceState):Activity创建时被调用  
onStart():Activity创建或者从后台重新回到前台时被调用  
onResume():Activity创建或者从被覆盖、后台重新回到前台时被调用  
onPause():Activity被覆盖到下面或者锁屏时被调用 
onStop():退出当前Activity或者跳转到新Activity时被调用
onDestroy():退出当前Activity时被调用,调用之后Activity就结束了
 
其他方法:
onWindowFocusChanged(boolean hasFocus):Activity窗口获得或失去焦点时被调用,在onResume之后或onPause之后  
                                      例如:创建时首次呈现在用户面前;当前Activity被其他Activity覆盖;当前Activity转到其他Activity或按Home键回到主                                                                        屏, 自身退居后台;用户退出当前Activity。
onSaveInstanceState(Bundle outState):Activity被系统杀死时被调用. 在onPause之前被调用. 
                                      例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死. 
                                      另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态. 
onRestoreInstanceState(Bundle savedInstanceState):Activity被系统杀死后再重建时被调用. 在onStart之后.
                                      例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity.
                                                                   这两种情况下onRestoreInstanceState都会被调用。
 
        
 

场景演示 : 切换到该Fragment

11-29 14:26:35.095: D/AppListFragment(7649): onAttach
11-29 14:26:35.095: D/AppListFragment(7649): onCreate
11-29 14:26:35.095: D/AppListFragment(7649): onCreateView
11-29 14:26:35.100: D/AppListFragment(7649): onActivityCreated
11-29 14:26:35.120: D/AppListFragment(7649): onStart
11-29 14:26:35.120: D/AppListFragment(7649): onResume

锁屏:

11-29 14:27:35.185: D/AppListFragment(7649): onPause
11-29 14:27:35.205: D/AppListFragment(7649): onSaveInstanceState
11-29 14:27:35.205: D/AppListFragment(7649): onStop

 

屏幕解锁

11-29 14:33:13.240: D/AppListFragment(7649): onStart
11-29 14:33:13.275: D/AppListFragment(7649): onResume

 

切换到其他Fragment:
11-29 14:33:33.655: D/AppListFragment(7649): onPause
11-29 14:33:33.655: D/AppListFragment(7649): onStop
11-29 14:33:33.660: D/AppListFragment(7649): onDestroyView

 

切换回本身的Fragment:

11-29 14:33:55.820: D/AppListFragment(7649): onCreateView
11-29 14:33:55.825: D/AppListFragment(7649): onActivityCreated
11-29 14:33:55.825: D/AppListFragment(7649): onStart
11-29 14:33:55.825: D/AppListFragment(7649): onResume

回到桌面

11-29 14:34:26.590: D/AppListFragment(7649): onPause
11-29 14:34:26.880: D/AppListFragment(7649): onSaveInstanceState
11-29 14:34:26.880: D/AppListFragment(7649): onStop

回到应用

11-29 14:36:51.940: D/AppListFragment(7649): onStart
11-29 14:36:51.940: D/AppListFragment(7649): onResume

 

退出应用

11-29 14:37:03.020: D/AppListFragment(7649): onPause
11-29 14:37:03.155: D/AppListFragment(7649): onStop
11-29 14:37:03.155: D/AppListFragment(7649): onDestroyView
11-29 14:37:03.165: D/AppListFragment(7649): onDestroy
11-29 14:37:03.165: D/AppListFragment(7649): onDetach

 

八、Android中的上下文Context

1、Activity类 、Service类 、Application类本质上都是Context子类, 更多信息大家可以自行参考源代码进行理解。
2、加载资源、启动一个新的Activity、获取系统服务、获取内部文件(夹)路径、创建View操作时等都需要Context的参与
3、获取Context的方法:

(1)MainActivity.this:表示MainActivity对象,一般用在内部类中指示外面的this,如果在内部类直接用this,指示的是内部类本身。因为MainActivity继承Activity,而Activity继承             Context,所以它也可以用来提供Activity Contex;

2this:表示当前对象;一般而言,在哪个类中调用,就是指向该对象。

3getContext():这个是View类中提供的方法,在继承了View的类中才可以调用,返回的是当前View运行在哪个Activity Context中。获取的是当前对象的上下文

4getActivity和getContext其实差不多,一般在fragment中使用的时候,用此方法获取。。Fragment里边的getActivity()不推荐使用原因如下:这个方法会返回当前Fragment所附加的Activity,当Fragment生命周期结束并销毁时,getActivity()返回的是null,所以在使用时要注意判断null或者捕获空指针异常。所以只要判断getActivity()为空,就可以不再执行下面的代码,这完全不影响业务的使用。

5.getApplication():获得Application的对象

(6).getApplicationContext():获得应用程序的上下文。有且仅有一个相同的对象。生命周期随着应用程序的摧毁而销毁。就像是社会,所有的都发生在这个社会上,仅且只有一个社    会。每个Activity都有自己的上下文,而整个应用只有一个上下文

4、应用程序创建Context实例的情况有如下几种情况:

      1、创建Application 对象时, 而且整个App共一个Application对象

      2、创建Service对象时

      3、创建Activity对象时

    因此应用程序App共有的Context数目公式为:

                     总Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)

5、Activity的context和Application的context的区别在于生命周期的区别,Activity的context是依附在着Activity的生命周期的,而Application的Context的生命周期是依附在整个应用之上的。
 
6、Context:是一个访问Application环境全局信息的接口,通过它可以访问application的资源和相关的类,其主要功能如下: 
A.启动Activity 
B.启动和停止Service 
C.发送广播消息(Intent) 
D.注册广播消息(Intent)接收者 
可以访问APK中各种资源(如Resources和AssetManager等) 
可以访问Package的相关信息 
APK的各种权限管理 


九、onAttachedToWindow() 

onAttachedToWindow 是view 本身的回调,用于初始化一些东西相当于onstart 。当view 被添加到window中,被绘制之前的回调。如addview(this view);
onDetachedFromWindow 是view 本身的回调,用于销毁一些东西onstop,当view被从window中删除时的回调。如 removeview(this view);
 
可以在该方法中设置View的宽和高
 

十、Android DrawerLayout 点击事件穿透

今天也遇上这个问题,在点击DrawerLayout中的空白处的时候,底部的content会获得事件。
转自http://blog.csdn.net/zhang_duo/article/details/24140195,感谢作者。
网上大多数DrawerLayout的实例都是跟google一样,一个listview,所以listview会获得焦点,
事件就不会传递了。但是我是用的include加载的布局,所以才会出现这个情况。
解决方法是:在include进的那个布局里面,添加clickable=true。
 

十一、Android 沉浸式功能,我们项目的顶部和手机的状态栏是融合在一起

        
  1. @Override
  2. protectedvoid onCreate(Bundle savedInstanceState){
  3. super.onCreate(savedInstanceState);
  4. // API >= 4.4 or API < 5.0 沉浸式状态栏
  5. if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.KITKAT){
  6. getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  7. }
  8. // API >=5.0 沉浸式状态栏
  9. if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.LOLLIPOP){
  10. Window window = getWindow();
  11. window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  12. window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
  13. |View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
  14. window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
  15. window.setStatusBarColor(Color.TRANSPARENT);
  16. }
  17. }
 

十二、android手机尺寸和屏幕适配

  1、DPI:每英寸的像素数。设备密度
- ldpi (low) ~120dpiQVGA  320x240(0.75)
- mdpi (medium) ~160dpiHVGA  480x320(1.0)
- hdpi (high) ~240dpiWVGA  800x480(1.5)
- xhdpi (extra-high) ~320dpi720p  1280x720(2.0)  标清
- xxhdpi (extra-extra-high) ~480dpi1080p 1920*1080(3.0) 高清
- xxxhdpi (extra-extra-extra-high) ~640dpi4.0
 
  2、设备密度: 
float density = getResources().getDisplayMetrics().density;
dp = px / density
px = dp * (dpi / 160)
density= dpi / 160
 
3、代码
     /** 
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素) 
     */  
    public static int dip2px(Context context, float dpValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (dpValue * scale + 0.5f);  
    }  
  
    /** 
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 
     */  
    public static int px2dip(Context context, float pxValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (pxValue / scale + 0.5f);  
    }  
 
4、专业名词
dip(dp): (device independent pixels)设备独立像素,虚拟的像素单位,
它的大小不是一个物理(Phisical)值,而是由操作系统根据屏幕大小和密度动态渲染出来的
dpi:(dots per inch) 每英寸点数
 





posted on 2017-02-17 14:07  白中夜神  阅读(147)  评论(0编辑  收藏  举报

导航