Android基礎(一)

1.android:clipToPadding屬性的分析

clipToPadding屬性定義了是否允許ViewGroup在padding中繪製,該值默認爲true,即不允許.
 * 所以若我們給ListView設置了android:paddingTop="70dip" android:paddingBottom="70dip"
 * 那麼我們可以看到ListView的頭部以上和尾部以下都佔有70大小的padding,在滑動ListView的過程
 * 中這個padding當然是存在的.在padding部分是看不到ListView的item的,本質上是在這兩部分沒有繪製
 * 我們的ListView
 * 假若我們此時爲ListView設置屬性android:clipToPadding="false",同樣再滑動ListView此時可以
 * 發現在ListView的頭部以上和尾部以下都佔有70大小的padding部分依然可以顯示我們的ListView的
 * item,本質上是在這兩部分繪製了我們的ListView
 * 
 * 該屬性很適合的應用場景:
 * 設置ListView的第一個(最後一個)Item距離屏幕TOP(BOTTOM)有一段距離的情況

2. android:scrollbarStyle屬性的分析

insideInset、insideOverlay、outsideInset、outsideOverlay屬性

3.CardView 屬性

android.support.v7.widget.CardView
complie ‘com.android.support:cardview-v7:23.1.0’
CardView繼承至FrameLayout類,可以在一個卡片佈局中一致性的顯示內容,卡片可以包含圓角和陰影。CardView是一個Layout,可以佈局其他View。

CardView常用屬性:
card_view:cardElevation 陰影的大小
card_view:cardMaxElevation 陰影最大高度
card_view:cardBackgroundColor 卡片的背景色
card_view:cardCornerRadius 卡片的圓角大小
card_view:contentPadding 卡片內容於邊距的間隔
card_view:contentPaddingBottom
- card_view:contentPaddingTop
- card_view:contentPaddingLeft
- card_view:contentPaddingRight
- card_view:contentPaddingStart
- card_view:contentPaddingEnd
card_view:cardUseCompatPadding 設置內邊距,V21+的版本和之前的版本仍舊具有一樣的計算方式
card_view:cardPreventConrerOverlap 在V20和之前的版本中添加內邊距,這個屬性爲了防止內容和邊角的重疊

4.Android5.0新增的兩個XML屬性elevation和translationZ 屬性

android5.0 引入了Z軸的概念,於是就有着這種風格,也就是目前比較火的Material Design。

  1. android:elevation 設置該組件“浮”起來的高度,通過設置該屬性可以讓該組件呈現3D效果。
  2. android:translationZ 設置該組件在Z方向(垂直屏幕方向)上的位移。
    對應的Java方法:setElevation(float) setTranslationZ(float)

5. 設置text的外觀 android:textAppearance ,Button 設置button的style

android:textAppearance=”@style/TextAppearance.AppCompat.Button”
style=”?android:borderlessButtonStyle” 沒有邊框的按鈕
如“android:textAppearance=“?android:attr/textAppearanceLargeInverse”這裏引用的是系統自帶的一個外觀,

?表示系統是否有這種外觀,否則使用默認的外觀。

可設置的值如下:

textAppearanceButton/

textAppearanceInverse/

textAppearanceLarge/

textAppearanceLargeInverse/

textAppearanceMedium/

textAppearanceSmallInverse/

textAppearanceMediumInverse/
textAppearanceSmall/

6.Android系統中設置TextView的行間距(非行高)android:lineSpacingExtra android:lineSpacingMultiplier

1、android:lineSpacingExtra
設置行間距,如”3dp”。
2、android:lineSpacingMultiplier
設置行間距的倍數,如”1.2″。

7..android 的系統架構(上-下)

1.Application (應用)
2.Application Framework(應用程序框架層) 系統自帶的API  Activity、Package、ResouseManager 。。
3.Libraries(系統運行庫c/c++庫), Sqlite,OpenGL,webkit
4.Linux kernel(Linux內核)硬件驅動:音頻,照相機,藍牙,WiFi驅動等

8.Android studio的使用:

Android studio使用教程系列:http://segmentfault.com/a/1190000002411926#articleHeader1

Android studio使用教程快捷鍵使用:http://segmentfault.com/a/1190000002418983

Android studio使用教程Gradle使用:http://segmentfault.com/a/1190000002439306

Android studio模擬器 配置:http://www.tuicool.com/articles/6RJ3mqJ

9.引用第三方

第三方類庫jar包

這就簡單多了,直接將jar包拷貝到app/libs下,然後在app下的build.gradle中添加此jar的依賴。如下:
dependencies {
compile ‘com.android.support:support-v4:19.1.0’
compile files(‘libs/libammsdk.jar’)
compile files(‘libs/universal-image-loader-1.8.6-with-sources.jar’)
compile files(‘libs/YoumiSdk_v5.00_2015-01-08.jar’)
}
第三方so庫

通常來說,我們調用第三方的so庫是不需要額外工作的,只需將其放入指定目錄,然後在java文件中load即可。
比如我引用之前《第一個NDK程序》中編譯出的libFirstLib.so,將其放到app/src/main/jniLibs/armeabi/下,在源碼中引用:
static {
System.loadLibrary(“FirstLib”);
}
第三方類庫源碼

import medule 進去之後再project setting 裏面導入library即可,或者直接在build.gradle裏面配置也行:

參考:http://www.open-open.com/lib/view/open1415793464648.html Android studio gradle配置

10.消除“Permission is only granted to system apps”錯誤

在AndroidManifest.xml中使用瞭如下的配置:

