Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android的一些小知識點

android的一些小知識點

編輯:關於Android編程

這個是看到github上分享出來的,原文地址https://github.com/jiang111/awesome-android-tips,感謝原文作者

setBackgroundResource(0) 可以移除 View 的背景色

Resources.getSystem().getDisplayMetrics().density 可以不用 Context 也能獲取屏幕密度哦

通過重載 ViewGroup 的 dispatchDraw 可以實現一個簡單的蒙版效果。 例如下拉刷新時,可以在 contentView 上加一層遮罩。 canvas.drawRect(0, mContentView.getTranslationY(), getWidth(), getHeight(), mMaskPaint);

new 出來的 View 可以用 View.generateViewId() (API 17 以上可用) 生成 id,系統保證唯一

使用 GridView時 android:padding 和 android:clipToPadding=”false” 配合使用效果更好哦。

在布局文件中,如果只是為了占位,可以用 Space 來取代 View。 最棒的一點是Space可以跳過 Draw 這個過程。

TypedValue.applyDimension(int unit, float value, DisplayMetrics metrics) 方便dp, px, sp 之間的轉換。

Activity.startActivities() 這個方法最直接的理解就是使用intent開啟多個Activity

TextUtils.isEmpty() 如果傳入的String 為NULL或者Length為0的話就返回 true。

Html.fromHtml() 如果你對Html熟悉的話,可以很迅速通過這個方法處理一些富文本操作。比如超鏈接和圖文排版等處理。

TextView.setError() 設置文本框錯誤提醒

Build.VERSION_CODES 有些時候我們的app需要根據不同的SDK版本進行執行不同的操作

PhoneNumberUtils.convertKeypadLettersToDigits 這個方法簡單粗暴,會將輸入的字母根據鍵盤上的映射轉換為數字。

ArgbEvaluator ArgbEvaluator.evaluate(float fraction, Object startValue, Object endValue);根據一個起始顏色值和一個結束顏色值以及一個偏移量生成一個新的顏色,分分鐘實現類似於微信底部欄滑動顏色漸變。

ValueAnimator.reverse() 順暢的取消動畫效果

DateUtils.formatDateTime()) 這個方法可以輸出相應格式化的時間或者日期

Pair 這個類 可以用來存儲存儲一”組”數據。但不是key和value的關系。

SparseArray 目前有很多地方從性能優化方說使用SparseArray來替換hashMap,來節省內存,提高性能。

Linkify.addLinks() 這個類可以更方便的為文本添加超鏈接。

android.media.ThumbnailUtils這個類主要是用來處理縮略圖相關的工作,比如:用來獲取媒體(圖片、視頻)的縮略圖;

Bitmap.extractAlpha ();返回一個新的Bitmap,capture原始圖片的alpha值。有的時候我們需要動態的修改一個元素的背景圖片又不希望使用多張圖片的時候,通過這個方法,結合Canvas和Paint可以動態的修改一個純色Bitmap的顏色。

模塊間有消息需要傳遞時,使用LocalBroadcastManager替代Listener進行模塊解耦。除了解耦,這樣發送消息和執行消息差一個線程循環,可以減小方法的調用鏈,我這就碰到一次方法調用鏈太長導致StackOverflow的問題。

靜態變量不要直接或者間接引用Activity、Service等。這會使用Activity以及它所引用的所有對象無法釋放,然後,用戶操作時間一長,內存就會狂升。

Handler機制有一個特點是不會隨著Activity、Service的生命周期結束而結束。也就是說,如果你Post了一個Delay的Runnable,然後在Runnable執行之前退出了Activity,Runnable到時間之後還是要執行的。如果Runnable裡面包含更新View的操作,程序崩潰了。

不少人在子線程中更新View時喜歡使用Context.runOnUiThread,這個方法有個缺點,就是一但Context生命周期結束,比如Activity已經銷毀時,一調用就會崩潰。

SharedPreferences.Editor.commit這個方法是同步的,一直到把數據同步到Flash上面之後才會返回,由IO操作的不可控,盡量使用apply方法代替。apply只在API Level>=9才會支持,需要做兼容。不過,最新的 support v4 包已經為我們做好了處理,使用 SharedPreferencesCompat.EditorCompat.getInstance().apply(editor) 即可。

