Android基礎

1、廣播

廣播接收者簡單地說就是接收廣播意圖的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是接收到廣播後才建立的,而且生命週期很短,所以子線程可能在沒有執行完就已經被殺死了。
 

2、Application類

Application對象的生命週期是整個程序中最長的,它的生命週期就等於這個程序的生命週期。由於它是全局的單例的,
因此在不一樣的Activity,Service中得到的對象都是同一個對象。因此能夠經過Application來進行一些,
如:數據傳遞、數據共享和數據緩存等操做。
 

3、tools:context

context屬性其實正是的稱呼是activity屬性,有了這個屬性,ide就知道在預覽佈局的時候該採用什麼樣的主題。
同時他還能夠在android studio的java代碼中幫助找到相關的文件(Go to Related files)
 

4、Android中Bundle類的做用

 

5、Bundle類的做用

一、Bundle類用做攜帶數據,它相似於Map,用於存放key-value名值對形式的值。相對於Map,它提供了各類經常使用類型的putXxx()/getXxx()方法,如:
putString()/getString()和putInt()/getInt(),
putXxx()用於往Bundle對象放入數據,
getXxx()方法用於從Bundle對象裏獲取數據。
Bundle的內部其實是使用了HashMap<String, Object>類型的變量來存放putXxx()方法放入的值:
 

二、Intent附加數據的兩種寫法html

第一種寫法,用於批量添加數據到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對象,
 
 

6、notifyDataSetChanged的做用

        notifyDataSetChanged方法經過一個外部的方法控制若是適配器的內容改變時須要強制調用getView來刷新每一個Item的內容,能夠實現動態的刷新列表的功能。
 

7、Activity的生命週期和Fragment的生命週期

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

1.啓動Activity:系統會先調用onCreate方法,而後調用onStart方法,最後調用onResume,Activity進入運行狀態。java

2.當前Activity被其餘Activity覆蓋其上或被鎖屏:系統會調用onPause方法,暫停當前Activity的執行。android

3.當前Activity由被覆蓋狀態回到前臺或解鎖屏:系統會調用onResume方法,再次進入運行狀態。緩存

4.當前Activity轉到新的Activity界面或按Home鍵回到主屏,自身退居後臺:系統會先調用onPause方法,而後調用onStop方法,進入停滯狀態。app

5.用戶後退回到此Activity:系統會先調用onRestart方法,而後調用onStart方法,最後調用onResume方法,再次進入運行狀態。ide

6.當前Activity處於被覆蓋狀態或者後臺不可見狀態,即第2步和第4步,系統內存不足,殺死當前Activity,然後用戶退回當前Activity:再次調用onCreate方法、onStart方法、onResume方法,進入運行狀態。佈局

7.用戶退出當前Activity:系統先調用onPause方法,而後調用onStop方法,最後調用onDestory方法,結束當前Activity。ui

可是知道這些還不夠,咱們必須親自試驗一下才能深入體會,融會貫通。this

 
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都會被調用。
 
        
 

場景演示 : 切換到該Fragmentgoogle

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

 

8、Android中的上下文Context

一、Activity類 、Service類 、Application類本質上都是Context子類, 更多信息你們能夠自行參考源代碼進行理解。
二、加載資源、啓動一個新的Activity、獲取系統服務、獲取內部文件(夾)路徑、建立View操做時等都須要Context的參與
三、獲取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都有本身的上下文,而整個應用只有一個上下文

四、應用程序建立Context實例的狀況有以下幾種狀況:

      一、建立Application 對象時, 並且整個App共一個Application對象

      二、建立Service對象時

      三、建立Activity對象時

    所以應用程序App共有的Context數目公式爲:

                     總Context實例個數 = Service個數 + Activity個數 + 1(Application對應的Context實例)

五、 Activity的context和Application的context的區別在於生命週期的區別,Activity的context是依附在着Activity的生命週期的,而Application的Context的生命週期是依附在整個應用之上的。
 
六、Context:是一個訪問Application環境全局信息的接口,經過它能夠訪問application的資源和相關的類 ,其主要功能以下: 
A. 啓動Activity  
B. 啓動和中止Service  
C. 發送廣播消息(Intent)  
D. 註冊廣播消息(Intent)接收者  
能夠訪問APK中各類資源(如Resources和AssetManager等)  
能夠訪問Package的相關信息  
APK的各類權限管理  


9、onAttachedToWindow() 

onAttachedToWindow 是view 自己的回調,用於初始化一些東西至關於onstart 。當view 被添加到window中,被繪製以前的回調。如addview(this view);
onDetachedFromWindow 是view 自己的回調,用於銷燬一些東西onstop,當view被從window中刪除時的回調。如 removeview(this view);
 
能夠在該方法中設置View的寬和高
 

10、Android DrawerLayout 點擊事件穿透

今天也趕上這個問題,在點擊DrawerLayout中的空白處的時候,底部的content會得到事件。
轉自http://blog.csdn.net/zhang_duo/article/details/24140195,感謝做者。
網上大多數DrawerLayout的實例都是跟google同樣,一個listview,因此listview會得到焦點,
事件就不會傳遞了。可是我是用的include加載的佈局,因此纔會出現這個狀況。
解決方法是:在include進的那個佈局裏面,添加clickable=true。
 

11、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. }
 

12、android手機尺寸和屏幕適配

  一、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
 
  二、設備密度: 
float density = getResources().getDisplayMetrics().density;
dp = px / density
px = dp * (dpi / 160)
density= dpi / 160
 
三、代碼
     /** 
     * 根據手機的分辨率從 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);  
    }  
 
四、專業名詞
dip(dp): (device independent pixels)設備獨立像素,虛擬的像素單位,
它的大小不是一個物理(Phisical)值,而是由操做系統根據屏幕大小和密度動態渲染出來的
dpi:(dots per inch) 每英寸點數
 



相關文章
相關標籤/搜索