就會報錯:Permission is only granted to system apps
原因如下:
此類權限僅授予系統級應用,可以修改下Link Error Checking項的安全級別;
In Eclipse: Window -> Preferences -> Android -> Lint Error Checking
在ID列表中,找到ID = ProtectedPermission,設置Serverity低於Error,比如Warning級別就好了。

11.android 強大的Intent(意圖)

給Intent帶上附加值Ertra:

Intent i = new Intent(CSM_listView.this,ImageViewer.class);
i.putExtra("icon",data.icon);
startActivity(i);

接收方可以接收查看附加數據:

int icon = getIntent().getIntExtra("icon",0);
也可以分兩步,方便查詢多個附加數據:
Bundle bundle = getIntent().getExtras();
boolean willContinue = bundle.getBoolean("continueGame",false);
int icon = bundle.getInt ("icon",0);

發Intent啓動Activity並獲取返回值

i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(Intent intent, int requestCode);
並定義對返回值的處理函數
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
      if(resultCode == RESULT_OK ){ //操作沒錯誤
       Bundle extras = data.getExtras();
       bmp = (Bitmap)extras.get("data");//關鍵詞是“data”
       viewPhoto.setImageBitmap(bmp);
     }
}

12.全屏加無狀態欄:

requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                  WindowManager.LayoutParams.FLAG_FULLSCREEN);

13.灰色的小提示框 Toast

Toast toast = Toast.makeText(this,”不知閣下尊姓大名?”,Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER,0,0);//設置顯示的位置
toast.show();

14.Preference使用

 如果要查找Preference中的控件(如,CheckBoxPreference,EditTextPreference等)用以下方法:
PreferenceManager manager = getPreferenceManager();

CheckBoxPreference password = (EditTextPreference) manager.findPreference(“password”);

獲取Preference中的值使用:

PreferenceManager.getDefaultSharedPreferences(context).getString(“user”,”“);
或者分兩步,方便查詢同一個Preference中的多個值
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
boolean willMusic = sharedPreferences.getBoolean(“music”,true);
String username = sharedPreferences. getString(“user”,”“);

15.android軟件盤的使用:

Android中軟鍵盤的使用是非常多的,下面爲軟鍵盤常用的設置;
1、橫屏時,點擊輸入框出現全鍵盤解決方案: 在EditText、searchview等控件中加
android:imeOptions=”flagNoExtractUi”

2、豎屏時,安卓會出現半屏。
case1:你的輸入框處於中下的位置,這樣的話,鍵盤可能擋住輸入框。 解決方法:在manifest中對activity設置
android:windowSoftInputMode=”adjustResize”
這樣activity的主窗口總會resize爲鍵盤提供空間
case2:你的輸入框處於偏上面,一般情況下這樣就不會有什麼問題,但是如果你的界面縱向方面使用的是layout_weight即比重來分佈頁面的話,
軟件盤會壓縮整個window,導致輸入框部分被壓縮。 解決方法:在manifest中對activity設置
android:windowSoftInputMode=”adjustPan”
這樣鍵盤不會對壓縮原窗口,只會遮蓋下面一部分內容。這樣輸入框不會被壓縮了。
3、剛進入一個activity,會focus 輸入框,這時會主動彈出軟鍵盤,如果不希望自動彈出,那麼可先讓其他的不重要的控件獲取焦點,然後一個定時器
再讓EditText獲取焦點即可!

4、判斷軟鍵盤當前是否處於彈出狀態
if(getWindow().getAttributes().softInputMode==WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)

5、手動隱藏軟鍵盤
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

6、手動彈出軟鍵盤
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);

16.通用的xml和json解析

1.T通用xml數據解析
SAX解析器:
SAX(Simple API for XML)解析器是一種基於事件的解析器,它的核心是事件處理模式,主要是圍繞着事件源以及事件處理器來工作的。當事件源產生事件後,調用事件處理器相應的處理方法,一個事件就可以得到處理。在事件源調用事件處理器中特定方法的時候,還要傳遞給事件處理器相應事件的狀態信息,這樣事件處理器才能夠根據提供的事件信息來決定自己的行爲。
SAX解析器的優點是解析速度快,佔用內存少。非常適合在Android移動設備中使用。
DOM解析器:
DOM是基於樹形結構的的節點或信息片段的集合,允許開發人員使用DOM API遍歷XML樹、檢索所需數據。分析該結構通常需要加載整個文檔和構造樹形結構,然後纔可以檢索和更新節點信息。
由於DOM在內存中以樹形結構存放,因此檢索和更新效率會更高。但是對於特別大的文檔,解析和加載整個文檔將會很耗資源。
PULL解析器:
PULL解析器的運行方式和SAX類似,都是基於事件的模式。不同的是,在PULL解析過程中,我們需要自己獲取產生的事件然後做相應的操作,而不像SAX那樣由處理器觸發一種事件的方法,執行我們的代碼。PULL解析器小巧輕便,解析速度快,簡單易用,非常適合在Android移動設備中使用,Android系統內部在解析各種XML時也是用PULL解析器。

2.T通用json數據解析

詳細請看:http://blog.csdn.net/lyx2007825/article/details/7900675

17.HTTPUrlConnection post請求

private static final int TIMEOUT_IN_MILLIONS = 10 * 1000; // 超時時間
public static String doPost(String url, Map<String,Object> params) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";

try {
URL realUrl = new URL(url);
// 打開和URL之間的連接
HttpURLConnection conn = (HttpURLConnection) realUrl
.openConnection();
// 設置通用的請求屬性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
conn.setRequestProperty("charset", "utf-8");
conn.setUseCaches(false);
// 發送POST請求必須設置如下兩行
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setReadTimeout(TIMEOUT_IN_MILLIONS);
conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);

