@TargetApi(23)
@Override
public void onAttach(Context context) {
super.onAttach(context);
// 執行操做
}
/*
* Deprecated on API 23
* Use onAttachToContext instead
*/
@SuppressWarnings("deprecation")
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
// 執行操做
}
}
複製代碼
Fragment 中,若是要獲取 Activity 對象,不建議調用 getActivity() ,而是在 onAttach() 中將 Context 對象強轉爲 Activity 對象。java
AtomicLong 是線程安全的,Long 是線程不安全的。android
GestureDetector 是一個手勢監聽識別的類,其有兩個接口 OnGestureListener,OnDoubleTapListener 和一個靜態內部類 SimpleOnGestureListener。這個內部類實現了提供的兩個接口。具體實例以下:
複製代碼
GestureDetector detector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
//須要處理什麼手勢,重寫相應的回調方法
@Override
public boolean onDoubleTap(MotionEvent e) {
//雙擊的回調
return super.onDoubleTap(e);
}
});
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
detector.onTouchEvent(event);
return false;
}
});
複製代碼
mWebview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 以下方案可在非微信內部WebView的H5頁面中調出微信支付
if (url.startsWith("weixin://wap/pay?")) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
return true;
}
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
// 這個方法有可能會屢次執行
super.onPageFinished(view, url);
}
});
複製代碼
A:onCreate->A:onStart->A:onResume->A:onPause->B:onCreate->B:onStart->B:onResume->A:onStop
複製代碼
經過給 ToolBar 設置 app:contentInsetStart="0dp" 屬性能夠去除默認的左邊距
複製代碼
ARouter.getInstance().build(RouterConfig.APPLICATION_ACTIVITY).withFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP).navigation(Actvity.this);
複製代碼
當水平方向爲正值,向左側移動,爲負值向右側移動。
當垂直方向爲正值,向上移動,爲負值向下移動。
複製代碼
clearHistory() 做用是調用方法時,清空當前頁面以前的全部記錄
方法1:postDelayed 延時調用
webView.postDelayed(new Runnable() {
@Override
public void run() {
webView.clearHistory();
}
}, 1000);
方法2:在 onPageFinished 方法中去調用 clearHistory 方法
複製代碼
InsecureSHA1PRNGKeyDerivator 工具類的下載地址git
解決方法
private static byte[] getRawKey(byte[] seed) throws Exception {
if (Build.VERSION.SDK_INT >= 24) {//對 9.0 以上的進行處理
byte[] rawKey = InsecureSHA1PRNGKeyDerivator.deriveInsecureKey(seed, 32);
return rawKey;
} else {
KeyGenerator kgen = KeyGenerator.getInstance(AES);
//for android
SecureRandom sr = null;
// 在4.2以上版本中,SecureRandom獲取方式發生了改變
if (android.os.Build.VERSION.SDK_INT >= 17) {
sr = SecureRandom.getInstance(SHA1PRNG, "Crypto");
} else {
sr = SecureRandom.getInstance(SHA1PRNG);
}
// for Java
// secureRandom = SecureRandom.getInstance(SHA1PRNG);
sr.setSeed(seed);
kgen.init(128, sr); //256 bits or 128 bits,192bits
//AES中128位密鑰版本有10個加密循環,192比特密鑰版本有12個加密循環,256比特密鑰版本則有14個加密循環。
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
}
}
複製代碼
Android P 後谷歌限制了開發者調用非官方公開 API 方法或接口,若是經過反射調用了非官方的 API 就會提示這個彈窗,建議查找代碼去掉相應的反射。
複製代碼
在Android P 系統的設備上,若是應用使用的是非加密的明文流量的 http 網絡請求,則會致使該應用沒法進行網絡請求,https 則不會受影響,一樣地,若是應用嵌套了 webview,webview 也只能使用 https 請求。
解決辦法:1.將請求替換未 https
2. 在 res 下新增一個 xml 目錄,而後建立一個名爲:network_security_config.xml 文件(名字自定) ,內容以下,大概意思就是容許開啓 http 請求
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
而後在APP的AndroidManifest.xml文件下的application標籤增長如下屬性
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...
/>
複製代碼
官方給出的解釋github
在 Android 6.0 中,咱們取消了對 Apache HTTP 客戶端的支持。 從 Android 9 開始,默認狀況下該內容庫已從 bootclasspath 中移除且不可用於應用。
解決辦法:在 AndroidManifest.xml 的 application 節點下添加如下內容:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
複製代碼
方案 1:去除 android:screenOrientation="portrait",或者不調用設置方向的代碼
方案 2:設置 <item name="android:windowIsTranslucent">false</item>
<item name="android:windowIsFloating">false</item>
複製代碼
這個是加載的地址是https的,一些資源文件使用的是http方法的,從安卓4.4以後對webview安全機制有了增強,webview裏面加載https url的時候,若是裏面須要加載http的資源或者重定向的時候,webview會block頁面加載。須要設置MixedContentMode。
以下設置:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// 5.0以上容許加載http和https混合的頁面(5.0如下默認容許,5.0+默認禁止)
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
複製代碼
Gson 的 TypeToken 構造函數是 protected。
TypeToken<List<String>> list = new TypeToken<List<String>>() {};
複製代碼
DecimalFormat decimalFormat = new DecimalFormat("0.00");
String format = decimalFormat.format(mPrice);
複製代碼
debug 後也發現是在 nativeColorSpaceCopy 這裏出問題,所以不要手動 recycle()
去掉手動調用 bitmap 的 recycle() 方法便可。
複製代碼
jdk 1.6中以下,別的版本有所不一樣
HashMap 的默認大小爲16,閥值爲0.75,擴容大小爲(當前大小+當前大小*0.75),線程不安全,數據結構爲數組加單向鏈表組成的哈希表結構,鍵值對容許爲null。
HashTable 的默認大小爲11,閥值爲0.75,擴容大小爲(當前大小*2+1),線程安全,數據結構爲數組加單向鏈表組成的哈希表結構,鍵值對不容許爲null。
ArrayList 的默認大小爲10,擴容大小爲(當前大小*1.5+1),線程不安全,數據結構爲動態數組,能夠添加null。
LinkedList 的默認大小爲10,由於是雙向鏈表因此無需擴容,線程不安全,能夠添加null。
HashSet 內部使用了 HashMap 的 Key 來存儲數據,他的數據不能重複。
複製代碼
1.內部類中不能包含靜態方法,必須爲靜態內部類包含靜態方法。
2.靜態內部類不能直接直接訪問外部類的非靜態屬性
複製代碼
獲取圖片旋轉的角度
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
return degree;
}
return degree;
}
複製代碼