PackageManager.getInstalledPackages這個方法經常使用,你可能不知道,當獲取的結果數量比較多的時候,在某些機型上面調用它花費的時間可能秒級的,所以盡量在子線程中使用。另外,如果結果太多,超過系統設置的Binder數據最大傳輸量的上限,則會發生TransactionException,如果你使用這個方法獲取機器上的己安裝應用列表,最好做一下預防。

如果使用Context.startActivity啟動外部應用,最好做一下異常預防,因為尋找不到對應的應用時,會拋出異常。如果你要打開的是應用內的Activity,不防使用顯式Intent,這樣能提高系統搜索目標Activity的效率。

Application的生命周期就是進程的生命周期。只有進程被干掉時,Application才會銷毀。哪怕是沒有Activity、Service在運行,Application也會存在。所以,為了減少內存壓力,盡量不要在Application裡面引用大對象、Context等。

getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);設置全屏方法一定要在setContentView之後

viewpager 的 setCurrentItem 一定要在 setAdapter 方法之後調用才會有效果.

判斷手機是不是飛行模式 boolean isEnabled = Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1;

TabLayout 修改字體的方法 官方的 TabLayout 沒有提供修改 TextView size 的方法,可以新建一個 style CustomTabLayoutTextAppearance 繼承 TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse ,然後增加 item ,設置 android:textAllCaps 為 true ,再設置 android:textSize 為你想設置的大小。 再在 TabLayout 的布局文件裡設置 app:tabTextAppearance=”@style/CustomTabLayoutTextAppearance” 即可。

遍歷HashMap的最佳方法

public static void printMap(Map mp) {
for (Map.Entry m : mp.entrySet()) {
System.out.println(m.getKey() + “:” + m.getValue());
}
}
使用Java在一個區間內產生隨機整數數
public static int randInt(int min, int max) {
Random rand = new Random();
int randomNum = rand.nextInt((max - min) + 1) + min;
return randomNum;
}
如果子類實現Serializable接口而父類未實現時,父類不會被序列化,但此時父類必須有個無參構造方法,否則會拋InvalidClassException異常。

transient關鍵字修飾變量可以限制序列化。

當使用JakeWharton的TabPageIndicator時,如果需要先做一些耗時的操作,然後再展示TabPageIndicator的話,需要先設置mIndirector.setVisibility(View.GONE);然後耗時任務結束以後再mIndirector.setVisibility(View.VISIBLE);否則會報錯

類繼承之間的調用順序 父類static成員 -> 子類static成員 -> 父類普通成員初始化和初始化塊 -> 父類構造方法 -> 子類普通成員初始化和初始化塊 -> 子類構造方法

