EnglishVersion ->_->:https://github.com/jiang111/awesome-android-tips/blob/master/README-en.md
值得收藏的AS插件 ->_->:https://github.com/jiang111/awesome-androidstudio-plugins
這里收集了大家常用的一些Android代碼,持續(xù)更新中,內(nèi)容來自自己的平時積累和網(wǎng)絡(luò)上看到的文章腋颠,部分原文地址在最下方州胳。如有錯誤歡迎指正,如有侵權(quán),請聯(lián)系我刪除。里面可能會有重復(fù)內(nèi)容,請忽略或者提醒我刪除瘦穆。
1.setBackgroundResource(0) 可以移除 View 的背景色
2.Resources.getSystem().getDisplayMetrics().density 可以不用 Context 也能獲取屏幕密度哦
3.通過重載 ViewGroup 的 dispatchDraw 可以實(shí)現(xiàn)一個簡單的蒙版效果。 例如下拉刷新時绵咱,可以在 contentView 上加一層遮罩。 canvas.drawRect(0, mContentView.getTranslationY(), getWidth(), getHeight(), mMaskPaint);
4.new 出來的 View 可以用 View.generateViewId() (API 17 以上可用)? 生成 id告喊,系統(tǒng)保證唯一
使用 GridView時 android:padding 和 android:clipToPadding="false" 配合使用效果更好哦。
5.在布局文件中拢切,如果只是為了占位淮椰,可以用 Space 來取代 View纳寂。 最棒的一點(diǎn)是Space可以跳過 Draw 這個過程毙芜。
6.TypedValue.applyDimension(int unit, float value, DisplayMetrics metrics) 方便dp, px, sp 之間的轉(zhuǎn)換腋粥。
7.Activity.startActivities() 這個方法最直接的理解就是使用intent開啟多個Activity
8.TextUtils.isEmpty() 如果傳入的String 為NULL或者Length為0的話就返回 true隘冲。
9.Html.fromHtml() 如果你對Html熟悉的話,可以很迅速通過這個方法處理一些富文本操作奥邮。比如超鏈接和圖文排版等處理洽腺。
10.TextView.setError() 設(shè)置文本框錯誤提醒
11.Build.VERSION_CODES 有些時候我們的app需要根據(jù)不同的SDK版本進(jìn)行執(zhí)行不同的操作
PhoneNumberUtils.convertKeypadLettersToDigits 這個方法簡單粗暴已脓,會將輸入的字母根據(jù)鍵盤上的映射轉(zhuǎn)換為數(shù)字。
12.ArgbEvaluator ArgbEvaluator.evaluate(float fraction, Object startValue, Object endValue);根據(jù)一個起始顏色值和一個結(jié)束顏色值以及一個偏移量生成一個新的顏色画舌,分分鐘實(shí)現(xiàn)類似于微信底部欄滑動顏色漸變。
13.ValueAnimator.reverse() 順暢的取消動畫效果
14.DateUtils.formatDateTime()) 這個方法可以輸出相應(yīng)格式化的時間或者日期
15.Pair 這個類 可以用來存儲存儲一”組”數(shù)據(jù)霹购。但不是key和value的關(guān)系齐疙。
16.SparseArray 目前有很多地方從性能優(yōu)化方說使用SparseArray來替換hashMap贞奋,來節(jié)省內(nèi)存轿塔,提高性能仲墨。
17.Linkify.addLinks() 這個類可以更方便的為文本添加超鏈接目养。
18.android.media.ThumbnailUtils這個類主要是用來處理縮略圖相關(guān)的工作,比如:用來獲取媒體(圖片癌蚁、視頻)的縮略圖
19.createVideoThumbnail(String filePath, int kind)
20.extractThumbnail(Bitmap source, int width, int height)
21.Bitmap.extractAlpha ();返回一個新的Bitmap匈勋,capture原始圖片的alpha值洽洁。有的時候我們需要動態(tài)的修改一個元素的背景圖片又不希望使用多張圖片的時候饿自,通過這個方法,結(jié)合Canvas和Paint可以動態(tài)的修改一個純色Bitmap的顏色复唤。
22.模塊間有消息需要傳遞時佛纫,使用LocalBroadcastManager替代Listener進(jìn)行模塊解耦呈宇。除了解耦甥啄,這樣發(fā)送消息和執(zhí)行消息差一個線程循環(huán)蜈漓,可以減小方法的調(diào)用鏈,我這就碰到一次方法調(diào)用鏈太長導(dǎo)致StackOverflow的問題享完。
23.靜態(tài)變量不要直接或者間接引用Activity驼侠、Service等倒源。這會使用Activity以及它所引用的所有對象無法釋放笋熬,然后胳螟,用戶操作時間一長筹吐,內(nèi)存就會狂升丘薛。
24.Handler機(jī)制有一個特點(diǎn)是不會隨著Activity洋侨、Service的生命周期結(jié)束而結(jié)束希坚。也就是說裁僧,如果你Post了一個Delay的Runnable,然后在Runnable執(zhí)行之前退出了Activity脓钾,Runnable到時間之后還是要執(zhí)行的。如果Runnable里面包含更新View的操作捶枢,程序崩潰了烂叔。
25.不少人在子線程中更新View時喜歡使用Context.runOnUiThread固歪,這個方法有個缺點(diǎn)牢裳,就是一但Context生命周期結(jié)束蒲讯,比如Activity已經(jīng)銷毀時判帮,一調(diào)用就會崩潰晦墙。
26.SharedPreferences.Editor.commit這個方法是同步的晌畅,一直到把數(shù)據(jù)同步到Flash上面之后才會返回踩麦,由IO操作的不可控谓谦,盡量使用apply方法代替反粥。apply只在API Level>=9才會支持,需要做兼容尤蒿。不過腰池,最新的support v4包已經(jīng)為我們做好了處理示弓,使用SharedPreferencesCompat.EditorCompat.getInstance().apply(editor)即可奏属。
27.PackageManager.getInstalledPackages這個方法經(jīng)常使用囱皿,你可能不知道嘱腥,當(dāng)獲取的結(jié)果數(shù)量比較多的時候爹橱,在某些機(jī)型上面調(diào)用它花費(fèi)的時間可能秒級的愧驱,所以盡量在子線程中使用组砚。另外糟红,如果結(jié)果太多盆偿,超過系統(tǒng)設(shè)置的Binder數(shù)據(jù)最大傳輸量的上限事扭,則會發(fā)生TransactionException求橄,如果你使用這個方法獲取機(jī)器上的己安裝應(yīng)用列表罐农,最好做一下預(yù)防涵亏。
28.如果使用Context.startActivity啟動外部應(yīng)用溯乒,最好做一下異常預(yù)防裆悄,因?yàn)閷ふ也坏綄?yīng)的應(yīng)用時光稼,會拋出異常艾君。如果你要打開的是應(yīng)用內(nèi)的Activity冰垄,不防使用顯式Intent虹茶,這樣能提高系統(tǒng)搜索目標(biāo)Activity的效率蝴罪。
29.Application的生命周期就是進(jìn)程的生命周期要门。只有進(jìn)程被干掉時欢搜,Application才會銷毀炒瘟。哪怕是沒有Activity唧领、Service在運(yùn)行斩个,Application也會存在受啥。所以滚局,為了減少內(nèi)存壓力藤肢,盡量不要在Application里面引用大對象嘁圈、Context等最住。
30.設(shè)置全屏方法有2種:1.通過代碼設(shè)置涨缚,2通過manifest文件設(shè)置兰吟。用代碼設(shè)置全屏?xí)rapp在我們應(yīng)用運(yùn)行后揽祥,可能會看到短暫的狀態(tài)欄拄丰,然后才全屏料按,而第二種方法是不會有這種情況的,所以推薦第二種载矿。
//方法1:
//無title
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN,WindowManager.LayoutParams. FLAG_FULLSCREEN);
//必須在setContentView()之前調(diào)用
setContentView(R.layout.main);
//方法2:
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" //全屏主題
android:label="@string/app_name" />
viewpager 的 setCurrentItem 一定要在 setAdapter 方法之后調(diào)用才會有效果.
31.判斷手機(jī)是不是飛行模式? boolean isEnabled = Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1;
32.TabLayout 修改字體的方法官方的 TabLayout 沒有提供修改 TextView size 的方法弯洗,可以新建一個 style CustomTabLayoutTextAppearance 繼承 TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse 牡整,然后增加 item 逃贝,設(shè)置 android:textAllCaps 為 true 沐扳,再設(shè)置 android:textSize 為你想設(shè)置的大小沪摄。再在 TabLayout 的布局文件里設(shè)置 app:tabTextAppearance="@style/CustomTabLayoutTextAppearance" 即可卓起。
33.遍歷HashMap的最佳方法
publicstaticvoidprintMap(Mapmp) {for(Map.Entrym:mp.entrySet()) {System.out.println(m.getKey()+":"+m.getValue());? ? ? ? }}
使用Java在一個區(qū)間內(nèi)產(chǎn)生隨機(jī)整數(shù)數(shù)
publicstaticintrandInt(intmin,intmax) {Randomrand=newRandom();intrandomNum=rand.nextInt((max-min)+1)+min;returnrandomNum;}
34.如果子類實(shí)現(xiàn)Serializable接口而父類未實(shí)現(xiàn)時昼弟,父類不會被序列化舱痘,但此時父類必須有個無參構(gòu)造方法芭逝,否則會拋InvalidClassException異常旬盯。
35.transient關(guān)鍵字修飾變量可以限制序列化胖翰。
36.當(dāng)使用JakeWharton的TabPageIndicator時萨咳,如果需要先做一些耗時的操作鹃两,然后再展示TabPageIndicator的話俊扳,需要先設(shè)置mIndirector.setVisibility(View.GONE);然后耗時任務(wù)結(jié)束以后再mIndirector.setVisibility(View.VISIBLE);否則會報(bào)錯
37.類繼承之間的調(diào)用順序 父類static成員 -> 子類static成員 -> 父類普通成員初始化和初始化塊 -> 父類構(gòu)造方法 -> 子類普通成員初始化和初始化塊 -> 子類構(gòu)造方法
38.華為手機(jī)無法顯示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.
39.后臺service經(jīng)常因?yàn)橹貑⒅惖某霈F(xiàn)onStartCommand()中的Intent傳遞的參數(shù)為null拣度, 通過在onStartCommand()中的返回值改成return super.onStartCommand(intent, Service.START_REDELIVER_INTENT, startId); 可以解決問題抗果。下面介紹幾個flag的意思
| flag? ? ? ? | 解釋? ? ? |
| ------------- |:-------------:|
40.| START_STICKY | 如果service進(jìn)程被kill掉冤馏,保留service的狀態(tài)為開始狀態(tài)逮光,但不保留遞送的intent對象涕刚。隨后系統(tǒng)會嘗試重新創(chuàng)建service极景,由于服務(wù)狀態(tài)為開始狀態(tài)盼樟,所以創(chuàng)建服務(wù)后一定會調(diào)用onStartCommand(Intent,int,int)方法晨缴。如果在此期間沒有任何啟動命令被傳遞到service击碗,那么參數(shù)Intent將為null延都。 |
41.| START_NOT_STICKY | “非粘性的”。使用這個返回值時殊者,如果在執(zhí)行完onStartCommand后猖吴,服務(wù)被異常kill掉海蔽,系統(tǒng)不會自動重啟該服務(wù)拗引。 |
42.|START_REDELIVER_INTENT|重傳Intent矾削。使用這個返回值時哼凯,如果在執(zhí)行完onStartCommand后,服務(wù)被異常kill掉家坎,系統(tǒng)會自動重啟該服務(wù),并將Intent的值傳入苏携。|
43.|START_STICKY_COMPATIBILITY|START_STICKY的兼容版本,但不保證服務(wù)被kill后一定能重啟纱扭。? |
44.不能在Activity沒有完全顯示時顯示PopupWindow和Dialog
45.在多進(jìn)程之間不要用SharedPreferences共享數(shù)據(jù)乳蛾,雖然可以(MODE_MULTI_PROCESS)蹂随,但極不穩(wěn)定
46.有些時候不能使用Application的Context岳锁,不然會報(bào)錯(比如啟動Activity激率,顯示Dialog等)
*備注:大家注意看到有一些NO上添加了一些數(shù)字,其實(shí)這些從能力上來說是YES聪蘸,但是為什么說是NO呢健爬?下面一個一個解釋:
數(shù)字1:啟動Activity在這些類中是可以的,但是需要創(chuàng)建一個新的task设拟,一般情況不推薦纳胧;
數(shù)字2:在這些類中去layout inflate是合法的,但是會使用系統(tǒng)默認(rèn)的主題樣式核行,如果你自定義了某些樣式可能不會被使用芝雪;
數(shù)字3:在Receiver為null時允許位岔,在4.2或以上的版本中赃承,用于獲取黏性廣播的當(dāng)前值瞧剖。(可以無視);
47.ContentProvider可免、BroadcastReceiver之所以在上述表格中抓于,是因?yàn)樵谄鋬?nèi)部方法中都有一個context用于使用。
48.謹(jǐn)慎使用Android的透明主題浇借,透明主題會導(dǎo)致很多問題捉撮,比如:如果新的Activity采用了透明主題妇垢,那么當(dāng)前Activity的onStop方法不會被調(diào)用巾遭;在設(shè)置為透明主題的Activity界面按Home鍵時,可能會導(dǎo)致刷屏不干凈的問題闯估;進(jìn)入主題為透明主題的界面會有明顯的延時感
49.不要在非UI線程中初始化ViewStub灼舍,否則會返回null
50.盡量不要通過Application緩存數(shù)據(jù),這不穩(wěn)定
51.華為手機(jī)無法打開USB調(diào)試的問題涨薪,
52.插好數(shù)據(jù)線,撥號界面 輸入##2846579##進(jìn)入工程模式
53.projectmenu→3后臺設(shè)置→4USB端口配置→Balong調(diào)試模式,點(diǎn)確定
不要拔線,退出工程模式,直接重啟手機(jī),電腦中顯示可移動磁盤(若仍未出現(xiàn),重復(fù)步驟1骑素、2)
這個是關(guān)閉USB調(diào)試的情況下電腦中使用手機(jī)的可移動磁盤的方法,使用后下拉菜單中usb選項(xiàng)也回來了刚夺。
54.android listview中的消息被軟鍵盤遮擋了,在設(shè)置listview的時候加上android:transcriptMode="normal"就好了
55.TextUtils 是一個非常好用的工具類献丑,把 List 轉(zhuǎn)成字符串,逗號分隔侠姑,逗號分隔的 String 字符串创橄,切割成 List ,分別可以用 TextUtils 的 join 和 split 方法莽红。如果要對 List 去重筐摘,則可以用 Collection 的 frequency 方法。
56.在activity中調(diào)用 moveTaskToBack (boolean nonRoot)方法即可將activity 退到后臺船老,注意不是finish()退出。
57.activity中的runOnUiThrea(Runnable action)方法可以直接回到主線程
58.listview有個footerDividersEnabled和headerDividersEnabled方法可以設(shè)置listview的頂部和底部divide圃酵,但是必須保證你設(shè)置了headview和footview才會有效果
59.Throwable類中的getStackTrace()方法柳畔,根據(jù)這個方法可以得到函數(shù)的逐層調(diào)用地址,其返回值為StackTraceElement[]郭赐;
60.StackTraceElement類薪韩,其中四個方法getClassName()确沸,getFileName(),getLineNumber()俘陷,getMethodName()在調(diào)試程序打印Log時非常有用罗捎;
61.UncaughtExceptionHandler接口,再好的代碼異常難免拉盾,利用此接口可以對未捕獲的異常善后
62.Resources類中的getIdentifier(name, defType, defPackage)方法桨菜,根據(jù)資源名稱獲取其ID,做UI時經(jīng)常用到捉偏;
63.view的isShown方法倒得,只有當(dāng)view本身以及它的所有祖先們都是visible時,isShown()才返回TRUE夭禽。而平常我們調(diào)用if(view.getVisibility() == View.VISIBLE)只是對view本身而不對祖先的可見性進(jìn)行判斷霞掺。
64.Arrays類中的一系列關(guān)于數(shù)組操作的工具方法:binarySearch(),asList()讹躯,equals()菩彬,sort(),toString()潮梯,copyOfRange()等骗灶;Collections類中的一系列關(guān)于集合操作的工具方法:sort(),reverse()等酷麦;
65.TextView類中的append(CharSequence)方法矿卑,添加文本。一些特殊文本直接用+連接會變成String沃饶;
66.System類中的arraycopy(src, srcPos, dest, destPos, length)方法母廷,用來copy數(shù)組;
67.Fragment類中的onHiddenChanged(boolean)方法糊肤,使用FragmentTransaction中的hide()琴昆,show()時只會調(diào)用Fragment中的show和hidden狀態(tài),其他生命周期不會調(diào)用。
68.Activity類中的onWindowFocusChanged(boolean)馆揉,onNewIntent(intent)等回調(diào)方法业舍;
69.TextView類中的setTransformationMethod(TransformationMethod)方法,可用來實(shí)現(xiàn)“顯示密碼”功能
70.PageTransformer接口升酣,用來自定義ViewPager頁面切換動畫舷暮,用setPageTransformer(boolean, PageTransformer)方法來進(jìn)行設(shè)置;
71.apache提供的一系列jar包:commons-lang.jar噩茄,commons-collections.jar下面,commons-beanutils.jar等,里面很多方法可能是你曾經(jīng)用幾十幾百行代碼實(shí)現(xiàn)過的绩聘,但是執(zhí)行效率或許要差很多沥割,比如:ArrayUtils耗啦,StringUtils……;
72.ActivityLifecycleCallbacks接口机杜,用于在Application類中監(jiān)聽各Activity的狀態(tài)變化閱讀地址點(diǎn)我
73.ActionBar.hide()/.show() 顧名思義帜讲,隱藏和顯示ActionBar,可以優(yōu)雅地在全屏和帶Actionbar之間轉(zhuǎn)換椒拗。
74.SystemClock.sleep() 這個方法在保證一定時間的 sleep 時很方便似将,通常我用來進(jìn)行 debug 和模擬網(wǎng)絡(luò)延時。
75.UrlQuerySanitizer——使用這個工具可以方便對 URL 進(jìn)行檢查陡叠。
76.ActivityOptions ——方便的定義兩個Activity切換的動畫玩郊。 使用ActivityOptionsCompat 可以很好解決舊版本的兼容問題。
77.getParent().requestDisallowInterceptTouchEvent(true);剝奪父view對touch事件的處理權(quán)枉阵,誰用誰知道译红。
78.HandlerThread,代替不停new Thread開子線程的重復(fù)體力寫法兴溜。
79.IntentService,一個可以干完活后自己去死且不需要我們?nèi)ス芾碜泳€程的Service
80.Executors. newSingleThreadExecutor();這個是java的侦厚,之前不知道它,自己花很大功夫去研究了單線程順序執(zhí)行的任務(wù)隊(duì)列
81.android:animateLayoutChanges="true"拙徽,LinearLayout中添加View的動畫的辦法刨沦,支持通過setLayoutTransition()自定義動畫。
82.AsyncQueryHandler膘怕,如果做系統(tǒng)工具類的開發(fā)想诅,比如聯(lián)系人短信輔助工具等,肯定免不了和ContentProvider打交道岛心,如果數(shù)據(jù)量不是很大的情況下来破,隨便搞,如果數(shù)據(jù)量大的情況下忘古,了解下這個類是很有必要的徘禁,需要注意的是,這玩意兒吃異常..
83.ViewFlipper髓堪,實(shí)現(xiàn)多個view的切換(循環(huán))送朱,可自定義動畫效果,且可針對單個切換指定動畫干旁。
84.android util包中的Pair類驶沼,可以方便的用來存儲一"組"數(shù)據(jù)。注意不是key value
85.android:descendantFocusability争群,ListView的item中CheckBox等元素?fù)尳裹c(diǎn)導(dǎo)致item點(diǎn)擊事件無法響應(yīng)時商乎,除了給對應(yīng)的元素設(shè)置 focusable,更簡單的是在item根布局加上android:descendantFocusability=”blocksDescendants”
86.includeFontPadding="false",TextView默認(rèn)上下是有一定的padding的祭阀,有時候我們可能不需要上下這部分留白鹉戚,加上它即可。
87.Messenger专控,面試的時候通常都會被問到進(jìn)程間通信抹凳,一般情況下大家都是開始背書,AIDL巴拉巴拉伦腐。赢底。有一天在鴻神的博客看到這個,嗯柏蘑,如他所說幸冻,又可以裝一下了。
88.EditTxt.setImeOptions咳焚, 使用EditText彈出軟鍵盤時洽损,修改回車鍵的顯示內(nèi)容(一直很討厭用回車鍵來交互,所以之前一直不知道這玩意兒)
89.java8中新增的LocalDate和LocalTime接口革半,Date雖然是個萬能接口碑定,但是它真的不好用,有了這倆又官,終于可以愉快的處理日期時間了延刘。
90.WeakHashMap,直接使用HashMap有時候會帶來內(nèi)存溢出的風(fēng)險(xiǎn)六敬,使用WaekHashMap實(shí)例化Map碘赖。當(dāng)使用者不再有對象引用的時候,WeakHashMap將自動被移除對應(yīng)Key值的對象外构。
91.使用SnackBar的時候普泡,不要使用view.getRootView()作為snackbar的view,華為榮耀7 會出問題。
92.設(shè)置TextView單行顯示的時候不要用Lines=1,而要用singleLine="true" ,因?yàn)轺茸宀糠质謾C(jī)在設(shè)置Lines=1的時候典勇,然后TextView的值全為數(shù)字的時候劫哼, 你就會懵逼了.
93.TouchDelegate可用于更改View的觸摸區(qū)域。場景:比如在RecyclerView的ItemView里包含了CheckBox組件, 然后想實(shí)現(xiàn)點(diǎn)擊ItemView的時候割笙,也可以觸發(fā)CheckBox权烧,就可以使用此類
94.ArgbEvaluator可用于計(jì)算不同顏色值之間的插值,配合ValueAnimator.ofObject或者ViewPager.PageTransformer使用伤溉,可以實(shí)現(xiàn)不同顏色之間的平滑過渡般码。
95.Palette可用于提取一張圖片的顏色。
96.ViewDragHelper,做過自定義ViewGroup的童鞋都應(yīng)該知道這個東西吧乱顾,用來處理觸摸事件的神器板祝,媽媽再也不用擔(dān)心我自定義控件了。
97.PageTransformer用于定義ViewPager頁面切換時的動畫效果(淡入淡出走净,放大縮小神馬的…)官方有例子券时,直接看吧孤里。
98.Formatter.formatFileSize() 這個方法會格式化數(shù)據(jù)的大小,根據(jù)輸入的字節(jié)大小橘洞,返回 B KB MB GB 等等(最大支持到 PB)捌袜。當(dāng)然要注意的是輸入的最大值是 Long.MAX_VALUE.
99.Activity.recreate重新創(chuàng)建Activity。有什么用呢炸枣?可以在程序更換主題后虏等,立馬刷新當(dāng)前Activity,而不會有明顯的重啟Activity的動畫适肠。
100.View.getContext顧名思義霍衫,就不用解釋了吧…以前在寫RecyclerView的Adapter的時候,為了使用LayoutInflater侯养,經(jīng)常傻乎乎地在構(gòu)造函數(shù)中傳入一個外部的context….是不是只有我不知道而已(笑cry臉)
101.View.post方便在非UI線程對界面進(jìn)行修改敦跌,與Handler的作用類似。并且由于post的Runnable會保證在該View繪制完成的前提下才調(diào)用沸毁,所以一般也可以用于獲取View的寬高峰髓。
102.Activity.runOnUiThread與View.post類似,方便在非UI線程中對界面進(jìn)行修改息尺。
103.Fragment在配合PagerAdapter使用的時候可以重寫setUserVisibleHintFragment()方法携兵,然后根據(jù)參數(shù)的布爾值(true的話表示當(dāng)前Fragment對用戶可見),來執(zhí)行一些邏輯。
104.android:animateLayoutChanges 這是一個非陈в酷炫的屬性徐紧。在父布局加上 android:animateLayoutChanges="true" 后,如果觸發(fā)了layout方法(比如它的子View設(shè)置為GONE)炭懊,系統(tǒng)就會自動幫你加上布局改變時的動畫特效2⒓丁!
105.android:clipToPadding 設(shè)置父view是否允許其子view在它的padding(這里指的是父View的padding)中繪制侮腹。是不是有點(diǎn)繞嘲碧?舉個實(shí)際場景吧:假如有個ListView,我們想要在初始位置時父阻,第一項(xiàng)Item離頂部有10dp的距離愈涩,就可以在ListView的布局中加入android:clipToPadding="false" android:paddingTop="10dp"即可。是不是很方便呢加矛?
rv 的 Layoutmanager 可以直接申明在 xml 中,具體代碼可查看RecyclerView.createLayoutManager 方法.
106.RecyclerView在23.2.+的版本中新增了自動測量的功能履婉,由于新增了自動測量,那么它的item的根布局在需要測量的方向上就不能寫match_parent了斟览,需要改成wrap_content
107.getParent().requestDisallowInterceptTouchEvent(true);剝奪父view對touch事件的處理權(quán)毁腿,誰用誰知道。
108.Canvas中clipRect、clipPath和clipRegion剪切區(qū)域的API已烤。
109.GradientDrawable 有個陰影效果還不錯鸠窗,以為是切的圖片,一看代碼胯究,什么鬼= =塌鸯!
110.有朋友提到了在自定義View時有些方法在開啟硬件加速的時候沒有效果的問題,在API16之后確實(shí)有很多方法不支持硬件加速唐片,通常我們關(guān)閉硬件加速都是在清單文件中通過,其實(shí)android也提供了針對特定View關(guān)閉硬件加速的方法,調(diào)用View.setLayerType(View.LAYER_TYPE_SOFTWARE, null);即可涨颜。
111.PointF费韭,graphics包中的一個類,我們經(jīng)常見到在處理Touch事件的時候分別定義一個downX庭瑰,一個downY用來存儲一個坐標(biāo)星持,如果坐標(biāo)少還好,如果要記錄的坐標(biāo)過多那代碼就不好看了弹灭。用PointF(float x, float y);來描述一個坐標(biāo)點(diǎn)會清楚很多督暂。
112.StateListDrawable,定義Selector通常的辦法都是xml文件,但是有的時候我們的圖片資源可能是從服務(wù)器動態(tài)獲取的,比如很多app所謂的皮膚番刊,這種時候就只能通StateListDrawable來完成了败去,各種addState即可。
113.android:duplicateParentState="true"帖旨,讓子View跟隨其Parent的狀態(tài),如pressed等。常見的使用場景是某些時候一個按鈕很小缠诅,我們想要擴(kuò)大其點(diǎn)擊區(qū)域的時候通常會再給其包裹一層布局,將點(diǎn)擊事件寫到Parent上乍迄,這時候如果希望被包裹按鈕的點(diǎn)擊效果對應(yīng)的Selector繼續(xù)生效的話管引,這時候duplicateParentState就派上用場了。
114.ViewConfiguration.getScaledTouchSlop();觸發(fā)移動事件的最小距離闯两,自定義View處理touch事件的時候褥伴,有的時候需要判斷用戶是否真的存在movie,系統(tǒng)提供了這樣的方法生蚁。
115.ViewStub噩翠,有的時候一塊區(qū)域需要根據(jù)情況顯示不同的布局,通常我們都會通過setVisibility的方法來顯示和隱藏不同的布局邦投,但是這樣默認(rèn)是全部加載的伤锚,用ViewStub可以更好的提升性能。
116.onTrimMemory,在Activity中重寫此方法屯援,會在內(nèi)存緊張的時候回調(diào)(支持多個級別)猛们,便于我們主動的進(jìn)行資源釋放,避免OOM狞洋。
117.TextView.setCompoundDrawablePadding弯淘,代碼設(shè)置TextView的drawable padding。
118.ImageSwitcher吉懊,可以用來做圖片切換的一個類庐橙,類似于幻燈片。
119.在自定義控件的時候,能用drawable來繪制圓借嗽,或者其他樣式的時候,盡量用drawable,因?yàn)閐rawable的效果要遠(yuǎn)勝于canvas.drawXXX().
120.如果想要自定義View支持SwipeRefreshLayout态鳖,只需要聲明并實(shí)現(xiàn)ScrollingView接口即可,RecyclerView和NestedScrollView已經(jīng)實(shí)現(xiàn)此接口恶导。
121.AtomicFile——通過使用備份文件進(jìn)行文件的原子化操作浆竭。這個知識點(diǎn)之前我也寫過,不過最好還是有出一個官方的版本比較好惨寿。
122.DatabaseUtils——一個包含各種數(shù)據(jù)庫操作的使用工具邦泄。
123.Activity.isChangingConfigurations ()——如果在 Activity 中 configuration 會經(jīng)常改變的話,使用這個方法就可以不用手動做保存狀態(tài)的工作了裂垦。
124.SearchRecentSuggestionsProvider——可以創(chuàng)建最近提示效果的 provider顺囊,是一個簡單快速的方法。
125.android:clipChildren (ViewGroup)——如果此屬性設(shè)置為不可用缸废,那么 ViewGroup 的子 View 在繪制的時候會超出它的范圍包蓝,在做動畫的時候需要用到。
126.android:fillViewport (ScrollView)——在這片文章中有詳細(xì)介紹文章鏈接企量,可以解決在 ScrollView 中當(dāng)內(nèi)容不足的時候填不滿屏幕的問題测萎。
127.android:tileMode (BitmapDrawable)——可以指定圖片使用重復(fù)填充的模式。
128.android:enterFadeDuration/android:exitFadeDuration (Drawables)——此屬性在 Drawable 具有多種狀態(tài)的時候届巩,可以定義它展示前的淡入淡出效果硅瞧。
129.Log.wtf()的意思是What a Terrible Failure,而不是What The Fuck!
130.使用RenderScript虛化圖片效果。如果你的app的minSDK為16或者更低恕汇,你需要使用support模式腕唧,因?yàn)楹芏喾椒ǘ际窃贏PI 17之后添加的。renderscriptTargetApi最高到23瘾英,但是你應(yīng)該把它設(shè)置到能保持腳本中使用到的功能完整的最低API枣接。如果你想在support模式下target API 21+你必須使用gradle-plugin 2.1.0 和 buildToolsVersion “23.0.3” 或者以上。需要在gradle中添加renderscriptTargetApi 18,renderscriptSupportModeEnabled true 這兩句話
131.publicstaticBitmapblurBitmap(Contextcontext,Bitmapsrc,intradius) {Bitmapdest=src.copy(src.getConfig(),true);RenderScriptrs=RenderScript.create(context);Allocationallocation=Allocation.createFromBitmap(rs, src);Typet=allocation.getType();AllocationblurredAllocation=Allocation.createTyped(rs, t);ScriptIntrinsicBlurblurScript=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();returndest;? ? }
132.如果想把一個view保存為Bitmap缺谴,正常情況下用第一種方法就可以了但惶,但是如果是ScrollView,則必須采用第二種方法。
133.當(dāng)Activity LauncherMode 為singleTask singleInstance時,使用startActivityForResult會立馬返回膀曾,不能正常調(diào)用县爬。具體請看http://www.360doc.com/content/15/0123/14/12928831_443085580.shtml
134.當(dāng)PopupWindow中有EditText控件時,因?yàn)镻opupwindow 默認(rèn)沒有獲取到焦點(diǎn),需要手動設(shè)置焦點(diǎn)添谊,這樣子view才能獲取到事件的監(jiān)聽财喳。所以你需要在創(chuàng)建完popwindow后設(shè)置他的焦點(diǎn),popupWindow.setFocusable(true);就可以讓EditText獲取焦點(diǎn)斩狱。
135.PopupWindow默認(rèn)點(diǎn)擊外部的時候不消失耳高,需要對PopupWindow 設(shè)置一個背景圖popWindow.setBackgroundDrawable(new BitmapDrawable());要創(chuàng)建一個空對象,設(shè)置為null是不行的所踊,或者就創(chuàng)建一個全透明的背景圖祝高。
136.android中的序列化官方推薦Parceble,其實(shí)Parceble最好用于內(nèi)存之間數(shù)據(jù)的交換,如果要把數(shù)據(jù)寫入硬盤的話,推薦實(shí)現(xiàn)Serializable
137.tools標(biāo)簽可以很好的幫助開發(fā)者實(shí)時預(yù)覽xml的效果,通過tools:background可以預(yù)覽控件所占的控件,tools:visibility可以把一個gone的控件在預(yù)覽的時候展示出來,并且運(yùn)行以后tools標(biāo)簽的內(nèi)容不會展示出來.例如:
138.android studio 2.1起已經(jīng)支持jdk8了,使用的時候要在gradle中加上,需要把buildToolsVersion更新到24以上的版本
android {
defaultConfig {
...
jackOptions {
enabled true
}
}
...
compileOptions {
targetCompatibility 1.8
sourceCompatibility 1.8
}
}
139.6.0之后getResources().getColor()方法被廢棄了,大家可以用ContextCompat.getColor(context, R.color.color_name)替換污筷,ContextCompat 是 v4 包里的,請放心使用乍赫,另外還有g(shù)etDrawable()等方法
140.圖片的資源文件官方推薦只把launcher放在mipmap文件夾下面瓣蛀,而app用到的資源文件建議放在drawable下面。
141.SharedPreference.Editor的apply是異步操作雷厂,不會返回成功的狀態(tài)惋增,而commit是同步操作,因此改鲫,在多個并發(fā)的提交commit的時候诈皿,他們會等待正在處理的commit保存到磁盤后再操作下一個數(shù)據(jù),從而降低了效率像棘。
142.如果你在 manifest 中把一個 activity 設(shè)置成 android:windowSoftInputMode="adjustResize"稽亏,那么 ScrollView(或者其它可伸縮的 ViewGroups)會縮小,從而為軟鍵盤騰出空間缕题。但是截歉,如果你在 activity 的主題中設(shè)置了 android:windowFullscreen="true",那么 ScrollView 不會縮小烟零。這是因?yàn)樵搶傩詮?qiáng)制 ScrollView 全屏顯示瘪松。然而在主題中設(shè)置 android:fitsSystemWindows="false" 也會導(dǎo)致 adjustResize 不起作用
143.在Android 4.0以后,在Manifest.xml中靜態(tài)注冊的廣播锨阿,程序安裝后必須啟動一次才能接收到廣播宵睦,比如你的應(yīng)用監(jiān)聽開機(jī)啟動的廣播,必須要你的程序被運(yùn)行過才能監(jiān)聽到
144.Activity的onDestory方法調(diào)用時機(jī)是不確定的(有時候離開界面很久之后才會調(diào)用onDestory方法)墅诡,應(yīng)該避免指望通過onDestory方法去釋放與Activity相關(guān)的資源壳嚎,否則會導(dǎo)致一些隨機(jī)bug
145.2.X時代Bitmap對象雖然存儲在堆內(nèi)存中,但是用了一個byte數(shù)組存儲其像素信息。通過計(jì)數(shù)器來記錄該像素信息被引用的個數(shù)诬辈。有人認(rèn)為這個byte數(shù)組在native堆中酵使,但事實(shí)上它也在堆中。只有在使用者調(diào)用recycle()后焙糟,Bitmap對象才會釋放像素信息口渔,才會在失去引用后被垃圾回收機(jī)制銷毀。再加上DVM的heap size有嚴(yán)格的閥值穿撮,所以在使用大量圖片資源的時候缺脉,及其容易發(fā)生OOM。解決辦法一般都是悦穿,用一個哈希表存儲Bitmap對象的軟引用攻礼,作為內(nèi)存緩存,并在適當(dāng)時機(jī)掉用其recycle()栗柒。3.0以上版本Bitmap對象可以通過垃圾回收機(jī)制完全銷毀礁扮,理論上不用再調(diào)用recycle()。
146..gitignore只能忽略那些原來沒有被track的文件瞬沦,如果某些文件已經(jīng)被納入了版本管理中太伊,則修改.gitignore是無效的。那么解決方法就是先把本地緩存刪除(改變成未track狀態(tài))逛钻,然后再提交:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
147.時間戳請使用long或者String類型接收僚焦,遇到的坑,由于項(xiàng)目中的model好多都是通過GsonFormat生成的,服務(wù)器給的json中的時間戳都是10位的曙痘,導(dǎo)致了GsonFormat自動解析成了int, 當(dāng)測試人員選擇時間為2100年的時候時間戳是4開頭的十位 用int類型接收越界了,導(dǎo)致報(bào)錯
148.為你的app添加默認(rèn)布局樣式,比如:每一個控件都需要寫width和height屬性,然而很多的控件的寬高屬性都是wrap_content,那么我們可以通過在style文件添加如下樣式:
wrap_content
wrap_content
這樣,控件的寬高默認(rèn)都是wrap_content樣式啦芳悲。
149.在style中寫的樣式通過視同parent標(biāo)簽來擴(kuò)展你的樣式,這樣更高效,這里官方的建議是,只有Android自帶的style才用parent標(biāo)簽边坤,如果是自定義的style名扛,直接用.符號來連接就行。如Fill.Height茧痒。
fill_parent
fill_parent
vertical
150.Android上的應(yīng)用切換按鈕列出的其實(shí)不是應(yīng)用而是Task罢洲,所以你會看到有的應(yīng)用在切換視圖里有多個任務(wù)。如果你的應(yīng)用中有邏輯上相互獨(dú)立的部分文黎,或者想在多窗口環(huán)境下并排顯示應(yīng)用的兩個不同部分惹苗,這種情況就適合多任務(wù)了。使用manifest屬性(靜態(tài))或者 intent flags(動態(tài))可以實(shí)現(xiàn)這一點(diǎn),詳見視頻:http://v.youku.com/v_show/id_XMTU2ODk4NDg2NA==.html?f=26587294
151.當(dāng)app的theme用的是NoActionBar,但是在layout中仍然用到toolbar的時候,不要在style文件中加fitsSystemWindows屬性,而是在用到toolbar的layout最外層加fitsSystemWindows,否則當(dāng)你使用EditText,在小米手機(jī)上長按EditText調(diào)出系統(tǒng)粘貼功能的時候,粘貼的layout的布局會錯位.
152.當(dāng)WebView與ScrollView嵌套使用,并且WebView有字體放大縮小的功能時,當(dāng)切換webview的字體后,webview的高度并不能很好的計(jì)算出來,這時候可以通過注入的方式,讓js算出高度,經(jīng)測試,這樣是最可靠的,代碼地址:http://blog.csdn.net/jys1115/article/details/43525979
153.Context類中的createPackageContext(packageName, flags)方法耸峭,可用來獲取指定包名應(yīng)用程序的Context對象桩蓉。
154.TextView類的setKeyListener(KeyListener)方法;
155.其中DigitsKeyListener類劳闹,使用getInstance(String accepted)方法即可指定EditText可輸入字符集院究;
156.View類中的getLocationInWindow(int[])方法和getLocationOnScreen(int[])方法洽瞬,獲取View在窗口/屏幕中的位置;
157.Context.getCacheDir() - 可以獲取到app默認(rèn)的緩存路徑业汰。
158.StaticLayout 在自定義控件繪制文本的時候很有用伙窃。
159.Android中的四大組件千萬不要通過new的方式創(chuàng)建出來。
160.測試app的時候,我們大都想要將debug和release版本同時安裝到手機(jī)里,可以通過在gradle中修改applicationid來實(shí)現(xiàn):
android {
buildTypes {
debug {
applicationIdSuffix '.debug'
versionNameSuffix '-DEBUG'
}
release {
//...
}
}
}
161.在大多數(shù)的登陸界面中样漆,都提供了用戶是否讓密碼可見的選項(xiàng)为障,Support Library 24.2.0 提供了官方的實(shí)現(xiàn),TextInputLayout 中添加了 passwordToggleEnabled 屬性來開啟此功能放祟,并且可以通過 passwordToggleDrawable 設(shè)置圖標(biāo)鳍怨。(摘自:Android筆記的微博)
162.同樣,在Support Library 24.2.0中增加RecyclerView 在快速滾動時的回調(diào)接口,SnapHelper是官方的一個實(shí)現(xiàn)OnFlingListener 的 一個抽象類,LinearSnapHelper 則是一個完整的實(shí)現(xiàn).LinearSnapHelper默認(rèn)實(shí)現(xiàn)的功能是類似ViewPager,在滾動結(jié)束后,會選擇列表某一條居中展示(這里有開始位置展示,或者結(jié)束位置顯示點(diǎn)我).例如:
163.LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(linearLayoutManager);
LinearSnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
164.Android中推薦使用的數(shù)據(jù)結(jié)構(gòu) :
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
165.生成GUID(由于java中只能生成UUID,所以這里要轉(zhuǎn)換一下):
return UUID.randomUUID().toString().toUpperCase().replaceAll("-", "");
166.業(yè)務(wù)場景:需要定時后臺掃描數(shù)據(jù)庫,上傳本地照片至云端跪妥,定時任務(wù)采用何種模式:
1.Handler或者Timer定時一般為秒級別的任務(wù),Timer會啟動額外線程鞋喇,而Handler可以不用。
2.無論是Handler還是Timer都需要依賴于進(jìn)程存活
3.利用Handler實(shí)現(xiàn)定時任務(wù)的類:HandlerTimer
4.如果時間較長眉撵,則需要使用AlarmManager
5.另外侦香,我們對于這種業(yè)務(wù)應(yīng)該優(yōu)先考慮是否可以基于事件通知。
6.如果是加入媒體庫的文件纽疟,我們可以使用registerContentObserver監(jiān)聽媒體庫文件變化鄙皇。
167.把Activity作為參數(shù)傳給一個靜態(tài)方法,會影響這個Activity的正常銷毀嗎?
1.內(nèi)存泄露與方法是否是靜態(tài)與否無關(guān),與內(nèi)部的方法體實(shí)現(xiàn)有關(guān)系仰挣。
2.內(nèi)存泄露可以簡單理解成:生命周期長的對象不正確持有了持有了生命周期短的對象,導(dǎo)致生命周期短的對象無法回收缠沈。
3.比如Activity實(shí)例被Application對象持有膘壶,Activity實(shí)例被靜態(tài)變量持有。
168.在assert文件夾下存放單個文件的大小不能超過1M洲愤,如果讀取超過1M的文件會報(bào) "Data exceeds UNCOMPRESS_DATA_MAX (1314625 vs 1048576)" 的IOException颓芭。如果一定要存儲,可以分割文件柬赐,再去合并文件
169.在Android library中不能使用switch-case語句訪問資源ID亡问,因?yàn)閏ase分支后面跟的參數(shù)必須是常數(shù),而library中的每一個資源ID都沒有被聲明為final肛宋。
170.當(dāng)前Activity的onPause方法執(zhí)行結(jié)束后才會執(zhí)行下一個Activity的onCreate方法州藕,所以在onPause方法中不適合做耗時較長的工作,這會影響到頁面之間的跳轉(zhuǎn)效率酝陈;
171.不要通過Bundle傳遞大塊的數(shù)據(jù)床玻,否則會報(bào)TransactionTooLargeException異常
172.(AnimationDrawable在Android5.0及以上的版本已有明顯的優(yōu)化)盡量不要使用AnimationDrawable,它在初始化的時候就將所有圖片加載到內(nèi)存中沉帮,特別占內(nèi)存锈死,并且還不能釋放贫堰,釋放之后下次進(jìn)入再次加載時會報(bào)錯;
173..9圖不能通過tinypng壓縮待牵,不然會有問題其屏;
174.genymotion模擬器快是因?yàn)樗腔趚86架構(gòu)的,如果你的應(yīng)用中用到了so缨该,但沒有x86架構(gòu)的so偎行,只能放棄使用它;Android Studio的模擬器也一樣压彭;
175.使用Toast時睦优,建議定義一個全局的Toast對象,這樣可以避免連續(xù)顯示Toast時不能取消上一次Toast消息的情況(如果你有連續(xù)彈出Toast的情況壮不,避免使用Toast.makeText)汗盘;
176.盡量避免給window和Activity同時都設(shè)置了背景,這樣會造成過渡繪制询一,可以通過在給Activity設(shè)置主題時隐孽,去掉windowBackground背景的方式減少一層過渡繪制,有時候?yàn)榱吮苊膺M(jìn)入Activity時會黑屏或者白屏(和主題有關(guān))健蕊,會在給Activity設(shè)置主題的時候給window設(shè)置背景菱阵,如果這種情況下給Activity也設(shè)置了背景,是會增加一倍內(nèi)存的:
@null
177.設(shè)置中更改字體為特大之類的會影響到app的字體樣式缩功,解決方法有: 1.將所有字體使用的單位換成dp晴及,不再使用sp.這樣不是很靠譜,并不是所有人都能做到嫡锌。
Configuration configuration = getResources().getConfiguration();
configuration.fontScale = (float) 1;
//0.85 小, 1 標(biāo)準(zhǔn)大小, 1.15 大虑稼,1.3 超大 ,1.45 特大
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
metrics.scaledDensity = configuration.fontScale * metrics.density;
getBaseContext().getResources().updateConfiguration(configuration, metrics);
//(ps:dialog popupwindow 除外,這兩種需要在控件中重新設(shè)置fontScale)
178.Android中新引入的替代枚舉的注解有IntDef和StringDef,這里以IntDef做例子說明一下.
public class Colors {
@IntDef({RED, GREEN, YELLOW})
//聲明必要的int常量,使用@IntDef修飾LightColors,參數(shù)設(shè)置為待枚舉的集合
@Retention(RetentionPolicy.SOURCE)
//使用@Retention(RetentionPolicy.SOURCE)指定注解僅存在與源碼中,不加入到class文件中
public @interface LightColors{}
//聲明一個注解為LightColors
public static final int RED = 0;
public static final int GREEN = 1;
public static final int YELLOW = 2;
}
//用法
private void setColor(@Colors.LightColors int color) {
Log.d("MainActivity", "setColor color=" + color);
}
//調(diào)用的該方法的時候
setColor(Colors.GREEN);
PathInterpolatorCompat 很方便的使用它來創(chuàng)建各種插值曲線势木,舉個非常簡單的例子:
Path path = new Path();
path.cubicTo(0.2f, 0f, 0.1f, 1f, 0.5f, 1f);
path.lineTo(1f, 1f);
ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.TRANSLATION_X, 500);
animator.setInterpolator(PathInterpolatorCompat.create(path));
animator.start();
179.檢測當(dāng)前網(wǎng)絡(luò)能否訪問遠(yuǎn)程服務(wù)器(國內(nèi)通過ping百度來檢測)
public static boolean isNetWorkAvailable(final Context context) {
try {
Runtime runtime = Runtime.getRuntime();
Process pingProcess = runtime.exec("/system/bin/ping -c 1 www.baidu.com");
int exitCode = pingProcess.waitFor(); //0 代表連通蛛倦,2代表不通
return (exitCode == 0);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
180.攔截系統(tǒng)返回鍵(onBackPressed()),使App不退出啦桌,而是進(jìn)入后臺運(yùn)行
@Override
public void onBackPressed() {
moveTaskToBack(false);
}
181.view.performClick() 自動調(diào)用 View 點(diǎn)擊事件溯壶。通常按鈕等控件只有在用戶點(diǎn)擊時才能觸發(fā)其點(diǎn)擊事件,該方法可以由某些特殊條件觸發(fā)模擬用戶點(diǎn)擊行為甫男。類似的還有 performLongClick() 方法且改。
182.Linkify.addLinks() 通過 android:autoLink 屬性可以為其添加諸如 web、phone 等固定模版的超鏈接點(diǎn)擊事件板驳。但畢竟系統(tǒng)模版有限钾虐,而利用 Linkify.addLinks() 方法可以添加一些應(yīng)用內(nèi)自定義模版,比如新浪微博中的 "@XXX" 格式的超鏈接跳轉(zhuǎn)等笋庄,都可以通過自定義正則表達(dá)式來匹配處理效扫。
183.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE) 設(shè)置安全窗口倔监,禁用系統(tǒng)截屏。防止 App 中的一些界面被截屏菌仁,并顯示在其他設(shè)備中造成信息泄漏浩习。(常見手機(jī)設(shè)備系統(tǒng)截屏操作方式為:同時按下電源鍵和音量鍵。)
摘抄文章:
http://oakzmm.com/2015/08/04/cool-Android-api/
http://weibo.com/liangfeizc?from=feed&loc=nickname
http://zhuanlan.zhihu.com/zmywly8866/20309921
http://www.zhihu.com/question/33636939
http://gold.xitu.io/entry/56c2b9b779bc4400540894ac
https://www.zhihu.com/question/33636939/answer/57239990?group_id=612750833369153536
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0504/4205.html
https://zhuanlan.zhihu.com/p/20309921
http://www.pfeng.org/archives/840#123-tsina-1-92600-1bb80a0982f5c2ea1fcaf67d7fdce2f1
http://blog.danlew.net/2014/03/30/android-tips-round-up-part-1/
http://droidyue.com/blog/2016/10/24/notes-for-an-android-qa/
https://zhuanlan.zhihu.com/p/25120433