上一篇博客傳送門:Android常見問題總結(五)
26.如何處理Android Crash 並重啓手機
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
Intent intent = new Intent(MainActivity.this, MainActivity.class);
startActivity(intent);
Process.killProcess(Process.myPid());
}
});
下面例子中,點擊按鈕會拋出一個運行時異常,左圖爲未設置Handler之前,右圖爲設置Handler之後:
27.如何把view轉化爲bitmap
// 設置能否緩存圖片信息(drawing cache)
view.setDrawingCacheEnabled(true);
// 如果能夠緩存圖片,則創建圖片緩存
view.buildDrawingCache();
// 如果圖片已經緩存,返回一個bitmap
Bitmap bitmap = view.getDrawingCache();
// 釋放緩存佔用的資源
view.destroyDrawingCache();
28.library 與 app資源同名衝突問題
29.Android 揚聲器與聽筒切換
- isSpeakerphoneOn:用於檢測當前是否開啓了揚聲器
- setSpeakerphoneOn:設置是否打開揚聲器
- setMode:設置音頻模式,設置揚聲器時,使用MODE_NORMAL,設置聽筒時,使用MODE_IN_COMMUNICATION
/**
* 設置是否開啓揚聲器
* @param isSpeakerOn 是否開啓
*/
public void setSpeakerphone(boolean isSpeakerOn) {
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
if (audioManager != null) {
audioManager.setMode(isSpeakerOn ? AudioManager.MODE_NORMAL : AudioManager.MODE_IN_COMMUNICATION);
audioManager.setSpeakerphoneOn(isSpeakerOn);
}
}
值得注意的是直接調用這個方法並不能切換生效,我們還需要申請MODIFY_AUDIO_SETTINGS的權限纔行:
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
30.關於addView後寬高的一些細節
對於ViewGroup#addView方法,我們應該都不陌生,該方法經常可以用來動態添加子View- 在使用LayoutInflater時,傳入父ViewGroup:LayoutInflater只有當我們傳入父ViewGroup時,纔會爲我們解析的View設置正確的LayoutParams,否則其實我們寫在xml上的佈局信息並不會準確的生效
- 在addView之前,調用setLayoutParams設置
- 調用addView帶有LayoutParams參數的方法
public void addView(View child) {
addView(child, -1);
}
public void addView(View child, int index) {
if (child == null) {
throw new IllegalArgumentException("Cannot add a null child view to a ViewGroup");
}
LayoutParams params = child.getLayoutParams();
if (params == null) {
params = generateDefaultLayoutParams();
if (params == null) {
throw new IllegalArgumentException("generateDefaultLayoutParams() cannot return null");
}
}
addView(child, index, params);
}
protected LayoutParams generateDefaultLayoutParams() {
return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
}
從第11行我們可以看出,如果我們動態添加的View並沒有設置好相應的LayoutParams,系統變會填充上一個默認的LayoutParams,而大多數情況下,這個LayoutParams的佈局方式並不是我們想要的