華為手機無法顯示log解決方案,.撥號界面輸入(##2846579##) Service menu will appear.Go to “ProjectMenu” -> “Background Setting” -> “Log Setting”Open “Log switch” and set it to ON.Open “Log level setting” and set the log level you wish.

後台service經常因為重啟之類的出現onStartCommand()中的Intent傳遞的參數為null, 通過在onStartCommand()中的返回值改成return super.onStartCommand(intent, Service.START_REDELIVER_INTENT, startId); 可以解決問題。下面介紹幾個flag的意思

flag 解釋
START_STICKY 如果service進程被kill掉,保留service的狀態為開始狀態,但不保留遞送的intent對象。隨後系統會嘗試重新創建service,由於服務狀態為開始狀態,所以創建服務後一定會調用onStartCommand(Intent,int,int)方法。如果在此期間沒有任何啟動命令被傳遞到service,那麼參數Intent將為null。
START_NOT_STICKY “非粘性的”。使用這個返回值時,如果在執行完onStartCommand後,服務被異常kill掉,系統不會自動重啟該服務。
START_REDELIVER_INTENT 重傳Intent。使用這個返回值時,如果在執行完onStartCommand後,服務被異常kill掉,系統會自動重啟該服務,並將Intent的值傳入。
START_STICKY_COMPATIBILITY START_STICKY的兼容版本,但不保證服務被kill後一定能重啟。
不能在Activity沒有完全顯示時顯示PopupWindow和Dialog

在多進程之間不要用SharedPreferences共享數據,雖然可以(MODE_MULTI_PROCESS),但極不穩定

有些時候不能使用Application的Context,不然會報錯(比如啟動Activity,顯示Dialog等)

*備注:大家注意看到有一些NO上添加了一些數字,其實這些從能力上來說是YES,但是為什麼說是NO呢?下面一個一個解釋: 1. 數字1:啟動Activity在這些類中是可以的,但是需要創建一個新的task,一般情況不推薦; 2. 數字2:在這些類中去layout inflate是合法的,但是會使用系統默認的主題樣式,如果你自定義了某些樣式可能不會被使用; 3. 數字3:在Receiver為null時允許,在4.2或以上的版本中,用於獲取黏性廣播的當前值。(可以無視); 4. ContentProvider、BroadcastReceiver之所以在上述表格中,是因為在其內部方法中都有一個context用於使用。
謹慎使用Android的透明主題,透明主題會導致很多問題,比如:如果新的Activity采用了透明主題,那麼當前Activity的onStop方法不會被調用;在設置為透明主題的Activity界面按Home鍵時,可能會導致刷屏不干淨的問題;進入主題為透明主題的界面會有明顯的延時感
不要在非UI線程中初始化ViewStub,否則會返回null

盡量不要通過Application緩存數據,這不穩定

華為手機無法打開USB調試的問題,

插好數據線,撥號界面 輸入 ##2846579## 進入工程模式
projectmenu→3後台設置→4USB端口配置→Balong調試模式,點確定
不要拔線,退出工程模式,直接重啟手機,電腦中顯示可移動磁盤(若仍未出現,重復步驟1、2)
這個是關閉USB調試的情況下電腦中使用手機的可移動磁盤的方法,使用後下拉菜單中usb選項也回來了。

android listview中的消息被軟鍵盤遮擋了,在設置listview的時候加上android:transcriptMode=”normal”就好了

TextUtils 是一個非常好用的工具類,把 List 轉成字符串,逗號分隔,逗號分隔的 String 字符串,切割成 List ,分別可以用 TextUtils 的 join 和 split 方法。如果要對 List 去重,則可以用 Collection 的 frequency 方法。

在activity中調用 moveTaskToBack (boolean nonRoot)方法即可將activity 退到後台,注意不是finish()退出。

activity中的runOnUiThrea(Runnable action)方法可以直接回到主線程

listview有個footerDividersEnabled和headerDividersEnabled方法可以設置listview的頂部和底部divide,但是必須保證你設置了headview和footview才會有效果

Throwable類中的getStackTrace()方法,根據這個方法可以得到函數的逐層調用地址,其返回值為StackTraceElement[];

StackTraceElement類,其中四個方法getClassName(),getFileName(),getLineNumber(),getMethodName()在調試程序打印Log時非常有用;

UncaughtExceptionHandler接口,再好的代碼異常難免,利用此接口可以對未捕獲的異常善後

Resources類中的getIdentifier(name, defType, defPackage)方法,根據資源名稱獲取其ID,做UI時經常用到;

view的isShown方法,只有當view本身以及它的所有祖先們都是visible時,isShown()才返回TRUE。而平常我們調用if(view.getVisibility() == View.VISIBLE)只是對view本身而不對祖先的可見性進行判斷。

Arrays類中的一系列關於數組操作的工具方法:binarySearch(),asList(),equals(),sort(),toString(),copyOfRange()等;Collections類中的一系列關於集合操作的工具方法:sort(),reverse()等;

TextView類中的append(CharSequence)方法,添加文本。一些特殊文本直接用+連接會變成String;

System類中的arraycopy(src, srcPos, dest, destPos, length)方法,用來copy數組;

Fragment類中的onHiddenChanged(boolean)方法,使用FragmentTransaction中的hide(),show()時只會調用Fragment中的show和hidden狀態,其他生命周期不會調用。

Activity類中的onWindowFocusChanged(boolean),onNewIntent(intent)等回調方法;

TextView類中的setTransformationMethod(TransformationMethod)方法,可用來實現“顯示密碼”功能

PageTransformer接口,用來自定義ViewPager頁面切換動畫,用setPageTransformer(boolean, PageTransformer)方法來進行設置;

apache提供的一系列jar包:commons-lang.jar,commons-collections.jar,commons-beanutils.jar等,裡面很多方法可能是你曾經用幾十幾百行代碼實現過的,但是執行效率或許要差很多,比如:ArrayUtils,StringUtils……;

ActivityLifecycleCallbacks接口,用於在Application類中監聽各Activity的狀態變化 閱讀地址點我

ActionBar.hide()/.show() 顧名思義,隱藏和顯示ActionBar,可以優雅地在全屏和帶Actionbar之間轉換。

SystemClock.sleep() 這個方法在保證一定時間的 sleep 時很方便,通常我用來進行 debug 和模擬網絡延時。

UrlQuerySanitizer——使用這個工具可以方便對 URL 進行檢查。

ActivityOptions ——方便的定義兩個Activity切換的動畫。 使用ActivityOptionsCompat 可以很好解決舊版本的兼容問題。

getParent().requestDisallowInterceptTouchEvent(true);剝奪父view對touch事件的處理權,誰用誰知道。

HandlerThread,代替不停new Thread開子線程的重復體力寫法。

IntentService,一個可以干完活後自己去死且不需要我們去管理子線程的Service

Executors. newSingleThreadExecutor();這個是java的,之前不知道它,自己花很大功夫去研究了單線程順序執行的任務隊列

android:animateLayoutChanges=”true”,LinearLayout中添加View的動畫的辦法,支持通過setLayoutTransition()自定義動畫。

AsyncQueryHandler,如果做系統工具類的開發,比如聯系人短信輔助工具等,肯定免不了和ContentProvider打交道,如果數據量不是很大的情況下,隨便搞,如果數據量大的情況下,了解下這個類是很有必要的,需要注意的是,這玩意兒吃異常..

ViewFlipper,實現多個view的切換(循環),可自定義動畫效果,且可針對單個切換指定動畫。

android util包中的Pair類,可以方便的用來存儲一”組”數據。注意不是key value

android:descendantFocusability,ListView的item中CheckBox等元素搶焦點導致item點擊事件無法響應時,除了給對應的元素設置 focusable,更簡單的是在item根布局加上android:descendantFocusability=”blocksDescendants”

includeFontPadding=”false”,TextView默認上下是有一定的padding的,有時候我們可能不需要上下這部分留白,加上它即可。

Messenger,面試的時候通常都會被問到進程間通信,一般情況下大家都是開始背書,AIDL巴拉巴拉。。有一天在鴻神的博客看到這個,嗯,如他所說,又可以裝一下了。

EditTxt.setImeOptions, 使用EditText彈出軟鍵盤時,修改回車鍵的顯示內容(一直很討厭用回車鍵來交互,所以之前一直不知道這玩意兒)

java8中新增的LocalDate和LocalTime接口,Date雖然是個萬能接口,但是它真的不好用,有了這倆,終於可以愉快的處理日期時間了。

WeakHashMap,直接使用HashMap有時候會帶來內存溢出的風險,使用WaekHashMap實例化Map。當使用者不再有對象引用的時候,WeakHashMap將自動被移除對應Key值的對象。

使用SnackBar的時候,不要使用view.getRootView()作為snackbar的view,華為榮耀7 會出問題。

設置TextView單行顯示的時候不要用Lines=1,而要用singleLine=”true” ,因為魅族部分手機在設置Lines=1的時候,然後TextView的值全為數字的時候, 你就會懵逼了.

TouchDelegate可用於更改View的觸摸區域。場景:比如在RecyclerView的ItemView裡包含了CheckBox組件, 然後想實現點擊ItemView的時候,也可以觸發CheckBox,就可以使用此類

ArgbEvaluator可用於計算不同顏色值之間的插值,配合ValueAnimator.ofObject或者ViewPager.PageTransformer使用,可以實現不同顏色之間的平滑過渡。

Palette可用於提取一張圖片的顏色。

ViewDragHelper,做過自定義ViewGroup的童鞋都應該知道這個東西吧,用來處理觸摸事件的神器,媽媽再也不用擔心我自定義控件了。

PageTransformer用於定義ViewPager頁面切換時的動畫效果(淡入淡出,放大縮小神馬的…)官方有例子,直接看吧。

Formatter.formatFileSize() 這個方法會格式化數據的大小,根據輸入的字節大小,返回 B KB MB GB 等等(最大支持到 PB)。當然要注意的是輸入的最大值是 Long.MAX_VALUE.

Activity.recreate重新創建Activity。有什麼用呢?可以在程序更換主題後,立馬刷新當前Activity,而不會有明顯的重啟Activity的動畫。

View.getContext顧名思義,就不用解釋了吧…以前在寫RecyclerView的Adapter的時候,為了使用LayoutInflater,經常傻乎乎地在構造函數中傳入一個外部的context….是不是只有我不知道而已(笑cry臉)

View.post方便在非UI線程對界面進行修改,與Handler的作用類似。並且由於post的Runnable會保證在該View繪制完成的前提下才調用,所以一般也可以用於獲取View的寬高。

Activity.runOnUiThread與View.post類似,方便在非UI線程中對界面進行修改。

Fragment在配合PagerAdapter使用的時候可以重寫setUserVisibleHintFragment()方法,然後根據參數的布爾值(true的話表示當前Fragment對用戶可見),來執行一些邏輯。

android:animateLayoutChanges 這是一個非常酷炫的屬性。在父布局加上 android:animateLayoutChanges=”true” 後,如果觸發了layout方法(比如它的子View設置為GONE),系統就會自動幫你加上布局改變時的動畫特效!!

android:clipToPadding 設置父view是否允許其子view在它的padding(這裡指的是父View的padding)中繪制。是不是有點繞?舉個實際場景吧:假如有個ListView,我們想要在初始位置時,第一項Item離頂部有10dp的距離,就可以在ListView的布局中加入android:clipToPadding=”false” android:paddingTop=”10dp”即可。是不是很方便呢?

rv 的 Layoutmanager 可以直接申明在 xml 中,具體代碼可查看RecyclerView.createLayoutManager 方法.

RecyclerView在23.2.+的版本中新增了自動測量的功能,由於新增了自動測量,那麼它的item的根布局在需要測量的方向上就不能寫match_parent了,需要改成wrap_content

getParent().requestDisallowInterceptTouchEvent(true);剝奪父view對touch事件的處理權,誰用誰知道。

Canvas中clipRect、clipPath和clipRegion剪切區域的API。

GradientDrawable 有個陰影效果還不錯,以為是切的圖片,一看代碼,什麼鬼= =!

有朋友提到了在自定義View時有些方法在開啟硬件加速的時候沒有效果的問題,在API16之後確實有很多方法不支持硬件加速,通常我們關閉硬件加速都是在清單文件中通過,其實android也提供了針對特定View關閉硬件加速的方法,調用View.setLayerType(View.LAYER_TYPE_SOFTWARE, null);即可。

PointF,graphics包中的一個類,我們經常見到在處理Touch事件的時候分別定義一個downX,一個downY用來存儲一個坐標,如果坐標少還好,如果要記錄的坐標過多那代碼就不好看了。用PointF(float x, float y);來描述一個坐標點會清楚很多。

StateListDrawable,定義Selector通常的辦法都是xml文件,但是有的時候我們的圖片資源可能是從服務器動態獲取的,比如很多app所謂的皮膚,這種時候就只能通StateListDrawable來完成了,各種addState即可。

android:duplicateParentState=”true”,讓子View跟隨其Parent的狀態,如pressed等。常見的使用場景是某些時候一個按鈕很小,我們想要擴大其點擊區域的時候通常會再給其包裹一層布局,將點擊事件寫到Parent上,這時候如果希望被包裹按鈕的點擊效果對應的Selector繼續生效的話,這時候duplicateParentState就派上用場了。

ViewConfiguration.getScaledTouchSlop();觸發移動事件的最小距離,自定義View處理touch事件的時候,有的時候需要判斷用戶是否真的存在movie,系統提供了這樣的方法。

ViewStub,有的時候一塊區域需要根據情況顯示不同的布局,通常我們都會通過setVisibility的方法來顯示和隱藏不同的布局,但是這樣默認是全部加載的,用ViewStub可以更好的提升性能。

onTrimMemory,在Activity中重寫此方法,會在內存緊張的時候回調(支持多個級別),便於我們主動的進行資源釋放,避免OOM。

TextView.setCompoundDrawablePadding,代碼設置TextView的drawable padding。

ImageSwitcher,可以用來做圖片切換的一個類,類似於幻燈片。

在自定義控件的時候,能用drawable來繪制圓,或者其他樣式的時候,盡量用drawable,因為drawable的效果要遠勝於canvas.drawXXX().

如果想要自定義View支持SwipeRefreshLayout,只需要聲明並實現ScrollingView接口即可,RecyclerView和NestedScrollView已經實現此接口。

AtomicFile——通過使用備份文件進行文件的原子化操作。這個知識點之前我也寫過,不過最好還是有出一個官方的版本比較好。

DatabaseUtils——一個包含各種數據庫操作的使用工具。

Activity.isChangingConfigurations ()——如果在 Activity 中 configuration 會經常改變的話,使用這個方法就可以不用手動做保存狀態的工作了。

SearchRecentSuggestionsProvider——可以創建最近提示效果的 provider,是一個簡單快速的方法。

android:clipChildren (ViewGroup)——如果此屬性設置為不可用,那麼 ViewGroup 的子 View 在繪制的時候會超出它的范圍,在做動畫的時候需要用到。

android:fillViewport (ScrollView)——在這片文章中有詳細介紹文章鏈接,可以解決在 ScrollView 中當內容不足的時候填不滿屏幕的問題。

android:tileMode (BitmapDrawable)——可以指定圖片使用重復填充的模式。

android:enterFadeDuration/android:exitFadeDuration (Drawables)——此屬性在 Drawable 具有多種狀態的時候,可以定義它展示前的淡入淡出效果。

Log.wtf()的意思是What a Terrible Failure,而不是What The Fuck!

使用RenderScript虛化圖片效果。如果你的app的minSDK為16或者更低,你需要使用support模式,因為很多方法都是在API 17之後添加的。renderscriptTargetApi最高到23,但是你應該把它設置到能保持腳本中使用到的功能完整的最低API。如果你想在support模式下target API 21+你必須使用gradle-plugin 2.1.0 和 buildToolsVersion “23.0.3” 或者以上。需要在gradle中添加renderscriptTargetApi 18,renderscriptSupportModeEnabled true 這兩句話

public static Bitmap blurBitmap(Context context, Bitmap src, int radius) {
        Bitmap dest = src.copy(src.getConfig(), true);
        RenderScript rs = RenderScript.create(context);
        Allocation allocation = Allocation.createFromBitmap(rs, src);
        Type t = allocation.getType();
        Allocation blurredAllocation = Allocation.createTyped(rs, t);
        ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
        blurScript.setRadius(radius);
        blurScript.setInput(allocation);
        blurScript.forEach(blurredAllocation);
        blurredAllocation.copyTo(dest);
        allocation.destroy();
        blurredAllocation.destroy();
        blurScript.destroy();
        t.destroy();
        rs.destroy();
        return dest;
    }

如果想把一個view保存為Bitmap,正常情況下用第一種方法就可以了,但是如果是ScrollView,則必須采用第二種方法。

當Activity LauncherMode 為singleTask singleInstance時,使用startActivityForResult會立馬返回,不能正常調用。具體請看http://www.360doc.com/content/15/0123/14/12928831_443085580.shtml

當PopupWindow中有EditText控件時,因為Popupwindow 默認沒有獲取到焦點,需要手動設置焦點,這樣子view才能獲取到事件的監聽。所以你需要在創建完popwindow後設置他的焦點,popupWindow.setFocusable(true);就可以讓EditText獲取焦點。

PopupWindow默認點擊外部的時候不消失,需要對PopupWindow 設置一個背景圖popWindow.setBackgroundDrawable(new BitmapDrawable());要創建一個空對象,設置為null是不行的,或者就創建一個全透明的背景圖。

android中的序列化官方推薦Parceble,其實Parceble最好用於內存之間數據的交換,如果要把數據寫入硬盤的話,推薦實現Serializable

tools標簽可以很好的幫助開發者實時預覽xml的效果,通過tools:background可以預覽控件所占的控件,tools:visibility可以把一個gone的控件在預覽的時候展示出來,並且運行以後tools標簽的內容不會展示出來.例如:

android studio 2.1起已經支持jdk8了,使用的時候要在gradle中加上,需要把buildToolsVersion更新到24以上的版本

android {
    defaultConfig {
    ...
            jackOptions {
                enabled true
            }
        }
   ...
    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
}

6.0之後getResources().getColor()方法被廢棄了,大家可以用ContextCompat.getColor(context, R.color.color_name)替換,ContextCompat 是 v4 包裡的,請放心使用,另外還有getDrawable()等方法

圖片的資源文件官方推薦只把launcher放在mipmap文件夾下面,而app用到的資源文件建議放在drawable下面。

SharedPreference.Editor的apply是異步操作,不會返回成功的狀態,而commit是同步操作,因此,在多個並發的提交commit的時候,他們會等待正在處理的commit保存到磁盤後再操作下一個數據,從而降低了效率。

如果你在 manifest 中把一個 activity 設置成 android:windowSoftInputMode=”adjustResize”,那麼 ScrollView(或者其它可伸縮的 ViewGroups)會縮小,從而為軟鍵盤騰出空間。但是,如果你在 activity 的主題中設置了 android:windowFullscreen=”true”,那麼 ScrollView 不會縮小。這是因為該屬性強制 ScrollView 全屏顯示。然而在主題中設置 android:fitsSystemWindows=”false” 也會導致 adjustResize 不起作用

在Android 4.0以後,在Manifest.xml中靜態注冊的廣播,程序安裝後必須啟動一次才能接收到廣播,比如你的應用監聽開機啟動的廣播,必須要你的程序被運行過才能監聽到

Activity的onDestory方法調用時機是不確定的(有時候離開界面很久之後才會調用onDestory方法),應該避免指望通過onDestory方法去釋放與Activity相關的資源,否則會導致一些隨機bug

2.X時代Bitmap對象雖然存儲在堆內存中,但是用了一個byte數組存儲其像素信息。通過計數器來記錄該像素信息被引用的個數。有人認為這個byte數組在native堆中,但事實上它也在堆中。只有在使用者調用recycle()後,Bitmap對象才會釋放像素信息,才會在失去引用後被垃圾回收機制銷毀。再加上DVM的heap size有嚴格的閥值,所以在使用大量圖片資源的時候,及其容易發生OOM。解決辦法一般都是,用一個哈希表存儲Bitmap對象的軟引用,作為內存緩存,並在適當時機掉用其recycle()。3.0以上版本Bitmap對象可以通過垃圾回收機制完全銷毀,理論上不用再調用recycle()。

.gitignore只能忽略那些原來沒有被track的文件,如果某些文件已經被納入了版本管理中,則修改.gitignore是無效的。那麼解決方法就是先把本地緩存刪除(改變成未track狀態),然後再提交:

git rm -r –cached .
git add .
git commit -m ‘update .gitignore’
時間戳請使用long或者String類型接收,遇到的坑,由於項目中的model好多都是通過GsonFormat生成的,服務器給的json中的時間戳都是10位的,導致了GsonFormat自動解析成了int, 當測試人員選擇時間為2100年的時候時間戳是4開頭的十位 用int類型接收越界了,導致報錯

為你的app添加默認布局樣式,比如:每一個控件都需要寫width和height屬性,然而很多的控件的寬高屬性都是wrap_content,那麼我們可以通過在style文件添加如下樣式:

這樣,控件的寬高默認都是wrap_content樣式啦。

在style中寫的樣式通過視同parent標簽來擴展你的樣式,這樣更高效,這裡官方的建議是,只有Android自帶的style才用parent標簽,如果是自定義的style,直接用.符號來連接就行。如Fill.Height。

Android上的應用切換按鈕列出的其實不是應用而是Task,所以你會看到有的應用在切換視圖裡有多個任務。如果你的應用中有邏輯上相互獨立的部分,或者想在多窗口環境下並排顯示應用的兩個不同部分,這種情況就適合多任務了。使用manifest屬性(靜態)或者 intent flags(動態)可以實現這一點,詳見視頻: http://v.youku.com/v_show/id_XMTU2ODk4NDg2NA==.html?f=26587294

當app的theme用的是NoActionBar,但是在layout中仍然用到toolbar的時候,不要在style文件中加fitsSystemWindows屬性,而是在用到toolbar的layout最外層加fitsSystemWindows,否則當你使用EditText,在小米手機上長按EditText調出系統粘貼功能的時候,粘貼的layout的布局會錯位.

當WebView與ScrollView嵌套使用,並且WebView有字體放大縮小的功能時,當切換webview的字體後,webview的高度並不能很好的計算出來,這時候可以通過注入的方式,讓js算出高度,經測試,這樣是最可靠的,代碼地址:http://blog.csdn.net/jys1115/article/details/43525979

Context類中的createPackageContext(packageName, flags)方法,可用來獲取指定包名應用程序的Context對象。

TextView類的setKeyListener(KeyListener)方法; 其中DigitsKeyListener類,使用getInstance(String accepted)方法即可指定EditText可輸入字符集;

View類中的getLocationInWindow(int[])方法和getLocationOnScreen(int[])方法,獲取View在窗口/屏幕中的位置;

Context.getCacheDir() - 可以獲取到app默認的緩存路徑。

StaticLayout 在自定義控件繪制文本的時候很有用。

Android中的四大組件千萬不要通過new的方式創建出來。

測試app的時候,我們大都想要將debug和release版本同時安裝到手機裡,可以通過在gradle中修改applicationid來實現:

android {
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            versionNameSuffix '-DEBUG'
        }
        release {
            //...
        }
    }
}

