-
PopupWindow與AlertDialog的區(qū)別
最關(guān)鍵的區(qū)別是AlertDialog不能指定顯示位置,只能默認(rèn)顯示在屏幕最中間(當(dāng)然也可以通過設(shè)置WindowManager參數(shù)來改變位置)。而PopupWindow是可以指定顯示位置的,隨便哪個(gè)位置都可以斑粱,更加靈活。
mPopWindow.showAtLocation(rootview, Gravity.BOTTOM, 0, 0);
-
AlertDialog風(fēng)格不對(duì)
主題問題雪情,當(dāng)主題不對(duì)時(shí)候状婶,Dialog風(fēng)格可能會(huì)變成很丑的舊API等級(jí)的風(fēng)格。
-
為什么叫Support v4伏蚊,v7
Android Support v4: 這個(gè)包是為了照顧1.6及更高版本而設(shè)計(jì)的立轧,這個(gè)包是使用最廣泛的,eclipse新建工程時(shí)躏吊,都默認(rèn)帶有了氛改。
Android Support v7: 這個(gè)包是為了考慮照顧2.1及以上版本而設(shè)計(jì)的,但不包含更低比伏,故如果不考慮1.6,我們可以采用再加上這個(gè)包胜卤,另外注意,v7是要依賴v4這個(gè)包的凳怨,即瑰艘,兩個(gè)得同時(shí)被包含。
Android Support v13 :這個(gè)包的設(shè)計(jì)是為了android 3.2及更高版本的肤舞,一般我們都不常用紫新,平板開發(fā)中能用到。
-
未解綁服務(wù)使得服務(wù)持有一個(gè)銷毀的activity的context造成內(nèi)存泄露
MainActivity has leaked ServiceConnection com.skyace.service.MainActivity$1@41cd81f0 that was originally bound here
服務(wù)沒有解綁李剖,造成內(nèi)存泄露芒率,onDestroy的回調(diào)方法中加入了對(duì)服務(wù)的解綁操作即 unbindService成功解決
-
handler中的handleMessage返回值
return true 代表事件被處理了,其他handleMessage不會(huì)收到該msg
return false 事件繼續(xù)傳遞篙顺,外層的handleMessage() 會(huì)繼續(xù)執(zhí)行
-
FC問題從log中快速搜索has died
11-18 10:10:59.380 V/CommandService( 495): Death received CommandThread:android.os.BinderProxy@41a1b1b8 in pid:1218
隨后搜索該pid 快速找到log
-
Fragment對(duì)于onActivityResult捕獲不到的情況
被父avtivity的onActivityResult捕獲了
-
軟件盤的本質(zhì)是什么偶芍?軟鍵盤其實(shí)是一個(gè)Dialog充择!
InputMethodService為我們的輸入法創(chuàng)建了一個(gè)Dialog,并且將該Dialog的Window的某些參數(shù)(如Gravity)進(jìn)行了設(shè)置匪蟀,使之能夠在底部或者全屏顯示椎麦。當(dāng)我們點(diǎn)擊輸入框時(shí),系統(tǒng)對(duì)活動(dòng)主窗口進(jìn)行調(diào)整材彪,從而為輸入法騰出相應(yīng)的空間观挎,然后將該Dialog顯示在底部,或者全屏顯示段化。
-
如何去掉字符串前后空格嘁捷,或者說判斷字符串是否為空,或者全部為空格
TextUtils.isEmpty(mStr.trim()
String類自帶的trim()方法显熏,能夠去掉字符串前后空格 -
如何使強(qiáng)制控制鍵盤彈起落下
public void showSoftKeyboard() {
mEditText.setFocusable(true);
mEditText.setFocusableInTouchMode(true);
mEditText.requestFocus();
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(mEditText, InputMethodManager.SHOW_FORCED);
}
public void hideSoftKeyboard() {
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
}
-
系統(tǒng)語言改變那點(diǎn)事
當(dāng)系統(tǒng)語言改變雄嚣,當(dāng)前Activity會(huì)進(jìn)行重新創(chuàng)建,在生命方法中喘蟆,我們可以在manifest中: android:configChanges="locale" 語言(國(guó)家碼)改變
I/###xiamin( 8571): Setting onPause
I/###xiamin( 8571): Setting onStop
I/###xiamin( 8571): Setting onDestory
I/###xiamin( 8571): Setting onCreate
I/###xiamin( 8571): Setting onStart
I/###xiamin( 8571): Setting onResume
-
Android模塊
keyguard(鎖屏)模塊
SystemUI 通知欄和最近應(yīng)用
-
Android分辨率適配終極方案
android-support-percent-lib Android基于百分比的布局缓升,谷歌官方推薦
android-support-percent-lib鴻洋博客
-
SurfaceView
普通的Android控件,例如TextView履肃、Button和CheckBox等仔沿,它們都是將自己的UI繪制在宿主窗口的繪圖表面之上,這意味著它們的UI是在應(yīng)用程序的主線程中進(jìn)行繪制的尺棋。由于應(yīng)用程序的主線程除了要繪制UI之外封锉,還需要及時(shí)地響應(yīng)用戶輸入,否則的話膘螟,系統(tǒng)就會(huì)認(rèn)為應(yīng)用程序沒有響應(yīng)了成福,因此就會(huì)彈出一個(gè)ANR對(duì)話框出來。對(duì)于一些游戲畫面荆残,或者攝像頭預(yù)覽奴艾、視頻播放來說,它們的UI都比較復(fù)雜内斯,而且要求能夠進(jìn)行高效的繪制蕴潦,因此,它們的UI就不適合在應(yīng)用程序的主線程中進(jìn)行繪制俘闯。這時(shí)候就必須要給那些需要復(fù)雜而高效UI的視圖生成一個(gè)獨(dú)立的繪圖表面潭苞,以及使用一個(gè)獨(dú)立的線程來繪制這些視圖的UI。
-
android:splitMotionEvents
定義布局是否傳遞觸摸事件(touch)到子布局真朗,true表示傳遞給子布局此疹,false表示不傳遞。
-
獲取當(dāng)前格式化時(shí)間
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
Date date = new Date(System.currentTimeMillis());
String str = format.format(date);
-
Android為每個(gè)應(yīng)用程序分配的內(nèi)存大小
過去是16M蝗碎,不過根據(jù)機(jī)型而言不一樣湖笨,早期的Android系統(tǒng)G1,就是只有16M
-
Android中內(nèi)部存儲(chǔ)和外部存儲(chǔ)的理解和路徑獲取
1.data/data/包名/shared_prefs
2.data/data/包名/databases
3.data/data/包名/files
4.data/data/包名/cache
外部存儲(chǔ)
外部存儲(chǔ)才是我們平時(shí)操作最多的蹦骑,外部存儲(chǔ)一般就是我們上面看到的storage文件夾慈省,當(dāng)然也有可能是mnt文件夾,這個(gè)不同廠家有可能不一樣脊串。
一般來說辫呻,在storage文件夾中有一個(gè)sdcard文件夾,這個(gè)文件夾中的文件又分為兩類琼锋,一類是公有目錄,還有一類是私有目錄祟昭,其中的公有目錄有九大類缕坎,比如DCIM、DOWNLOAD等這種系統(tǒng)為我們創(chuàng)建的文件夾篡悟,私有目錄就是Android這個(gè)文件夾谜叹,這個(gè)文件夾打開之后里邊有一個(gè)data文件夾,打開這個(gè)data文件夾搬葬,里邊有許多包名組成的文件夾荷腊。
所以外部存儲(chǔ)的路徑是:
storage/sdcard/Android/data/包名/files
storage/sdcard/Android/data/包名/cache
-
SharedPreferences也可以設(shè)置監(jiān)聽器
mSharedPreferences.registerOnSharedPreferenceChangeListener(mOnSharedPreferenceChangeListener);
-
Android獲取唯一機(jī)器碼的代碼
String mDeviceId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
-
將內(nèi)容復(fù)制到粘貼板
ClipboardManager copy = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData myClip;
String text = "" + mIdcode;
myClip = ClipData.newPlainText("text", text);
copy.setPrimaryClip(myClip);
Toast.makeText(WelcomeActivity.this, "復(fù)制成功", Toast.LENGTH_SHORT).show();
-
監(jiān)聽屏幕喚醒和關(guān)閉的廣播
private void registSreenStatusReceiver() {
mScreenStatusReceiver = new ScreenStatusReceiver();
IntentFilter screenStatusIF = new IntentFilter();
screenStatusIF.addAction(Intent.ACTION_SCREEN_ON);
screenStatusIF.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(mScreenStatusReceiver, screenStatusIF);
}
unregisterReceiver(mScreenStatusReceiver);
class ScreenStatusReceiver extends BroadcastReceiver {
String SCREEN_ON = "android.intent.action.SCREEN_ON";
String SCREEN_OFF = "android.intent.action.SCREEN_OFF";
@Override
public void onReceive(Context context, Intent intent) {
if (SCREEN_ON.equals(intent.getAction())) {
}
else if (SCREEN_OFF.equals(intent.getAction())) {
}
}
}
-
Android應(yīng)用的persistent屬性
android:persistent="true"
在Android系統(tǒng)中,有一種永久性應(yīng)用急凰。它們對(duì)應(yīng)的AndroidManifest.xml文件里女仰,會(huì)將persistent屬性設(shè)為true
在系統(tǒng)啟動(dòng)之時(shí),AMS的systemReady()會(huì)加載所有persistent為true的應(yīng)用抡锈。
-
服務(wù)的前臺(tái)運(yùn)行(現(xiàn)在沒什么用了)
-
使用AIDL作為項(xiàng)目之間的接口可能存在一定的風(fēng)險(xiǎn)疾忍。
如何規(guī)避這個(gè)風(fēng)險(xiǎn),網(wǎng)上有文章說床三,在IBinder里面的onTransact函數(shù)中調(diào)用Binder.getCallingUid()和Binder.getCallingPid()來判斷外來方的身份一罩。
但這個(gè)方法,只能是被調(diào)用方檢測(cè)調(diào)用方的身份撇簿。
最近我的服務(wù)作為系統(tǒng)級(jí)服務(wù)存在的,但是其中的一個(gè)標(biāo)志位出了問題,就是通過該方法找到是哪個(gè)進(jìn)程改了的.
-
如何導(dǎo)入外部數(shù)據(jù)庫
把原數(shù)據(jù)庫包括在項(xiàng)目源碼的 res/raw
android系統(tǒng)下數(shù)據(jù)庫應(yīng)該存放在 /data/data/com..(package name)/ 目錄下聂渊,所以我們需要做的是把已有的數(shù)據(jù)庫傳入那個(gè)目錄下.操作方法是用FileInputStream讀取原數(shù)據(jù)庫,再用FileOutputStream把讀取到的東西寫入到那個(gè)目錄.
-
LaunchMode應(yīng)用場(chǎng)景
standard四瘫,創(chuàng)建一個(gè)新的Activity汉嗽。
singleTop,棧頂不是該類型的Activity莲组,創(chuàng)建一個(gè)新的Activity诊胞。否則,onNewIntent。
singleTask撵孤,回退棧中沒有該類型的Activity迈着,創(chuàng)建Activity,否則邪码,onNewIntent+ClearTop裕菠。
注意:
設(shè)置了"singleTask"啟動(dòng)模式的Activity,它在啟動(dòng)的時(shí)候闭专,會(huì)先在系統(tǒng)中查找屬性值affinity等于它的屬性值taskAffinity的Task存在奴潘; 如果存在這樣的Task,它就會(huì)在這個(gè)Task中啟動(dòng)影钉,否則就會(huì)在新的任務(wù)棧中啟動(dòng)画髓。因此, 如果我們想要設(shè)置了"singleTask"啟動(dòng)模式的Activity在新的任務(wù)中啟動(dòng)平委,就要為它設(shè)置一個(gè)獨(dú)立的taskAffinity屬性值奈虾。
如果設(shè)置了"singleTask"啟動(dòng)模式的Activity不是在新的任務(wù)中啟動(dòng)時(shí),它會(huì)在已有的任務(wù)中查看是否已經(jīng)存在相應(yīng)的Activity實(shí)例廉赔, 如果存在肉微,就會(huì)把位于這個(gè)Activity實(shí)例上面的Activity全部結(jié)束掉,即最終這個(gè)Activity 實(shí)例會(huì)位于任務(wù)的Stack頂端中蜡塌。
在一個(gè)任務(wù)棧中只有一個(gè)”singleTask”啟動(dòng)模式的Activity存在碉纳。他的上面可以有其他的Activity。這點(diǎn)與singleInstance是有區(qū)別的馏艾。
singleInstance劳曹,回退棧中攒至,只有這一個(gè)Activity,沒有其他Activity库菲。
singleTop適合接收通知啟動(dòng)的內(nèi)容顯示頁面志膀。
例如,某個(gè)新聞客戶端的新聞內(nèi)容頁面烫止,如果收到10個(gè)新聞推送,每次都打開一個(gè)新聞內(nèi)容頁面是很煩人的戳稽。
singleTask適合作為程序入口點(diǎn)馆蠕。
例如瀏覽器的主界面期升。不管從多少個(gè)應(yīng)用啟動(dòng)瀏覽器,只會(huì)啟動(dòng)主界面一次互躬,其余情況都會(huì)走onNewIntent播赁,并且會(huì)清空主界面上面的其他頁面。
singleInstance應(yīng)用場(chǎng)景:
鬧鈴的響鈴界面吼渡。 你以前設(shè)置了一個(gè)鬧鈴:上午6點(diǎn)容为。在上午5點(diǎn)58分,你啟動(dòng)了鬧鈴設(shè)置界面寺酪,并按 Home 鍵回桌面坎背;在上午5點(diǎn)59分時(shí),你在微信和朋友聊天寄雀;在6點(diǎn)時(shí)得滤,鬧鈴響了,并且彈出了一個(gè)對(duì)話框形式的 Activity(名為 AlarmAlertActivity) 提示你到6點(diǎn)了(這個(gè) Activity 就是以 SingleInstance 加載模式打開的)盒犹,你按返回鍵耿戚,回到的是微信的聊天界面,這是因?yàn)?AlarmAlertActivity 所在的 Task 的棧只有他一個(gè)元素阿趁, 因此退出之后這個(gè) Task 的棧空了坛猪。如果是以 SingleTask 打開 AlarmAlertActivity脖阵,那么當(dāng)鬧鈴響了的時(shí)候,按返回鍵應(yīng)該進(jìn)入鬧鈴設(shè)置界面墅茉。
-
invalidate()和postInvalidate()的區(qū)別
可以把UI線程理解為主線程命黔。其余的線程可以理解為工作者線程。
invalidate()得在UI線程中被調(diào)動(dòng)就斤,在工作者線程中可以通過Handler來通知UI線程進(jìn)行界面更新。
而postInvalidate()在工作者線程中被調(diào)用
-
Android動(dòng)畫框架實(shí)現(xiàn)原理
Animation框架定義了透明度坠宴,旋轉(zhuǎn)喜鼓,縮放和位移幾種常見的動(dòng)畫,而且控制的是整個(gè)View隅忿,實(shí)現(xiàn)原理是每次繪制視圖時(shí)View所在的ViewGroup中的drawChild函數(shù)獲取該View的Animation的Transformation值优烧,然后調(diào)用canvas.concat(transformToApply.getMatrix())匙隔,通過矩陣運(yùn)算完成動(dòng)畫幀纷责,如果動(dòng)畫沒有完成,繼續(xù)調(diào)用invalidate()函數(shù)喂柒,啟動(dòng)下次繪制來驅(qū)動(dòng)動(dòng)畫灾杰,動(dòng)畫過程中的幀之間間隙時(shí)間是繪制函數(shù)所消耗的時(shí)間艳吠,可能會(huì)導(dǎo)致動(dòng)畫消耗比較多的CPU資源,最重要的是栏渺,動(dòng)畫改變的只是顯示磕诊,并不能相應(yīng)事件秀仲。
-
View刷新機(jī)制
由ViewRoot對(duì)象的performTraversals()方法調(diào)用draw()方法發(fā)起繪制該View樹,值得注意的是每次發(fā)起繪圖時(shí)保礼,并不會(huì)重新繪制每個(gè)View樹的視圖炮障,而只會(huì)重新繪制那些“需要重繪”的視圖企蹭,View類內(nèi)部變量包含了一個(gè)標(biāo)志位DRAWN谅摄,當(dāng)該視圖需要重繪時(shí)送漠,就會(huì)為該View添加該標(biāo)志位。
-
View 的關(guān)鍵生命周期
View 的關(guān)鍵生命周期為 [改變可見性] --> 構(gòu)造View --> onFinishInflate --> onAttachedToWindow --> onMeasure --> onSizeChanged --> onLayout --> onDraw --> onDetackedFromWindow
-
Android中圖片占用內(nèi)存的計(jì)算
ARGB_4444 每個(gè)像素2字節(jié)
RGB_565 每個(gè)像素2字節(jié)
ARGB_8888 每個(gè)像素4字節(jié)爷狈。
那么一張720p的圖片淆院,就要占用72012804 大概3.5兆的大小支救,所以圖片處理很重要各墨,不然分分鐘OOM
-
ART和Dalvik區(qū)別
Art上應(yīng)用啟動(dòng)快恃轩,運(yùn)行快叉跛,但是耗費(fèi)更多存儲(chǔ)空間鸣峭,安裝時(shí)間長(zhǎng)摊溶,總的來說ART的功效就是"空間換時(shí)間"莫换。
ART: Ahead of Time Dalvik: Just in Time
什么是Dalvik:Dalvik是Google公司自己設(shè)計(jì)用于Android平臺(tái)的Java虛擬機(jī)。Dalvik虛擬機(jī)是Google等廠商合作開發(fā)的Android移動(dòng)設(shè)備平臺(tái)的核心組成部分之一膛薛,它可以支持已轉(zhuǎn)換為.dex(即Dalvik Executable)格式的Java應(yīng)用程序的運(yùn)行哄啄,.dex格式是專為Dalvik應(yīng)用設(shè)計(jì)的一種壓縮格式,適合內(nèi)存和處理器速度有限的系統(tǒng)锌半。Dalvik經(jīng)過優(yōu)化刊殉,允許在有限的內(nèi)存中同時(shí)運(yùn)行多個(gè)虛擬機(jī)的實(shí)例记焊,并且每一個(gè)Dalvik應(yīng)用作為獨(dú)立的Linux進(jìn)程執(zhí)行。獨(dú)立的進(jìn)程可以防止在虛擬機(jī)崩潰的時(shí)候所有程序都被關(guān)閉瓢颅。
什么是ART:Android操作系統(tǒng)已經(jīng)成熟挽懦,Google的Android團(tuán)隊(duì)開始將注意力轉(zhuǎn)向一些底層組件巾兆,其中之一是負(fù)責(zé)應(yīng)用程序運(yùn)行的Dalvik運(yùn)行時(shí)蔫磨。Google開發(fā)者已經(jīng)花了兩年時(shí)間開發(fā)更快執(zhí)行效率更高更省電的替代ART運(yùn)行時(shí)堤如。ART代表Android Runtime,其處理應(yīng)用程序執(zhí)行的方式完全不同于Dalvik,Dalvik是依靠一個(gè)Just-In-Time(JIT)編譯器去解釋字節(jié)碼榔至。開發(fā)者編譯后的應(yīng)用代碼需要通過一個(gè)解釋器在用戶的設(shè)備上運(yùn)行唧取,這一機(jī)制并不高效枫弟,但讓應(yīng)用能更容易在不同硬件和架構(gòu)上運(yùn)行。ART則完全改變了這套做法韩容,在應(yīng)用安裝的時(shí)候就預(yù)編譯字節(jié)碼到機(jī)器語言宙攻,這一機(jī)制叫Ahead-Of-Time(AOT)編譯。在移除解釋代碼這一過程后柔滔,應(yīng)用程序執(zhí)行將更有效率睛廊,啟動(dòng)更快超全。
ART優(yōu)點(diǎn):
- 系統(tǒng)性能的顯著提升
- 應(yīng)用啟動(dòng)更快嘶朱、運(yùn)行更快脉课、體驗(yàn)更流暢倘零、觸感反饋更及時(shí)
- 更長(zhǎng)的電池續(xù)航能力
- 支持更低的硬件
ART缺點(diǎn):
- 更大的存儲(chǔ)空間占用呈驶,可能會(huì)增加10%-20%
- 更長(zhǎng)的應(yīng)用安裝時(shí)間
-
關(guān)于include
如果我們要在標(biāo)簽中覆寫layout屬性袖瞻,必須要將layout_width和layout_height這兩個(gè)屬性也進(jìn)行覆寫,否則覆寫xiaoguo將不會(huì)生效砌庄。
-
Android幾種進(jìn)程
- 前臺(tái)進(jìn)程:即與用戶正在交互的Activity或者Activity用到的Service等娄昆,如果系統(tǒng)內(nèi)存不足時(shí)前臺(tái)進(jìn)程是最后被殺死的
- 可見進(jìn)程:可以是處于暫停狀態(tài)(onPause)的Activity或者綁定在其上的Service,即被用戶可見扒俯,但由于失去了焦點(diǎn)而不能與用戶交互
- 服務(wù)進(jìn)程:其中運(yùn)行著使用startService方法啟動(dòng)的Service撼玄,雖然不被用戶可見掌猛,但是卻是用戶關(guān)心的荔茬,例如用戶正在非音樂界面聽的音樂或者正在非下載頁面自己下載的文件等丐黄;當(dāng)系統(tǒng)要空間運(yùn)行前兩者進(jìn)程時(shí)才會(huì)被終止
- 后臺(tái)進(jìn)程:其中運(yùn)行著執(zhí)行onStop方法而停止的程序孵稽,但是卻不是用戶當(dāng)前關(guān)心的菩鲜,例如后臺(tái)掛著的QQ,這樣的進(jìn)程系統(tǒng)一旦沒了有內(nèi)存就首先被殺死
- 空進(jìn)程:不包含任何應(yīng)用程序的程序組件的進(jìn)程蛛勉,這樣的進(jìn)程系統(tǒng)是一般不會(huì)讓他存在的
如何避免后臺(tái)進(jìn)程被殺死:
- 調(diào)用startForegound诽凌,讓你的Service所在的線程成為前臺(tái)進(jìn)程
- Service的onStartCommond返回START_STICKY或START_REDELIVER_INTENT
- Service的onDestroy里面重新啟動(dòng)自己
-
65K問題
對(duì)Android方法數(shù)不能超過65K的限制應(yīng)該有所耳聞侣诵,隨著應(yīng)用程序功能不斷的豐富杜顺,總有一天你會(huì)遇到一個(gè)異常:
Conversion to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]: 65536
Android系統(tǒng)中,一個(gè)Dex文件中存儲(chǔ)方法id用的是short類型數(shù)據(jù)穷当,所以導(dǎo)致你的dex中方法不能超過65k
解決方法是dex分包
dex.force.jumbo=true
是的,加入了這句話稀拐,確實(shí)可以讓你的應(yīng)用通過編譯铲咨,但是在一些2.3系統(tǒng)的機(jī)器上很容易出現(xiàn)
INSTALL_FAILED_DEXOPT異常
詳細(xì)方法見:徹底解決Android 應(yīng)用方法數(shù)不能超過65K的問題
-
Android使用static靜態(tài)代碼塊最多的地方
ContentProvider中,用來初始化UriMatcher
private static final UriMatcher
sURLMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
sURLMatcher.addURI("mms", null, MMS_ALL);
sURLMatcher.addURI("mms", "#", MMS_ALL_ID);
}
private SQLiteOpenHelper mOpenHelper;
-
SurfaceTexture 的好處
可以在不使用SurfaceView的情況下,獲取到攝像頭的數(shù)據(jù),并且自己做相應(yīng)處理.
-
攝像頭數(shù)據(jù)那點(diǎn)事
攝像頭數(shù)據(jù)在
public void onPreviewFrame(byte[] data, Camera camera)
回調(diào)中拿到手,到手的為YUV420SP數(shù)據(jù),需要轉(zhuǎn)成bitmap處理,最好是Bitmap.Config.RGB_565.
-
查看每個(gè)應(yīng)用程序最高可用內(nèi)存:
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
Log.d("TAG", "Max memory is " + maxMemory + "KB");
-
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7
原因是:
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.0.1'
問題是v7和design版本不一致 改成一樣的搞版本就好
-
Intent Filter
android的3個(gè)核心組件——Activity、services、廣播接收器——是通過intent傳遞消息的泉坐。intent消息用于在運(yùn)行時(shí)綁定不同的組件腕让。
在 Android 的 AndroidManifest.xml 配置文件中可以通過 intent-filter 節(jié)點(diǎn)為一個(gè) Activity 指定其 Intent Filter,以便告訴系統(tǒng)該 Activity 可以響應(yīng)什么類型的 Intent觉鼻。
intent-filter 的三大屬性
- Action
一個(gè) Intent Filter 可以包含多個(gè) Action坠陈,Action 列表用于標(biāo)示 Activity 所能接受的“動(dòng)作”,它是一個(gè)用戶自定義的字符串若未。
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<action android:name="com.scu.amazing7Action" />
……
</intent-filter>
在代碼中使用以下語句便可以啟動(dòng)該Intent 對(duì)象:
Intent i=new Intent();
i.setAction("com.scu.amazing7Action");
Action 列表中包含了“com.scu.amazing7Action”的 Activity 都將會(huì)匹配成功
- URL
在 intent-filter 節(jié)點(diǎn)中,通過 data節(jié)點(diǎn)匹配外部數(shù)據(jù)乌昔,也就是通過 URI 攜帶外部數(shù)據(jù)給目標(biāo)組件供屉。
<data android:mimeType="mimeType"
android:scheme="scheme"
android:host="host"
android:port="port"
android:path="path"/>
注意:只有data的所有的屬性都匹配成功時(shí) URI 數(shù)據(jù)匹配才會(huì)成功
- Category
為組件定義一個(gè) 類別列表,當(dāng) Intent 中包含這個(gè)類別列表的所有項(xiàng)目時(shí)才會(huì)匹配成功肛走。
<intent-filter . . . >
<action android:name="code android.intent.action.MAIN" />
<category android:name="code android.intent.category.LAUNCHER" />
</intent-filter>
-
Activity 中 Intent Filter 的匹配過程
①加載所有的Intent Filter列表
②去掉action匹配失敗的Intent Filter
『小③去掉url匹配失敗的Intent Filter
④去掉Category匹配失敗的Intent Filter
⑤判斷剩下的Intent Filter數(shù)目是否為0瘦癌。如果為0查找失敗返回異常猪贪;如果大于0,就按優(yōu)先級(jí)排序讯私,返回最高優(yōu)先級(jí)的Intent Filter
-
開發(fā)中Activity的一些問題
一般設(shè)置Activity為非公開的
<activity
......
android:exported="false" />
注意:非公開的Activity不能設(shè)置intent-filter热押,以免被其他activity喚醒(如果擁有相同的intent-filter)。
不要指定activity的taskAffinity屬性
不要設(shè)置activity的LaunchMode(保持默認(rèn))
注意Activity的intent最好也不要設(shè)定為FLAG_ACTIVITY_NEW_TASK
在匿名內(nèi)部類中使用this時(shí)加上activity類名(類名.this,不一定是當(dāng)前activity)
設(shè)置activity全屏
在其 onCreate()方法中加入:
// 設(shè)置全屏模式
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 去除標(biāo)題欄
requestWindowFeature(Window.FEATURE_NO_TITLE);
-
Android去除系統(tǒng)自帶動(dòng)畫的兩種方法
方法一:
在startActivity()或者finish()后緊跟調(diào)用:
((Activity) mContext).overridePendingTransition(0, 0);
方法二:
在一些特殊情況下方法一是不能實(shí)現(xiàn)的.
比如給Intent設(shè)置了屬性:
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
此時(shí)可以這么做:
1.在styles.xml下添加:
<style name="Theme" parent="android:Theme">
<item name="android:windowAnimationStyle">@style/noAnimation</item>
<item name="android:windowNoTitle">true</item>
</style>
<style name="noAnimation">
<item name="android:activityOpenEnterAnimation">@null</item>
<item name="android:activityOpenExitAnimation">@null</item>
<item name="android:activityCloseEnterAnimation">@null</item>
<item name="android:activityCloseExitAnimation">@null</item>
<item name="android:taskOpenEnterAnimation">@null</item>
<item name="android:taskOpenExitAnimation">@null</item>
<item name="android:taskCloseEnterAnimation">@null</item>
<item name="android:taskCloseExitAnimation">@null</item>
<item name="android:taskToFrontEnterAnimation">@null</item>
<item name="android:taskToFrontExitAnimation">@null</item>
<item name="android:taskToBackEnterAnimation">@null</item>
<item name="android:taskToBackExitAnimation">@null</item>
</style>
2.在AndroidManifest.xml中為跳出和跳入的Activity設(shè)置:
android:theme="@style/Theme"
說說AsyncTask的源碼設(shè)計(jì)
當(dāng)我們調(diào)用execute
的時(shí)候,其實(shí)是去調(diào)executeOnExecutor
,傳入我們的默認(rèn)執(zhí)行器的.從代碼中,我們能看到,默認(rèn)的執(zhí)行器是一個(gè)串行的執(zhí)行器.當(dāng)然,這個(gè)串行執(zhí)行器會(huì)再將runnable給一個(gè)ThreadPoolExecutor來執(zhí)行, 這個(gè)ThreadPoolExecutor 默認(rèn)大小是處理器的核心數(shù)的2倍+1, 比如我們是雙核,也就是默認(rèn)大小為5個(gè)線程.
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(128);
/**
* An {@link Executor} that can be used to execute tasks in parallel.
*/
public static final Executor THREAD_POOL_EXECUTOR
= new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
public static final Executor SERIAL_EXECUTOR = new SerialExecutor();
private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;
@MainThread
public final AsyncTask<Params, Progress, Result> execute(Params... params) {
return executeOnExecutor(sDefaultExecutor, params);
}
@MainThread
public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,
Params... params) {
if (mStatus != Status.PENDING) {
switch (mStatus) {
case RUNNING:
throw new IllegalStateException("Cannot execute task:"
+ " the task is already running.");
case FINISHED:
throw new IllegalStateException("Cannot execute task:"
+ " the task has already been executed "
+ "(a task can be executed only once)");
}
}
mStatus = Status.RUNNING;
onPreExecute();
mWorker.mParams = params;
exec.execute(mFuture);
return this;
}
-
子線程更新UI那點(diǎn)事情
在onCreate或者onResume中, 直接開一個(gè)線程更新UI是可以的, 在Activity剛剛起來的時(shí)候, ViewRootImpl不會(huì)走checkTHread
方法, 因?yàn)閙Parent為空.
但是當(dāng)Activity存活了一會(huì)兒,比如我們?cè)O(shè)置個(gè)button點(diǎn)擊事件, 然后點(diǎn)擊觸發(fā)使用線程修改UI, 便會(huì)報(bào)錯(cuò)
-
Glide是如何解決ListView Item圖片加載錯(cuò)亂的問題
因?yàn)樵贕lide into(ImageView)時(shí), 綁定了控件, 若into的是SimpleTarget 然后自己手動(dòng)設(shè)置,若我們自己沒有設(shè)置tag, 便會(huì)錯(cuò)亂.
-
使用lambda表達(dá)式AS錯(cuò)誤
Error:Jack is required to support java 8 language features. Either enable Jack or remove sourceCompatibility JavaVersion.VERSION_1_8.
解決:配置Gradle.
在模塊特定的 build.gradle 文件中輸入以下內(nèi)容:
android { …….
defaultConfig {
jackOptions {
enabled true
}
}
}
-
防止點(diǎn)擊多個(gè)控件
在一個(gè)手機(jī)界面中斤寇,用戶經(jīng)常會(huì)同時(shí)點(diǎn)擊多個(gè)控件桶癣,經(jīng)常會(huì)在短時(shí)間內(nèi)對(duì)某一個(gè)控件點(diǎn)擊多下间雀,這樣就會(huì)造成各種各樣的bug连锯。
只要在xml文件中的父容器總加入這樣一行代碼即可:
android:splitMotionEvents=”false”
如在下面的LinearLayout中加入這行話驳规,表示每一次只能點(diǎn)擊LinearLayout其中的一個(gè)元素,點(diǎn)擊了其他的元素是無效的。
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp10"
android:splitMotionEvents="false"
android:background="@drawable/shape_frame_black"
android:orientation="vertical" >
-
繼續(xù)更新中榜晦。斩郎。。
謝謝大家閱讀,如有幫助肛著,來個(gè)喜歡或者關(guān)注吧局荚!
本文作者:Anderson/Jerey_Jobs
簡(jiǎn)書地址:Anderson大碼渣
github地址:Jerey_Jobs