if (params != null && !params.toString().equals("")) {
// 獲取URLConnection對象對應的輸出流
out = new PrintWriter(conn.getOutputStream());
// 發送請求參數
out.print(params);
// flush輸出流的緩衝
out.flush();
}
// 定義BufferedReader輸入流來讀取URL的響應
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;

//  JSONObject json = new JSONObject(result.toString());
// 
//   bool = json.getBoolean("bool");
}
} catch (Exception e) {
e.printStackTrace();
}
// 使用finally塊來關閉輸出流、輸入流
finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}

18.android動畫

android動畫一種是幀動畫(Frame Animation),一種是補間動畫(Tween Animation)。幀動畫是提供了一種逐幀播放圖片的動畫方式,播放事先做好的圖像,與gif圖片原理類似,就像是在放電影一樣。補間動畫可以實現View組件的移動、放大、縮小以及漸變等效果。
<?xml version="1.0" encoding="utf-8"?>  
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"  
    android:oneshot="false" >  

    <item  
        android:drawable="@drawable/app_loading0"  
        android:duration="150"/>  
    <item  
        android:drawable="@drawable/app_loading1"  
        android:duration="150"/>  

</animation-list>  

animation-list 是動畫列表,中間放很多的item 也就是組成幀動畫的圖片,
android:drawable[drawable]//加載Drawable對象
android:duration[long]//每一幀動畫的持續時間(單位ms)
android:oneshot[boolean]//動畫是否只運行一次,true運行一次,false重複運行

19.ListView的屬性

android:cacheColorHint=”#00000000” //設置拖動背景色爲透明

 android:dividerHeight="30px"         //listview item之間的高度

 android:divider="@drawable/ic_launcher"    //listview item之間的背景或者說是顏色

 android:fadingEdge="vertical"         //上邊和下邊有黑色的陰影      值爲none的話就沒有陰影

 android:scrollbars="horizontal|none"   //只有值爲horizontal|vertical的時候,纔會顯示滾動條,並且會自動影藏和顯示

 android:fastScrollEnabled="true"        //快速滾動效果,配置這個屬性,在快速滾動的時候旁邊會出現一個小方塊的快速滾動效果,自動隱藏和顯示,

 android:scrollbarStyle="outsideInset"  //四個值的含義如下

1>outsideInset :  該ScrollBar顯示在視圖(view)的邊緣,增加了view的padding. 如果可能的話,該ScrollBar僅僅覆蓋這個view的背景.

2>outsideOverlay :  該ScrollBar顯示在視圖(view)的邊緣,不增加view的padding,該ScrollBar將被半透明覆蓋

3>insideInset :該ScrollBar顯示在padding區域裏面,增加了控件的padding區域,該ScrollBar不會和視圖的內容重疊.

android:fastScrollEnabled=”false”
25
4>insideOverlay : 該ScrollBar顯示在內容區域裏面,不會增加了控件的padding區域,該ScrollBar以半透明的樣式覆蓋在視圖(view)的內容上.
首先是stackFromBottom屬性,這隻該屬性之後你做好的列表就會顯示你列表的最下面,值爲true和false
android:stackFromBottom=”true”
第二是 transciptMode屬性,需要用ListView或者其它顯示大量Items的控件實時跟蹤或者查看信息,並且希望最新的條目可以自動滾動到可視範圍內。通過設置的控件transcriptMode屬性可以將Android平臺的控件(支持ScrollBar)自動滑動到最底部。 android:transcriptMode=”alwaysScroll”
第三cacheColorHint屬性,很多人希望能夠改變一下它的背景,使他能夠符合整體的UI設計,改變背景背很簡單只需要準備一張圖片然後指定屬性android:background=”@drawable/bg”,不過不要高興地太早,當你這麼做以後,發現背景是變了,但是當你拖動,或者點擊list空白位置的時候發現ListItem都變成黑色的了,破壞了整體效果。
如果你只是換背景的顏色的話,可以直接指定android:cacheColorHint爲你所要的顏色,如果你是用圖片做背景的話,那也只要將android:cacheColorHint指定爲透明(#00000000)就可以了
第四divider屬性,該屬性作用是每一項之間需要設置一個圖片做爲間隔,或是去掉item之間的分割線
android:divider=”@drawable/list_driver” 其中 @drawable/list_driver 是一個圖片資源,如果不想顯示分割線則只要設置爲android:divider=”@drawable/@null” 就可以了
第五fadingEdge屬性,上邊和下邊有黑色的陰影
android:fadingEdge=”none” 設置後沒有陰影了~
第六scrollbars屬性,作用是隱藏listView的滾動條,
android:scrollbars=”none”與setVerticalScrollBarEnabled(true);的效果是一樣的,不活動的時候隱藏,活動的時候也隱藏
第七fadeScrollbars屬性,android:fadeScrollbars=”true” 配置ListView佈局的時候,設置這個屬性爲true就可以實現滾動條的自動隱藏和顯示。

20.adb常用命令

adb install 軟件位置,安裝軟件
adb uninstall 包名:卸載模擬器的軟件
adb push 保存
adb pull
1、簡介:
ADB全稱Android Debug Bridge, 是android sdk裏的一個工具, 用這個工具可以直接操作管理android模擬器或者真實的andriod設備。
常用命令:
1)顯示系統中全部Android平臺: list targets
2)顯示系統中全部AVD(模擬器):android list avd
3)創建AVD(模擬器):android create avd –name 名稱 –target 平臺編號
4)啓動模擬器:emulator -avd 名稱 -sdcard ~/名稱.img (-skin 1280x800)
5)刪除AVD(模擬器):android delete avd –name 名稱
6)創建SDCard:mksdcard 1024M ~/名稱.img
7)AVD(模擬器)所在位置:
Linux(~/.android/avd)
Windows(C:\Documents and Settings\Administrator.android\avd)
8)啓動DDMS:ddms
9)顯示當前運行的全部模擬器:adb devices
10)對某一模擬器執行命令:adb -s 模擬器編號 命令
11)安裝應用程序:adb install -r 應用程序.apk
12)獲取模擬器中的文件:adb pull
13)向模擬器中寫文件:adb push
14)進入模擬器的shell模式:adb shell
15)啓動SDK,文檔,實例下載管理器:adb android
16)缷載apk包:adb uninstall apk包的主包名
17)查看adb命令幫助信息:adb help
18)在命令行中查看LOG信息:adb logcat -s 標籤名

21.Application的作用

    Application和Activity,Service一樣是android框架的一個系統組件,當android程序啓動時系統會創建一個 application對象,用來存儲系統的一些信息。通常我們是不需要指定一個Application的,這時系統會自動幫我們創建,如果需要創建自己 的Application,也很簡單創建一個類繼承 Application並在manifest的application標籤中進行註冊(只需要給Application標籤增加個name屬性把自己的 Application的名字定入即可)。

android系統會爲每個程序運行時創建一個Application類的對象且僅創建一個,所以Application可以說是單例 (singleton)模式的一個類.且application對象的生命週期是整個程序中最長的,它的生命週期就等於這個程序的生命週期。因爲它是全局 的單例的,所以在不同的Activity,Service中獲得的對象都是同一個對象。所以通過Application來進行一些,數據傳遞,數據共享 等,數據緩存等操作

(一).傳遞數據:
假如有一個Activity A, 跳轉到 Activity B ,並需要推薦一些數據,通常的作法是Intent.putExtra() 讓Intent攜帶,或者有一個Bundle把信息加入Bundle讓Intent推薦Bundle對象,實現傳遞。但這樣作有一個問題在 於,Intent和Bundle所能攜帶的數據類型都是一些基本的數據類型,如果想實現複雜的數據傳遞就比較麻煩了,通常需要實現 Serializable或者Parcellable接口。這其實是Android的一種IPC數據傳遞的方法。如果我們的兩個Activity在同一個 進程當中爲什麼還要這麼麻煩呢,只要把需要傳遞的對象的引用傳遞過去就可以了。
基本思路是這樣的。在Application中創建一個HashMap

22.自定義xml屬性

一、在res/values文件下定義一個attrs.xml文件,代碼如下:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<declare-styleable name="ToolBar"> 
<attr name="buttonNum" format="integer"/> 
<attr name="itemBackground" format="reference|color"/> 
</declare-styleable> 
</resources>

二、在佈局xml中如下使用該屬性:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:toolbar="http://schemas.android.com/apk/res/cn.zzm.toolbar" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<cn.zzm.toolbar.ToolBar android:id="@+id/gridview_toolbar" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_alignParentBottom="true" 
android:background="@drawable/control_bar" 
android:gravity="center" 
toolbar:buttonNum="5" 
toolbar:itemBackground="@drawable/control_bar_item_bg"/> 
</RelativeLayout>

三、在自定義組件中,可以如下獲得xml中定義的值:

TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ToolBar); 
buttonNum = a.getInt(R.styleable.ToolBar_buttonNum, 5); 
itemBg = a.getResourceId(R.styleable.ToolBar_itemBackground, -1);
a.recycle();

就這麼簡單的三步,即可完成對自定義屬性的使用。


首先來看看attrs.xml文件。
該文件是定義屬性名和格式的地方,需要用

<declare-styleable name="ToolBar"></declare-styleable>

包圍所有屬性。其中name爲該屬性集的名字,主要用途是標識該屬性集。那在什麼地方會用到呢?主要是在第三步。看到沒?在獲取某屬性標識時,用到”R.styleable.ToolBar_buttonNum”,很顯然,他在每個屬性前面都加了”ToolBar_”。
在來看看各種屬性都有些什麼類型吧:string , integer , dimension , reference , color , enum.
前面幾種的聲明方式都是一致的,例如:。
只有enum是不同的,用法舉例:

<attr name="testEnum"> 
<enum name="fill_parent" value="-1"/> 
<enum name="wrap_content" value="-2"/> 
</attr>

如果該屬性可同時傳兩種不同的屬性,則可以用“|”分割開即可。
讓我們再來看看佈局xml中需要注意的事項。
首先得聲明一下:xmlns:toolbar=http://schemas.android.com/apk/res/cn.zzm.toolbar
注意,“toolbar”可以換成其他的任何名字,後面的url地址必須最後一部分必須用上自定義組件的包名。自定義屬性了,在屬性名前加上“toolbar”即可。
最後來看看java代碼中的注意事項。
在自定義組件的構造函數中,用
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ToolBar);
來獲得對屬性集的引用,然後就可以用“a”的各種方法來獲取相應的屬性值了。這裏需要注意的是,如果使用的方法和獲取值的類型不對的話,則會返回默認值。因此,如果一個屬性是帶兩個及以上不用類型的屬性,需要做多次判斷,知道讀取完畢後才能判斷應該賦予何值。當然,在取完值的時候別忘了回收資源哦!

23.解決應用點擊home退出程序的bug:

在activity的ocreate()方法添加super.onCreate(savedInstanceState);

            if(!this.isTaskRoot()) { //判斷該Activity是不是任務空間的源Activity,“非”也就是說是被系統重新實例化出來
            //如果你就放在launcher Activity中話,這裏可以直接return了
                        Intent mainIntent=getIntent(); 
            String action=mainIntent.getAction();
            if(mainIntent.hasCategory(Intent.CATEGORY_LAUNCHER) && action.equals(Intent.ACTION_MAIN)) {
                finish();
                return;//finish()之後該活動會繼續執行後面的代碼,你可以logCat驗證,加return避免可能的exception
            }
        }

24.判斷當前是平板還是手機:

public boolean isTable(Context context) {

return (context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}

25.android style 和theme

Android上的Style分爲了兩個方面:
1.Theme是針對窗體級別的,改變窗體樣式;
2.Style是針對窗體元素級別的,改變指定控件或者Layout的
@color/white
true
@drawable/back (更改返回按鈕的圖標比如ToolBar)
@style/Daily.DrawerArrowStyle
false
true
@drawable/back
@color/ab_background_light
@color/black

自定義Dialog的Style:

<style name="Loading_Dialog" parent="@android:style/Theme.Dialog">
<item name="android:backgroundDimAmount">0.6</item>  <!-- 灰度 -->   
<item name="android:windowBackground">@android:color/transparent</item>  <!-- 背景透明 -->                                                   
<item name="android:windowFrame">@null</item><!-- 沒有邊框 -->   
<item name="android:windowNoTitle">true</item><!-- 無標題 -->   
<item name="android:windowIsFloating">true</item><!-- 是否懸浮在activity上 -->   
<item name="android:windowIsTranslucent">true</item><!-- 半透明 -->   
<item name="android:backgroundDimEnabled">true</item><!-- 模糊 -->   

<item name="android:windowContentOverlay">@null</item><!-- 對話框是否有遮蓋 --><item name="android:windowAnimationStyle">@style/dialog_animation</item><!-- 彈出或者進入時的動畫效果 --><item name="android:colorBackgroundCacheHint">@null</item><!-- 背景緩存顏色 -->
</style>

26.shape用於設定形狀,可以在selector,layout等裏面使用,有6個子標籤

<!-- 圓角 --><corners
        android:radius="9dp"
        android:topLeftRadius="2dp"
        android:topRightRadius="2dp"
        android:bottomLeftRadius="2dp"
        android:bottomRightRadius="2dp"/><!-- 設置圓角半徑 --><!-- 漸變 --><gradient
        android:startColor="@android:color/white"
        android:centerColor="@android:color/black"
        android:endColor="@android:color/black"
        android:useLevel="true"
        android:angle="45"
        android:type="radial"
        android:centerX="0"
        android:centerY="0"
        android:gradientRadius="90"/><!-- 間隔 --><padding
        android:left="2dp"
        android:top="2dp"
        android:right="2dp"
        android:bottom="2dp"/><!-- 各方向的間隔 --><!-- 大小 --><size
        android:width="50dp"
        android:height="50dp"/><!-- 寬度和高度 --><!-- 填充 --><solid
        android:color="@android:color/white"/><!-- 填充的顏色 --><!-- 描邊 --><stroke
        android:width="2dp"
        android:color="@android:color/black"
        android:dashWidth="1dp"
        android:dashGap="2dp"/>

27.ImageView.scaleType的幾個屬性

  1. SetScaleType(ImageView.ScaleType.CENTER);
    按圖片的原來size居中顯示,當圖片長/寬超過View的長/寬,則截取圖片的居中部分顯示

  2. SetScaleType(ImageView.ScaleType.CENTER_CROP);
    按比例擴大圖片的size居中顯示,使得圖片長(寬)等於或大於View的長(寬)

  3. setScaleType(ImageView.ScaleType.CENTER_INSIDE);
    將圖片的內容完整居中顯示,通過按比例縮小或原來的size使得圖片長/寬等於或小於View的長/寬

setScaleType(ImageView.ScaleType.FIT_CENTER);
把圖片按比例擴大/縮小到View的寬度,居中顯示

  1. FIT_START, FIT_END在圖片縮放效果上與FIT_CENTER一樣,只是顯示的位置不同,FIT_START是置於頂部,FIT_CENTER居中,FIT_END置於底部。
    在此就不給出示例了。

  2. FIT_XY
    不按比例縮放圖片,目標是把圖片塞滿整個View。

28.File 類讀寫文件 :

如果需要在程序中使用sdcard進行數據的存儲,那麼需要在AndroidMainfset.xml文件中
進行權限的配置:
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片

在對SD卡進行讀寫的時候會用到的知識點:
Environment類的靜態方法:
* getDataDirectory(); 獲取android中的data目錄;
* getExternalStorgeDirectory(); 獲取到外部存儲的目錄一般指SD卡;
* getDownloadCacheDirectory(); 獲取到下載的緩存目錄;
* getExternalStorageState(); 獲取外部設置的當前狀態,sd卡

Android 中外部存儲的狀態情況如下,我們比較常用的應該是 MEDIA_MOUNTED(sd卡存在並且可以進行讀寫):
* MEDIA_MOUNTED sd卡中可以進行讀寫;
* MEDIA_MOUNTED_READ_ONLY sd卡 存在,只可以進行讀的操作

Android 對於外部存儲的狀態判斷:
* getRootDirectory(); 獲取到 Android Root 路徑;
* isExternalStorageEmulated(); 判斷外部存儲是否有效;
* isExternalStorageRemovable(); 判斷外部存儲是否可以移除;

29.drawable 不同文件夾

每種切圖都需要下面表格中的展示的三種規格

像素密度 係數 Logo分辨率
hdpi 1.5 72 * 72
xhdpi 2.0 96 * 96
xxhdpi 3.0 144 * 144

30.socket中TCP的三次握手建立連接詳解

我們知道tcp建立連接要進行“三次握手”,即交換三個分組。大致流程如下:
客戶端向服務器發送一個SYN J
服務器向客戶端響應一個SYN K,並對SYN J進行確認ACK J+1
客戶端再想服務器發一個確認ACK K+1
只有就完了三次握手當客戶端調用connect時,觸發了連接請求,向服務器發送了SYN J包,這時connect進入阻塞狀態;服務器監聽到連接請求,即收到SYN J包,調用accept函數接收請求向客戶端發送SYN K ,ACK J+1,這時accept進入阻塞狀態;客戶端收到服務器的SYN K ,ACK J+1之後,這時connect返回,並對SYN K進行確認;服務器收到ACK K+1時,accept返回,至此三次握手完畢,連接建立。

31.socket中TCP的四次握手釋放連接詳解

上面介紹了socket中TCP的三次握手建立過程,及其涉及的socket函數。現在我們介紹socket中的四次握手釋放連接的過程,
過程如下:
1.某個應用進程首先調用close主動關閉連接,這時TCP發送一個FIN M;
2.另一端接收到FIN M之後,執行被動關閉,對這個FIN進行確認。它的接收也作爲文件結束符傳遞給應用進程,因爲FIN的接收意味着應用進程在相應的連接上再也接收不到額外數據;
3.一段時間之後,接收到文件結束符的應用進程調用close關閉它的socket。這導致它的TCP也發送一個FIN N;
4.接收到這個FIN的源發送端TCP對它進行確認。

32.Android動畫舉例解析–XML


[html] view plaincopy

<pre name="code" class="html">    <?xml version="1.0" encoding="utf-8"?>  
    <set xmlns:android="http://schemas.android.com/apk/res/android" >  
    <alpha  
    android:fromAlpha="0.1"  
    android:toAlpha="1.0"  
    android:duration="3000"  
    />  
    <!-- 透明度控制動畫效果 alpha  
            浮點型值:  
                fromAlpha 屬性爲動畫起始時透明度  
                toAlpha   屬性爲動畫結束時透明度  
                說明:  
                    0.0表示完全透明  
                    1.0表示完全不透明  
                以上值取0.0-1.0之間的float數據類型的數字  

            長整型值:  
                duration  屬性爲動畫持續時間  
                說明:       
                    時間以毫秒爲單位  
    -->  
    </set>  


[html] view plaincopy

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android">  
   <scale    
          android:interpolator=  
                     "@android:anim/accelerate_decelerate_interpolator"  
          android:fromXScale="0.0"  
          android:toXScale="1.4"  
          android:fromYScale="0.0"  
          android:toYScale="1.4"  
          android:pivotX="50%"  
          android:pivotY="50%"  
          android:fillAfter="false"  
          android:duration="700" />  
</set>  
<!-- 尺寸伸縮動畫效果 scale  
       屬性:interpolator 指定一個動畫的插入器  
        在我試驗過程中,使用android.res.anim中的資源時候發現  
        有三種動畫插入器:  
            accelerate_decelerate_interpolator  加速-減速 動畫插入器  
            accelerate_interpolator        加速-動畫插入器  
            decelerate_interpolator        減速- 動畫插入器  
        其他的屬於特定的動畫效果  
      浮點型值:  

            fromXScale 屬性爲動畫起始時 X座標上的伸縮尺寸     
            toXScale   屬性爲動畫結束時 X座標上的伸縮尺寸       

            fromYScale 屬性爲動畫起始時Y座標上的伸縮尺寸     
            toYScale   屬性爲動畫結束時Y座標上的伸縮尺寸     

            說明:  
                 以上四種屬性值     

                    0.0表示收縮到沒有  
                    1.0表示正常無伸縮       
                    值小於1.0表示收縮    
                    值大於1.0表示放大  

            pivotX     屬性爲動畫相對於物件的X座標的開始位置  
            pivotY     屬性爲動畫相對於物件的Y座標的開始位置  

            說明:  
                    以上兩個屬性值 從0%-100%中取值  
                    50%爲物件的X或Y方向座標上的中點位置  

        長整型值:  
            duration  屬性爲動畫持續時間  
            說明:   時間以毫秒爲單位  

        布爾型值:  
            fillAfter 屬性 當設置爲true ,該動畫轉化在動畫結束後被應用  
-->  

[html] view plaincopy
<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android">  
<translate  
android:fromXDelta="30"  
android:toXDelta="-80"  
android:fromYDelta="30"  
android:toYDelta="300"  
android:duration="2000"  
/>  
<!-- translate 位置轉移動畫效果  
        整型值:  
            fromXDelta 屬性爲動畫起始時 X座標上的位置     
            toXDelta   屬性爲動畫結束時 X座標上的位置  
            fromYDelta 屬性爲動畫起始時 Y座標上的位置  
            toYDelta   屬性爲動畫結束時 Y座標上的位置  
            注意:  
                     沒有指定fromXType toXType fromYType toYType 時候,  
                     默認是以自己爲相對參照物              
        長整型值:  
            duration  屬性爲動畫持續時間  
            說明:   時間以毫秒爲單位  
-->  
</set>  


[html] view plaincopy

<?xml version="1.0" encoding="utf-8"?>  
<set xmlns:android="http://schemas.android.com/apk/res/android">  
<rotate   
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
        android:fromDegrees="0"   
        android:toDegrees="+350"           
        android:pivotX="50%"   
        android:pivotY="50%"       
        android:duration="3000" />    
<!-- rotate 旋轉動畫效果  
       屬性:interpolator 指定一個動畫的插入器  
             在我試驗過程中,使用android.res.anim中的資源時候發現  
             有三種動畫插入器:  
                accelerate_decelerate_interpolator   加速-減速 動畫插入器  
                accelerate_interpolator               加速-動畫插入器  
                decelerate_interpolator               減速- 動畫插入器  
             其他的屬於特定的動畫效果  

       浮點數型值:  
            fromDegrees 屬性爲動畫起始時物件的角度      
            toDegrees   屬性爲動畫結束時物件旋轉的角度 可以大於360度     


            說明:  
                     當角度爲負數——表示逆時針旋轉  
                     當角度爲正數——表示順時針旋轉                
                     (負數from——to正數:順時針旋轉)     
                     (負數from——to負數:逆時針旋轉)   
                     (正數from——to正數:順時針旋轉)   
                     (正數from——to負數:逆時針旋轉)         

            pivotX     屬性爲動畫相對於物件的X座標的開始位置  
            pivotY     屬性爲動畫相對於物件的Y座標的開始位置  

            說明:        以上兩個屬性值 從0%-100%中取值  
                         50%爲物件的X或Y方向座標上的中點位置  

        長整型值:  
            duration  屬性爲動畫持續時間  
            說明:       時間以毫秒爲單位  
-->  
</set>  
XML中的動畫效果
[html] view plaincopy
public static Animation loadAnimation (Context context, int id)  
//第一個參數Context爲程序的上下文     
//第二個參數id爲動畫XML文件的引用  
//例子:  
myAnimation= AnimationUtils.loadAnimation(this,R.anim.my_action);  
//使用AnimationUtils類的靜態方法loadAnimation()來加載XML中的動畫XML文件  

在Java代碼中定義動畫

[java] view plaincopy
//在代碼中定義 動畫實例對象  
private Animation myAnimation_Alpha;  
private Animation myAnimation_Scale;  
private Animation myAnimation_Translate;  
private Animation myAnimation_Rotate;  

    //根據各自的構造方法來初始化一個實例對象  
myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);  

myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,  
             Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);  

myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f);  

myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,  
               Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);  

33.

What is Application
Application和Activity,Service一樣是android框架的一個系統組件,當android程序啓動時系統會創建一個 application對象,用來存儲系統的一些信息。通常我們是不需要指定一個Application的,這時系統會自動幫我們創建,如果需要創建自己 的Application,也很簡單創建一個類繼承 Application並在manifest的application標籤中進行註冊(只需要給Application標籤增加個name屬性把自己的 Application的名字定入即可)。
android系統會爲每個程序運行時創建一個Application類的對象且僅創建一個,所以Application可以說是單例 (singleton)模式的一個類.且application對象的生命週期是整個程序中最長的,它的生命週期就等於這個程序的生命週期。因爲它是全局 的單例的,所以在不同的Activity,Service中獲得的對象都是同一個對象。所以通過Application來進行一些,數據傳遞,數據共享 等,數據緩存等操作。
總結:
1.Application是android系統的一個組件,唯一個Application類(單例模式)
2.Application的生命週期是整個程序的生命週期
3.Application的作用 數據傳遞 數據共享 數據緩存 等

34.android的優點和缺點:

1、開源,有強大的軟件開發者支持
2、無縫結合的Google應用。
3、對網絡友好,豐富的功能選擇。對比蘋果對Flash的完全抵制……
4、軟件兼容性好。

缺點:1.存在安全和隱私問題 2.運營商仍然能夠影響到Android手機 3、分依賴開發商缺少標準配置 4、首先開賣Android手機的不是最大運營商

35.intent的作用:

Intent(意圖)主要是解決Android應用的各項組件之間的通訊。
Intent負責對應用中一次操作的動作、動作涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將 Intent傳遞給調用的組件,並完成組件的調用。

36.什麼事ANR,如何避免:

ANR的定義:
在android上,如果你的應用程序有一段時間響應不移靈敏,系統會向用戶提示“應用程序無響應”(ANR:application Not Responding)對話框。因此,在程序裏對響應性能的設計很重要,這樣,系統不會顯示ANR給用戶。
避免: 如果你的應用程序爲響應用戶輸入正在後臺工作的話,可以顯示工作的進度(ProgressBar和ProgressDialog對這種情況來說很有用)。特別是遊戲,在子線程裏做移動的計算。如果你的程序有一個耗時的初始化過程的話,考慮可以顯示一個Splash Screen或者快速顯示主畫面並異步來填充這些信息。在這兩種情況下,你都應該顯示正在進行的進度,以免用戶認爲程序被凍結了。

37.assets什麼含義?與res的區別:

*res/raw和assets的相同點:
1.兩者目錄下的文件在打包後會原封不動的保存在apk包中,不會被編譯成二進制。

*res/raw和assets的不同點:
1.res/raw中的文件會被映射到R.java文件中,訪問的時候直接使用資源ID即R.id.filename;assets文件夾下的文件不會被映射到R.java中,訪問的時候需要AssetManager類。
2.res/raw不可以有目錄結構,而assets則可以有目錄結構,也就是assets目錄下可以再建立文件夾

38.請介紹下Android的數據存儲方式

Android 提供了5種方式存儲數據:
–使用SharedPreferences存儲數據;
–文件存儲數據;
–SQLite數據庫存儲數據;
–使用ContentProvider存儲數據;
–網絡存儲數據;

39. 防止手機進入休眠狀態

PowerManager.WakeLock wl;
wl = pM.newWakeLock(PowerManager.FULL_WAKE_LOCK,”whatever”);
wl.acquire();//啓動休眠鎖
wl.release();//釋放休眠鎖

40.WebView調用JS方法

做混合應用的時候webview 添加JavascriptInterface 後 js掉用方法 出現undefined 調試了一下午終於找到原因:
在綁定的方法前一定要加
@JavascriptInterface
否則在某些手機(比如紅米)的webview中會出現調用方法時undefined的情況

41.android 使背景平鋪(repeat):

方法1: 系統api實現
複製代碼代碼如下:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pic);
//bitmap = Bitmap.createBitmap(100, 20, Config.ARGB_8888);
BitmapDrawable drawable = new BitmapDrawable(bitmap);
drawable.setTileModeXY(TileMode.REPEAT , TileMode.REPEAT );
drawable.setDither(true);
view.setBackgroundDrawable(drawable);
方法2: XML實現
xml路徑:res/drawable/bg.xml
複製代碼代碼如下:

42.傳感器基礎

傳感器的種類:

  1. 動作傳感器
    加速度傳感器、重力傳感器和陀螺儀(判斷手機姿態)等
  2. 位置傳感器
    方向傳感器和磁力傳感器
  3. 環境傳感器
    溫度傳感器 、壓力傳感器和亮度傳感器

使用傳感器的方法:
1. 獲取SensorManager對象
SensorManager sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
2. 執行SensorManager對象的getDefaultSensor()方法獲取Sensor對象並且傳入一個特定的參數
3. 獲取Sensor對象的各種屬性
4. 使用SensorManager 的對象註冊傳感器,sensorManager.registerListener(SensorEventListener listener, Sensor sensor, int rate);
第三個參數是獲取的頻率: SENSOR_DELAY_NORMAL(200000微妙) SENSOR_DELAY_UI(60000微妙) SENSOR_DELAY_GAME(20000微妙) SENSOR_DELAY_FASTEST(0微秒) 使用原則:儘量使用比較低的傳感器採樣率。這樣系統的消耗較少,同時可以省電

電子羅盤:
1. /* 取得SensorManager */
SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

  1. /* 取得需要的Sensor,並註冊SensorEventListener */
    mSensorManager.registerListener(mSensorEventListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_NORMAL);

  2. /實現監聽器,並重寫其中的方法/
    private final SensorEventListener mSensorEventListener = new SensorEventListener()
    {
    public void onAccuracyChanged(Sensor sensor, int accuracy) { }
    public void onSensorChanged(SensorEvent event) {
    /* 判斷Sensor的種類 */
    if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
    /* 取得X值資料

    • x_data是水平值
    • 由於分成8個方向,所以每個方向爲45°
    • */
      float x_data = event.values[SensorManager.DATA_X];
      //北方爲337.5°至22.5°
      if ((x_data > 0 && x_data <= 22.5) || x_data > 337.5) {
      TextView01.setText(“北方” + String.valueOf(x_data)); }
      //東北方爲22.5°至67.5°
      else if (x_data > 22.5 && x_data <= 67.5) {
      TextView01.setText(“東北方” + String.valueOf(x_data)); }
      //東方爲67.5°至112.5°
      else if (x_data > 67.5 && x_data <= 112.5) {
      TextView01.setText(“東方” + String.valueOf(x_data)); }
      //東南方爲112.5°至157.5°
      else if (x_data > 112.5 && x_data <= 157.5) {
      TextView01.setText(“東南方” + String.valueOf(x_data)); }
      //南方爲157.5°至202.5°
      else if (x_data > 157.5 && x_data <= 202.5) {
      TextView01.setText(“南方” + String.valueOf(x_data)); }
      //西南方爲202.5°至247.5°
      else if (x_data > 202.5 && x_data <= 247.5) {
      TextView01.setText(“西南方” + String.valueOf(x_data)); }
      //西方爲247.5°至292.5°
      else if (x_data > 247.5 && x_data <= 292.5) {
      TextView01.setText(“西方” + String.valueOf(x_data)); }
      //西北方爲292.5°至337.5°
      else if (x_data > 292.5 && x_data <= 337.5) {
      TextView01.setText(“西北方” + String.valueOf(x_data)); } } } };

43.launchMode基礎

我們今天要講的是Activity的四種launchMode。
launchMode在多個Activity跳轉的過程中扮演着重要的角色,它可以決定是否生成新的Activity實例,是否重用已存在的Activity實例,是否和其他Activity實例公用一個task裏。這裏簡單介紹一下task的概念,task是一個具有棧結構的對象,一個task可以管理多個Activity,啓動一個應用,也就創建一個與之對應的task。
Activity一共有以下四種launchMode:
1.standard
2.singleTop
3.singleTask
4.singleInstance
我們可以在AndroidManifest.xml配置的android:launchMode屬性爲以上四種之一即可。
下面我們結合實例一一介紹這四種lanchMode:
1.standard
standard模式是默認的啓動模式,不用爲配置android:launchMode屬性即可,當然也可以指定值爲standard。

2.singleTop
我們在上面的基礎上爲指定屬性android:launchMode=”singleTop”,系統就會按照singleTop啓動模式處理跳轉行爲。

44.IntentServices 和Services

IntentServices
利用這個方法無需手動控制線程的執行順序
如果是一個後臺任務,交給Service去執行,因爲Service中也不能執行耗時操作,所以還是需要開啓子線程開執行,使用這個方法就可以忽略這個問題
當任務執行完畢後會自動關閉服務
從Activity中發送Intent之後就可以丟給後臺去處理,就算當前的Activity被finish掉也不會影響任務的執行

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