在大多數的登陸界面中,都提供了用戶是否讓密碼可見的選項,Support Library 24.2.0 提供了官方的實現,TextInputLayout 中添加了 passwordToggleEnabled 屬性來開啟此功能,並且可以通過 passwordToggleDrawable 設置圖標。(摘自:Android筆記的微博)

同樣,在Support Library 24.2.0中增加RecyclerView 在快速滾動時的回調接口,SnapHelper是官方的一個實現OnFlingListener 的 一個抽象類,LinearSnapHelper 則是一個完整的實現.LinearSnapHelper默認實現的功能是類似ViewPager,在滾動結束後,會選擇列表某一條居中展示(這裡有開始位置展示,或者結束位置顯示點我).例如:

 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
    recyclerView.setLayoutManager(linearLayoutManager);
    LinearSnapHelper snapHelper = new LinearSnapHelper();
    snapHelper.attachToRecyclerView(recyclerView);

Android中推薦使用的數據結構 :

ArrayMap in place of HashMap 
ArraySet in place of HashSet 
SparseArray in place of HashMap 
SparseBooleanArray in place of HashMap 
SparseIntArray in place of HashMap  
SparseLongArray in place of HashMap  
LongSparseArray in place of HashMap

生成GUID(由於java中只能生成UUID,所以這裡要轉換一下):
return UUID.randomUUID().toString().toUpperCase().replaceAll(“-“, “”);
業務場景:需要定時後台掃描數據庫,上傳本地照片至雲端,定時任務采用何種模式: 1.Handler或者Timer定時一般為秒級別的任務,Timer會啟動額外線程,而Handler可以不用。 2.無論是Handler還是Timer都需要依賴於進程存活 3.利用Handler實現定時任務的類:HandlerTimer 4.如果時間較長,則需要使用AlarmManager 5.另外,我們對於這種業務應該優先考慮是否可以基於事件通知。 6.如果是加入媒體庫的文件,我們可以使用registerContentObserver監聽媒體庫文件變化。

把Activity作為參數傳給一個靜態方法,會影響這個Activity的正常銷毀嗎? 1.內存洩露與方法是否是靜態與否無關,與內部的方法體實現有關系。 2.內存洩露可以簡單理解成:生命周期長的對象不正確持有了持有了生命周期短的對象,導致生命周期短的對象無法回收。 3.比如Activity實例被Application對象持有,Activity實例被靜態變量持有。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved