標籤:resource ble 檔案 bitmap 多個 one 關聯表 ring 添加
本文是作者在Android開發實踐中的隨手速記,記錄一些小問題的解決方案和注意事項,持續更新。
以下是速記內容,若有不嚴謹的地方,望小夥伴們指出。
1.Module 不產生R檔案,可嘗試取消對該Module的引用,
取消後AS會再次編譯工程,看看此時能否產生R。
2.Activity theme設定錯誤時,會出現:
java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
cannot be cast to com.android.internal.widget.ActionBarOverlayLayout$LayoutParams
此時,需要為Activity/Application指定帶ActionBar的系統樣式,或讓自訂的Theme整合內建ActionBar
的系統樣式,當然也可以改用普通Activity類,而非使用Actionbar的Activity子類。
3.java.lang.IllegalArgumentException: NaN is not a valid double value as per JSON
specification. To override this behavior, use GsonBuilder.
serializeSpecialFloatingPointValues() method.
4.AndroidStudio中引用Module時,Module中同名的資源會被App中的資源替換,
利用這一點可以實現自訂資源而不修改Module。目前只試過String.
5.Dagger 環境配置(可解決不能產生Dagger類的情況):http://www.itnose.net/detail/6353446.html
http://stackoverflow.com/questions/29562347/how-do-i-configure-intellij-gradle-to-use-dagger-2-0
6.Android TouchDelegate 只能擴充同一個ViewGroup中的一個View的響應範圍。
7.Baidu Map V3.7 MKOfflineMap 下載完成後不可調用destroy方法(也許下載完成後百度在做一些善後事宜),
否則離線地圖可能無法正常使用。另外此版本的MKOLUpdateElement.status永遠為1,不可靠~
8.ART JNI、GC http://developer.android.com/guide/practices/verifying-apps-art.html
9.IDEA更新JDK至1.8(From1.7),編譯代碼時出現:
Error:(18, 6) java: -source 1.3 中不支援注釋
(請使用 -source 5 或更高版本以啟用注釋)
開啟Project Structure,在Project欄中找到Project language level,修改成1.3以上版本即可。
10.當為Activity寫了Portrait和LandScape兩種布局時,在布局檔案根節點上添加Tag值,在運行時讀取可區分Portrait和LandScape。
11.開啟應用,使用adb shell dumpsys activity top,可以查看應用Activity的資訊,也可以擷取包名。
12.啟動Activity的時候,設定Flag,Intent.setFlags(Intent.Flag_Activity_New_Task|Intent.Flag_Activity_Clear_Task)可以清空BackStack。
13.Context.createPackageContext(pkgName,flags)可以根據包名建立另一個Application的context,前提是二者的shareUserId和Signature要相同,這樣就
兩個應用就會運行在同一個Process中,主應用就可以訪問附屬應用的Resources和Classloader(context.getClassloader.load(className)).安裝在裝置中的每一個apk程式,Android系統會給其
分配一個單獨的使用者空間,其中android:shareUserId就是對應一個Linux使用者ID,並且為它建立一個沙箱,以防止與其它應用程式產生影響。使用者ID
在應用程式被安裝到裝置中時分配。通過SharedUserid,擁有同一個Userid的多個APK可以配置成運行在同一個進程中,所以預設就是可以互相訪問任
意資料,也可以配置成運行在不同的進程中, 同時可以訪問其APK的資料目錄下的資源(圖片,資料庫和檔案),就像訪問本程式的資料一樣。
14.Activity View 層級:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0331/1608.html
15.動態載入機制:http://blog.csdn.net/jiangwei0910410003/article/details/17679823
16.繼承的壞處:Super方法裡引用了可被子類複寫的方法時,該方法也會被子類改寫(調用Super.method也無效)。
17.Android 6.0 File.mkdirs()無效,是因為許可權控制,可動態申請許可權:http://stackoverflow.com/questions/32225506/android-6m-permission-issue-create-directory-not-working
18.為一個Resources建立LayoutInflater用於inflate該Resource中的layout,需要Extend ContextThemeWrapper實現一個ResourcesContext,
然後使用 LayoutInflater.from(Context).cloneInContext(ResourceContext);
19.ListView Item中的可點擊控制項
20.使用Navigator來導航可以避免Activity相互引用,在Activity中寫擷取啟動它的Intent的方法可以避免對外定義傳參Key。
21.使用android.R.id.content可以擷取Activity的根項目。
22.Java包內外層需要互相引用,沒有內層可以直接使用外層或者外層可以直接使用內層之說。
23.在Java7之前,switch只能支援 byte、short、char、int或者其對應的封裝類以及Enum類型。在Java7中,支援了String。
24.解決動態載入SurfaceView閃屏問題的兩種方式:一,getWindow().setFormat(PixelFormat.TRANSLUCENT); 二,在布局中添加一個
不可見的SurfaceView。
25.使用Fragment.onActivityCreated()來retrieve view和restore view state。
26.Android 通過Intent.setComponent(new ComponentName(PkgName,ClassName))可以啟動另一個Apk的Activity;通過new
DexClassLoader(String dexPath, String optimizedDirectory, String libraryPath, ClassLoader parent)可載入執行Jar/Apk中的代碼。
27.ScrollView中內容不足以填充到全屏時,需要添加android:fillViewport="true"來讓ScrollView填滿全屏。
28.Apk的Resource ID資訊沒有放在classes.dex中,放在Resources.arsc中?? See:http://blog.csdn.net/luoshengyang/article/details/8744683
和http://blog.csdn.net/luoshengyang/article/details/8806798
29.Android浮點運算:嵌入式處理器通常沒有支援浮點運算,所有對"float"和"double"的運算都是通過軟體
實現的。一些基本的浮點運算,甚至需要毫秒級的時間才能完成。甚至是整數,一些晶片有對乘法的硬體支
持而缺少對除法的支援。這種情況下,整數的除法和模數運算也是由軟體來完成的。所以當你在使用雜湊表
或者做大量數學運算時一定要小心謹慎。
30.Git 只clone一個分支:git clone -b <branch> <repo>
31.Java 1.5開始支援靜態引用,可以直接引用靜態方法,省略調用靜態方法時需要寫類名的工作。使用 import static <class>.* 可引入所有靜態方法。
32.Android Activity中 getApplicationContext!=getBaseContext(),後者是為每個Activity重新建立的一個ContextImpl,Activity本身是一個
ContextThemeWrapper,它依靠ContextImpl來完成實際的工作。
33.Thread的looper和MainThread的MainLooper都是直接new出來的,本質上沒有區別,啟用了Looper的Thread建立的Handler可以執行UI操作
,但是這裡的操作如果耗時太久的話(如sleep>100ms),容易崩潰(待驗證,當耗時操作在前易崩潰)。
34.ActivityManager.getRunningTasks(1).get(0).topActivity()可擷取前台應用的Activity componentName。
35.如果使用Application的Context來bindService,Service就會跟Application的生命週期一樣,而不會受Activity的生命週期影響。如果是用某個
Activity的Context來綁定Service,這個Service的生命週期就受到這個Activity(而非App的其他Activity)的生命週期影響,並且無需調用UnbindService。
36.Exception raised during rendering: com/android/util/PropertiesMap (Details),在渲染預覽介面更改渲染工具版本即可。
37.AndroidStudio Ignore Files:
.idea
.gradle
build/
local.properties
*.iml
38.Android 切圖中不規則的圖片(兩頭純圓按鈕)或純規則圖片(純圓,正方形?)無法做.9展開,做成Bitmapdrawable(<bitamp/>)可以解決。
39.Android添加懸浮窗顯示,需要使用Application的Context,如若不能顯示在所有應用上層,則需使用Service?
40.SurfaceView黑屏:(1)getWindow().setFormat(PixelFormat.TRANSLUCENT);
41.Gson序列化時排除欄位:http://www.tuicool.com/articles/v2eIrqz
42.引入關聯表來關聯兩個表之間的關係。
43.Gson 轉換List<T>時,需要使用new TypeToken<List<String>>(){}.getType(),特別注意TypeToken後面的大括弧。
44.以檔案夾方式隔離使用者資料,將使用者資料(包括資料庫)都放到帶使用者資訊的檔案夾下面。
45.Android 無法實現不影響後面操作的懸浮操作?
46.使用wait()和notify()時一般是為了同步線程,但是要注意,如果所調用的方法沒有開啟非同步線程,可能會直接返回,這時候在方法調用之後
使用的wait()就會一直等待非同步回調來notify,然而回調其實早就已經在方法棧中發生,這樣就會導致線程一直等待。如果開啟了非同步線程,那wait()一定會等到notify的到來。
47.Java 使用泛型時,支援自動以泛型的具體類型來具名引數,只要讓泛型對應的參數名與泛型名一樣(不區分大小寫)就可以做到。
48.Sqlite 查詢為空白的欄位 Field IS NULL, 查詢不為空白的欄位 Field IS NOT NULL。
49.ImageView tint in xml and setColorFilter 可以對圖片進行著色,可用於改變表徵圖的顏色,使用PorterDuff.Mode.CLEAR時,還可以隱藏繪製內容。
50.FileOutputStream.getChannel().lock() 可以獲得一個FileLock以鎖定檔案。
51.解決Gradle DSL method not found: ‘android()’:刪除Project的build.gradle檔案中的:android{}即可。See:http://www.hloong.com/?p=100
52.ListView 的Item中有可點擊元素時,需將可點擊元素的Focusable和FocusableInTouchMode屬性設定為false,並為ListView設定android:descendantFocusability="blocksDescendants"
這樣按鈕和Item都可以點擊。
53.Root 原理:http://www.myhack58.com/Article/html/3/92/2013/36574.htm
54.requestWindowFeature()用來動態決定Window的特性,而這個行為發生在setContentView之前,所以必須要在setContentView之前設定。如request
WindowFeature(Window.FEATURE_NO_TITLE)之後,Window中的DecorView就不會產生TitleView部分,而只產生ContentView部分。
55.Android Style中使用自訂View屬性時,不用加任何命名空間(如android:xxx),直接使用屬性名稱即可
56.PopupWindow點擊外部消失,只需設定background即可: setBackgroundDrawable(new BitmapDrawable())
57.Sqlite不可在事務中開啟另一個事務,否則這個事務操作無效。
58.new SimpleDateFormat("yyyy-M-d hh:mm").format(date)可以去0。
59.View 在綁定後,從View樹中移除後再添加,繫結資料依然有效。
60.EditText設定inputType="numberSigned"時可以輸入負數。
61. <item name="android:imeOptions">flagNoExtractUi</item>可禁止IME開新介面全屏輸入
62.Sqlite 關聯查詢:SELECT A.*,B.name FROM Task AS A ,Project AS B WHERE A.Status<=‘2‘
63.Adapter.getItemViewType()返回的Type範圍應該是(0,ItemViewTypeCount]
64.Fatal signal 11 (SIGSEGV), code 0, fault addr 0x61b6 in tid 25110 (RenderThread) 跟硬體加速有關,避免設定
View.setLayerType(View.LAYER_TYPE_HARDWARE, null),出現問題時可在Manifest中禁用硬體加速:<android:hardwareAccelerated="false">
65.NDK_PROJECT_PATH=null,在app/build.gradle的android{}中添加
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir ‘src/main/libs‘
}
即可解決。
66.計算大數值時容易溢出,最好轉換為大數實值型別計算:如long EXPIRE_LOGIN =90* 24 * 60 * 60 * 1000 結果為負數,應改為:
long EXPIRE_LOGIN =90L* 24 * 60 * 60 * 1000;
67.fitsSystemWindows實現沈浸式:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1122/3712.html
68.app:layout_behavior="@string/bottom_sheet_behavior"
69.Application 中的OnTrimMemory用於系統復原記憶體,此時可將一些不重要的記憶體緩衝釋放掉。
70.ImageView adjust to Image,user adjustViewBounds=true and maxWidth/maxHeight of ImageView.
71.<item name="android:windowDrawsSystemBarBackgrounds">false</item> 控制內容是否渲染到底部欄下面
72.Sqlite DISK IOERROR WRITE,是因為臨時目錄問題,可以通過設定之解決問題:
http://blog.csdn.net/u011453773/article/details/50731331
73.Android 調用系統分享:http://stackoverflow.com/questions/30518321/on-android-m-how-to-configure-the-direct-share-capabilities-image-text-an/30721038#30721038
74.擷取Android 的ContentView的容器可以通過它的ID: Window.ID_ANDROID_CONTENT。
75.Java中Object的hashcode返回一個int的hash值。預設情況下,Object中
的hashCode() 返回對象的32位jvm記憶體位址。也就是說如果對象不重寫該方
法,則返回相應對象的32為JVM記憶體位址。equals方法返回true的兩個Objec
t應該返回相同的hashcode。所以一般Object的子類在是想equals方法和hashcode
方法的時候,要麼同時實現,要麼都不實現。這對於索引值對使用時應該很關
鍵。重寫equals和hashcode時,可以使用IDE提供的方法,安全高效。參考:
https://www.oschina.net/question/82993_75533 同時注意ORM的情況。
76.Collections.synchronizedXXX(),是對所有的傳入對象加了同步鎖。
77.HashMap 操作都是通過數組找鏈表頭結點,key用於hash後找到數組index。
它的containskey也會通過key的hash找到對應鏈表頭結點,然後遍曆,但是containsValue因為不知道
key,無法hash找到index,所以是按數組順序依次遍曆每一個鏈表尋找,效率較低。
78.AndroidStudio 編譯報錯: Error:java.lang.NullPointerException
(no error message),刪除工程目錄下.gradle檔案,重啟就好。
79.GreenDao局限性:不能相容模型的繼承關係,無法將父類的欄位產生資料庫欄位,如果父類和子類都有
都建了表,Dao之間沒有繼承關係。此時可能考慮合并連個表。
80.serialVersionUID 的意義:http://lenjey.iteye.com/blog/513736
81.ScrollView 嵌套GridView或者ListView,可以重寫onMeasure方法,設定
測量高度為最大值,測量模式為AT_MOST,實現跟隨ScrollView滾動。此時如果
遇到布局自動滾動到GridView所在位置,禁用GridView focus即可。
82.HttpUrlConnection 出現EOFException,據說是當響應的InputStream 是 GZIPInputStream時,會造成 HTTP HEAD 的衝突,此處應該是個Bug,原因可以參考以下網址:
https://code.google.com/p/android/issues/detail?id=24672 , 可以通過設定 connection.setRequestProperty( "Accept-Encoding", "" )解決.
83.RecyclerView的Item布局中不能直接使用View,需使用具體的View。否則可能會報CreateViewFromTag Nullpointer。
84.在返回集合的方法中,不建議返回null,而是返回Collections.emptyxxx。
85.List泛型參數的子類和父類的轉化,可以先將待轉換的類轉換為泛型集合,然後賦值給接收者,如A和B ,
其中 B extends A,需要list<B> 轉換為list<A>時 , 可以這樣:
List list=list<b>;
List<A> receiver=list;
也可以直接
用List.class.cast()方法,如:
List<A> receiver=List.class.cast(list<B>);
86.Seekbar滑塊偏上時,同時加上maxHeight和minHeight可以解決,他們是用來指定進度背景高度的。
87.AdapterView中View的狀態不變化時(應用selector),和處理點擊控制項一樣處理即可,關閉focusablity,加上FocusblockDesendants.
88.PNG使用Bitmap.compress壓縮品質時會忽略quality,建議使用webp。
89.四種方式設定Activity跳轉動畫:http://blog.csdn.net/qq_23547831/article/details/51821159
90.XListView 需要設定Adapter才能顯示Header,Footer和上下拉動
91. Dex cannot parse version 52 byte code,需要在App gradle 的android{...}中添加:
compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
如果有Jack錯誤,還需要在defaultConfig{...}中添加 jackOptions { enabled true }
92.Collections.synchronizedList中所有方法都加了synchronize(mutex){...}同步,除了訪問iterater的方法,需要手動加鎖,請看他們的實現如下:
public ListIterator<E> listIterator() {return list.listIterator(); // Must be manually synched by user}public ListIterator<E> listIterator(int index) {return list.listIterator(index); // Must be manually synched by user}
93.用Gradle為UMeng渠道打包首先你必須在AndroidManifest.xml中的meta-data修改以下的樣子:
<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" />
然後再App的build.gradle的android{}中添加productFlavors {
YingYongBao {}HuaWei{}productFlavors.all { flavor ->flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]}}
注意其中渠道名不能以數字開頭。也可以使用第三方PackNG打包,不過它的渠道沒有寫到Manifest中,如果二次簽名會導致丟失。
94.Gradle讀取local.properties檔案,如下讀取簽名配置資訊
Properties properties = new Properties()InputStream inputStream = project.rootProject.file(‘local.properties‘).newDataInputStream() ;properties.load( inputStream )//讀取檔案def sdkDir = properties.getProperty(‘key.file‘)storeFile file( sdkDir )//讀取欄位def key_keyAlias = properties.getProperty( ‘keyAlias‘ )def key_keyPassword = properties.getProperty( ‘keyPassword‘ ) ;def key_storePassword = properties.getProperty( ‘storePassword‘ ) ;storePassword key_storePasswordkeyAlias key_keyAliaskeyPassword key_keyPassword
95.LinearLayout比例布局時,不包含0的weight時,使用0dp才會準確。
96.出現 Bitmap too large to be uploaded into a texture錯誤時,是因為啟用硬體加速後,無法顯示較大的圖片,解決方案三種:
(1)Android:hardwareAccelerated="false"關閉加速
(2)載入圖片時進行壓縮
(3)把大圖分割成小塊載入顯示圖片切片
Android開發隨手記