筆記

Android開發(fā)


一、正則表達(dá)式

  • 手機(jī)號(hào)

        public static boolean isMobileNO(String mobiles) {
            Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\d])|(18[0-9]))\\d{8}$");
            Matcher m = p.matcher(mobiles);
            return m.matches();
            }
    
    

二繁涂、Java

  • Java 非靜態(tài)內(nèi)部類會(huì)默認(rèn)持有外部類的引用。

  • 正則表達(dá)式轉(zhuǎn)義

      matches 量愧、replaceAll柑土、replaceFirst慢哈、split等函數(shù)參數(shù)為正則表達(dá)式,匹配"."等需要轉(zhuǎn)義`"\\\."`观游。replace不支持正則搂捧。
    
  • StringBuffer 線程安全,效率低懂缕。Stringbuilder非多線程允跑,效率高。

  • 泛型的限制

  1. 在使用 String.class List.class 不能使用泛型形式(List<?>.class 是錯(cuò)誤的)
    1. 在使用 instanceof 時(shí)候只能使用通配泛型(List<?>) (只能 o instanceof List<?>或者 o instanceof List 而不能 o instanceof List<String>)
    2. 不能創(chuàng)建泛型數(shù)組
  • Java printf(n%) 換行

  • 枚舉避免使用ordinal

最好添加一個(gè) private final int order 變量搪柑,構(gòu)造函數(shù)中賦值聋丝,然后獲取順序。

  • EnumSet.of(...) 創(chuàng)建枚舉集合; new EnumMap<Enum,Object>(Enum.class)

  • Collections.unmodifiableXX() 創(chuàng)建不可改變的集合

  • java.lang.reflect Class.newInstance

  • 對(duì)象傳給print工碾、字符串聯(lián)操作符(+)弱睦、assert、調(diào)試器打印 會(huì)自動(dòng)調(diào)用toString方法

  • Java沒(méi)有可變參數(shù)渊额,多個(gè)構(gòu)造函數(shù)時(shí)可以用 Builder 代替

  • Java 讀取long double 是非原子的

  • 調(diào)用構(gòu)造函數(shù)

構(gòu)造函數(shù)的第一行 可以用 this(xx,....)等况木,調(diào)用本類其他的構(gòu)造函數(shù),super類似旬迹,也需要放在首行火惊,調(diào)用父類的構(gòu)造方法

  • 后臺(tái)線程

Thread.setDeamon(true) 將線程變成后臺(tái)線程,進(jìn)程若只剩下后臺(tái)線程奔垦,這個(gè)進(jìn)程會(huì)結(jié)束屹耐。

  • 獲取父類名字

Object類中的getClass()是final的,因此 super.getClass().getName()仍然調(diào)用Object中的方法椿猎,獲取的還是子類的名字惶岭,獲取父類名字應(yīng)該用 getClass().getSuperClass().getName()

  • try return finally

  • try中有return,finally在return中間運(yùn)行(在return之后寿弱,但不影響return結(jié)果)
    try{
        i = 1;
        return i;
    }finally{
        i++;
    }//結(jié)果 是 1
  • try中有return,finally中也有return,finally中return值有效
    try{
        return 1;
    }finally{
        return 2;
    }//結(jié)果 是 2
  • try中有 System.exit(0);,Java虛擬機(jī)會(huì)直接退出,finally并不會(huì)執(zhí)行俗他。
  • 總結(jié):finally比return和break后執(zhí)行且不影響return結(jié)果脖捻;如果finally中有return,會(huì)提前終止并以finally中return值返回兆衅。
  • synchronized 和 Lock

  1. Lock可以嘗試獲取鎖 lock.tryLock(),也可以嘗試一段時(shí)間后放棄lock.tryLock(2,TimeUnit.SECONDS)嗜浮。
  2. synchronized 不可以羡亩,但使用簡(jiǎn)單,更安全危融。
  • 線程休眠

jdk5之后用 TimeUnit.SECONDS.sleep(1) 代替 Thread.sleep(1000)

  • 用一個(gè)檢查感興趣條件的while循環(huán)包圍wait()

  • final 的 instant variable(實(shí)例變量) 沒(méi)有 default value

  • public class的名字必須和文件名相同

  • Java 中的Type

Type

它是所有類型的公共接口畏铆。包括原始類型、參數(shù)化類型吉殃、數(shù)組類型辞居、類型變量和基本類型。ParameterizedType, TypeVariable, WildcardType,GenericArrayType這四個(gè)接口都是它的子接口蛋勺。

GenericDeclaration

這個(gè)接口Class瓦灶、Method、Constructor都有實(shí)現(xiàn)抱完,我們就是要用這個(gè)接口的getTypeParameters方法贼陶,它返回一個(gè)TypeVariable[]數(shù)組,這個(gè)數(shù)組里面就是我們定義的類型變量T和K巧娱,順序與我們聲明時(shí)一樣碉怔。如果用循環(huán)語(yǔ)句將數(shù)組打印出來(lái),你會(huì)發(fā)現(xiàn)只會(huì)輸出T和K禁添,這可不是我們想要的結(jié)果撮胧,那么想要獲得預(yù)期的結(jié)果怎么辦呢?請(qǐng)繼續(xù)往下看老翘。

TypeVariable

它表示類型變量芹啥。比如T,比如K extends Comparable<? super T> & Serializable酪捡,這個(gè)接口里面有個(gè)getBounds()方法叁征,它用來(lái)獲得類型變量上限的Type數(shù)組,如果沒(méi)有定義上限逛薇,則默認(rèn)設(shè)定上限為Object捺疼,請(qǐng)注意TypeVariable是接口,實(shí)際得到的是TypeVariableImpl實(shí)現(xiàn)類永罚,下面幾個(gè)接口都一樣啤呼。
拿T和K來(lái)說(shuō)明卧秘,T沒(méi)有定義任何上限,所以它就有一個(gè)默認(rèn)上限java.lang.Object官扣,實(shí)際跟蹤代碼的時(shí)候你會(huì)發(fā)現(xiàn)T的bounds屬性為空翅敌,只有在調(diào)用了getBounds()方法后,才會(huì)有一個(gè)Type[1]數(shù)組[class java.lang.Object]惕蹄。而對(duì)于K來(lái)說(shuō)蚯涮,調(diào)用了getBounds方法后,得到的數(shù)組是[java.lang.Comparable<? super T>, interface java.io.Serializable]卖陵,它們的類型卻是不一樣的遭顶,第1個(gè)是ParameterizedType,而第二個(gè)是Class

ParameterizedType

ParameterizedType表示參數(shù)化類型泪蔫,就是上面說(shuō)的java.lang.Comparable<? super T>棒旗,再比如List<T>,List<String>撩荣,這些都叫參數(shù)化類型铣揉。得到Comparable<? super T>之后,再調(diào)用getRawType()與getActualTypeArguments()兩個(gè)方法餐曹,就可以得到聲明此參數(shù)化類型的類(java.lang.Comparable)和實(shí)際的類型參數(shù)數(shù)組([? super T])逛拱,而這個(gè)? super T又是一個(gè)WildcardType類型。

WildcardType

它用來(lái)描述通配符表達(dá)式凸主,上面返回的? super T正好是這個(gè)類型橘券。然后調(diào)用getUpperBounds()上限和getLowerBounds()下限這兩個(gè)方法,獲得類型變量?的限定類型(上下限)卿吐,對(duì)于本例的通配符(?)旁舰,它的上限為java.lang.Object,下限為T
通過(guò)上面幾個(gè)接口的分析嗡官,可以將Person類的泛型參數(shù)都解析出來(lái)箭窜,那么Person的超類以及實(shí)現(xiàn)的接口該怎么處理呢?Class類里面同樣在1.5版本加入了getGenericSuperclass()與getGenericInterfaces()兩個(gè)方法衍腥,用于返回帶參數(shù)化類型的超類與接口磺樱。

  • 自增運(yùn)算符

int count = 0;
count = count++;
//count的值為0
  • 在序列化類中,不要使用構(gòu)造函數(shù)為final變量賦值婆咸。

  • Integer.valueOf() -128~127是從對(duì)象池中取的竹捉。

  • 接口中可以有實(shí)現(xiàn)

    interface A{
        void A();
    }
    interface B{
        public static final A = new A(){
            void A(){
                System.out.println("Bingo!");
            }
        }
    }

  • 最好不要在構(gòu)造函數(shù)中聲明初始化其他類

  • String 常量池

String s = new String("哈哈哈")
//不會(huì)檢查、添加常量池
  • 集合默認(rèn)申請(qǐng)長(zhǎng)度 10

為避免多次申請(qǐng)內(nèi)存尚骄,最好指定初始容量

  • 反序列化時(shí)構(gòu)造函數(shù)不執(zhí)行

  • ArrayList是動(dòng)態(tài)數(shù)組块差;Vector是線程安全的動(dòng)態(tài)數(shù)組

  • 子列表是原始列表的視圖

    List list = new ArrayList<Object>(100);
    list.subList(20,30).clear;// 刪除list中20~30位置的元素
subList返回list的視圖后,不能對(duì)list再進(jìn)行修改,會(huì)報(bào)ConcurrentModificationException憨闰∽次希可以用Collections.unmodifiableList 保護(hù)原list
  • 垃圾回收

    (一)對(duì)象是否“已死”
    1. 引用計(jì)數(shù)
    2. 可達(dá)性
    (二)垃圾收集算法
    1. 標(biāo)記-清楚
    2. 復(fù)制
    3. 標(biāo)記-整理
  • 單例

除枚舉單例外,其他五種單例模式都可以以反序列化的方式重新生成對(duì)象鹉动。要重新方法

private Object readResolve(){
    return instance;
}
  • Builder模式的優(yōu)點(diǎn)

  1. 避免要構(gòu)造的對(duì)象暴露過(guò)多不相關(guān)接口
  2. 可以保持一致性(某些屬性建立后不能隨意修改轧坎,將配置分離)
  • Cloneable實(shí)現(xiàn)拷貝時(shí),構(gòu)造函數(shù)不會(huì)執(zhí)行泽示。(clone 是內(nèi)存中二進(jìn)制流的拷貝)

  • 不能將除了null之外的任何元素放到Collection<?>中


三缸血、Android

  • EditText輸入法

EditText 啟動(dòng)獲得焦點(diǎn)會(huì)彈出
輸入法取消辦法:在AndroidManifest.xml中對(duì)應(yīng)的anctivity中添加 android:windowSoftInputMode="stateHidden",F(xiàn)ragment同樣適用械筛。但是這種方法會(huì)導(dǎo)致快速點(diǎn)擊控件時(shí)属百,出現(xiàn)輸入法閃動(dòng)問(wèn)題。 edit.setInputType(InputType.TYPE_NULL)則不會(huì);

  • ListView setSelection 選中并移動(dòng)到

ListView中setSelection变姨,因?yàn)槭悄阕约河|發(fā)的select事件,你自己肯定知道厌丑,它默認(rèn)認(rèn)為沒(méi)有必要通知定欧,因此不觸發(fā)事件,也不通知監(jiān)聽器怒竿。只是刷新選中位置砍鸠,并滾動(dòng)界面,請(qǐng)求重新布局耕驰。
很多操作需要等待某個(gè)UI組件加載完才能執(zhí)行爷辱,可以用post(Runnable)來(lái)實(shí)現(xiàn)。在listView加載完成后執(zhí)行操作朦肘。
例:

    listView.post(new Runnable() {
                public void run() { 
                    //執(zhí)行操作
                    listView.setSelection(i);
                }
            });
  • Padding與margin的區(qū)別饭弓。

Padding控制本控件內(nèi)子控件的距離。Margin控制本控件在母控件的距離媒抠。

  • "<"符號(hào) 可以用 "&lt"來(lái)實(shí)現(xiàn)弟断; "&" 用 "&amp"

  • 鍵盤彈出壓擠屏幕控件

AndroidManifest.xml 文件中界面對(duì)應(yīng)的 < activity> 里加入
android:windowSoftInputMode="adjustPan" 鍵盤就會(huì)覆蓋屏幕 android:windowSoftInputMode="stateVisible|adjustResize" 屏幕整體上移

  • Edittext獲取焦點(diǎn)隱藏顯示輸入法趴生、鍵盤

        private void setViewFocus(View v) {
                v.setFocusable(true);
                v.setFocusableInTouchMode(true);
                v.requestFocus();
                v.requestFocusFromTouch();
            }
    
        private void openInput(Context context, View editText) {
            InputMethodManager m = (InputMethodManager) getActivity()
                    .getSystemService(Context.INPUT_METHOD_SERVICE);
            m.showSoftInput(editText, 0);
        }
    
        private void closeInput(Context context, View editText) {
            InputMethodManager manager = (InputMethodManager) getActivity()
                    .getSystemService(Context.INPUT_METHOD_SERVICE);
            manager.hideSoftInputFromWindow(editText.getWindowToken(), 0);
        }
        protected void closeInput(View editText) {
            InputMethodManager manager = (InputMethodManager) 
                    getSystemService(Context.INPUT_METHOD_SERVICE);
            manager.hideSoftInputFromWindow(editText.getWindowToken(), 0);
        }
        protected void closeInputMethod() {
            InputMethodManager manager = (InputMethodManager)
                    getSystemService(Context.INPUT_METHOD_SERVICE);
            manager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    
      方法一:
      在AndroidMainfest.xml中選擇哪個(gè)activity阀趴,設(shè)置windowSoftInputMode屬性為adjustUnspecified|stateHidden
      ```xml
          <activity android:name=".Main"
              android:label="@string/app_name"
              android:windowSoftInputMode="adjustUnspecified|stateHidden"
              android:configChanges="orientation|keyboardHidden">
              <intent-filter>
                  <action android:name="android.intent.action.MAIN" />
                  <category android:name="android.intent.category.LAUNCHER" />
              </intent-filter>
          </activity>
      ```
    
      方法二:
      讓EditText失去焦點(diǎn),使用EditText的clearFocus方法
      例如:EditText edit=(EditText)findViewById(R.id.edit);
      edit.clearFocus();
    
      方法三:
      強(qiáng)制隱藏Android輸入法窗口
      例如:EditText edit=(EditText)findViewById(R.id.edit);
      InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
      imm.hideSoftInputFromWindow(edit.getWindowToken(),0);
    
      2.EditText始終不彈出軟件鍵盤
      例:EditText edit=(EditText)findViewById(R.id.edit);
      edit.setInputType(InputType.TYPE_NULL);
    
      以上都會(huì)導(dǎo)致點(diǎn)擊時(shí)輸入法閃動(dòng)苍匆,終極方法Edittext.setInputType(InputType.NULL),這樣會(huì)徹底禁用輸入法刘急,但是也會(huì)屏蔽輸入類型設(shè)置 NUMBER、TEXT都不起作用浸踩。如果是自定義鍵盤輸入的話可以用正則匹配叔汁。
    
  • BigDecimal 的 add 函數(shù)。

    BigDecimal a = BigDecimal.ZERO;
    a.add(new BigDecimal("1"));
    //a的值還是零。攻柠。球订。。

  • List 中有選擇框等控件等瑰钮,會(huì)屏蔽點(diǎn)擊

android:descendantFocusability="blocksDescendants"加到 item 可以解決

  • ProgressDialog 內(nèi)存泄露

在 Activity的 onDestroy 里要寫上 pd.dismiss冒滩。或者使用弱引用private WeakReference<Context> context;否則浪谴,顯示ProgressDialog的線程出問(wèn)題會(huì)因?yàn)锳ctivity泄露而隱藏實(shí)際的出錯(cuò)信息开睡。

  • 可以代替繁瑣的findviewbyid

    public <T extends View> T (int id){ return (T) super.findViewById(id); } public <T extends View> T(View view,int id){
    return (T) view.findViewById(id);
    }
  • 去標(biāo)題欄

    1、在AndroidManifest.xml的配置文件里面的<activity>標(biāo)簽添加屬性:
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
    2苟耻、在Activity的onCreate()方法中的super()和setContentView()兩個(gè)方法之間加入下面兩條語(yǔ)句
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉標(biāo)題欄
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//去掉信息欄
  • Android快速截圖

    1. 截圖:
      adb shell screencap -p /sdcard/Download/12.png
    2. 從設(shè)備拉到本地電腦
      adb pull /sdcard/Download/12.png
  • {@link State#RESET}注釋

  • textView.setTextAppearance(context,R.style.normal_button);//動(dòng)態(tài)切textstyle

  • Fragment 不要自定義構(gòu)造函數(shù)篇恒,在恢復(fù)現(xiàn)場(chǎng)時(shí)系統(tǒng)只能調(diào)用默認(rèn)的構(gòu)造函數(shù)。

  • ListView 單條更新

    private void updateSingleRow(ListView listView, long id){
        if (listView != null) {                  
        int start = listView.getFirstVisiblePosition();                  
        for (int i = start, j = listView.getLastVisiblePosition(); i <= j; i++){
            if (id == ((Messages) listView.getItemAtPosition(i)).getId()) {                          
                View view = listView.getChildAt(i - start);                          
                getView(i, view, listView);                          
                break;                      
            } 
        }                 
    }
  • ListView 兩次快速的notifyDataSetChanged會(huì)導(dǎo)致某個(gè)item 不刷新問(wèn)題凶杖。詳見(jiàn)點(diǎn)擊兩個(gè)item會(huì)同時(shí)改變背景色問(wèn)題胁艰。用ListView單條更新來(lái)解決。

    View view = mListView.getChildAt(position-mListView.getFirstVisiblePosition());
    getView(position, view, mListView);
  • EventBus

  1. 添加訂閱者:EventBus.getDefault().register(this);

  2. 訂閱者所在類可以定義以下一個(gè)或多個(gè)方法用以接收事件:

     public void onEvent(MsgEvent1 msg)
     public void onEventMainThread(MsgEvent1 msg)
     public void onEventBackgroundThread(MsgEvent1 msg)
     public void onEventAsync(MsgEvent1 msg)
    
  3. 發(fā)布者發(fā)布事件:EventBus.getDefault().post(new MsgEvent1("主線程發(fā)的消息1"));

  4. 取消訂閱:EventBus.getDefault().unregister(this);

  • 啟動(dòng)Activity方法

        public static void actionStart(Context context, String data1, String data2) {
            Intent intent = new Intent(context, SecondActivity.class);
            intent.putExtra("param1", data1);
            intent.putExtra("param2", data2);
            context.startActivity(intent);
        }
        
        SecondActivity.actionStart(FirstActivity.this, "data1", "data2");
    
  • 確認(rèn)窗口

    private void showDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(
                SellActivity.this);
        builder.setTitle("系統(tǒng)提示");
        builder.setMessage("退出將清空銷售列表智蝠,確定要退出嗎腾么?");
        builder.setNegativeButton("否", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
    
        builder.setPositiveButton("是", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();                
                SellActivity.this.finish();
            }
        });
        builder.show();
    }
    

+ #### 一個(gè)ListView的item要響應(yīng)三個(gè)點(diǎn)擊區(qū)域,整體要響應(yīng)滑動(dòng)
    用touchlistener杈湾,重寫onTouch 可以根據(jù)點(diǎn)擊位置判斷區(qū)域。(可能產(chǎn)生適配問(wèn)題)漆撞。


+ #### Android自定義鍵盤 (巨坑)
1)不能單獨(dú)改變某個(gè)按鍵樣式悍汛,只能通過(guò)多鍵盤堆疊實(shí)現(xiàn)
    2)默認(rèn)鍵盤不對(duì)稱员凝,會(huì)向右偏移



+ #### 小微商戶兩步導(dǎo)出數(shù)據(jù)庫(kù) 
    adb shell中:cp /data/data/com.hisense.pos.xwpos/databases/xwpos.db /sdcard
    cmd中:        adb pull  /sdcard/xwpos.db

+ #### startActivityForResult 無(wú)法調(diào)用singleTask的Activity。
在B開啟之后的瞬間(未等B返回任何result),A的onActivityResult方法就會(huì)被調(diào)用,并且收到一個(gè)RESULT_CANCEL的request code糖埋。


+ #### intent-filter 
一條<intent-filter>元素至少應(yīng)該包含一個(gè)<action>,否則任何Intent請(qǐng)求都不能和該<intent-filter>匹配祟敛。如果Intent請(qǐng)求的Action和<intent-filter>中個(gè)某一條<action>匹配跑揉,那么該Intent就通過(guò)了這條<intent-filter>的動(dòng)作測(cè)試历谍。如果Intent請(qǐng)求或<intent-filter>中沒(méi)有說(shuō)明具體的Action類型,那么會(huì)出現(xiàn)下面兩種情況脱衙。
    (1) 如果<intent-filter>中沒(méi)有包含任何Action類型,那么無(wú)論什么Intent請(qǐng)求都無(wú)法和這條<intent-filter>匹配眠饮;
    (2)反之,如果Intent請(qǐng)求中沒(méi)有設(shè)定Action類型扔茅,那么只要<intent-filter>中包含有Action類型,這個(gè)Intent請(qǐng)求就將順利地通過(guò)<intent-filter>的行為測(cè)試

    

+ #### onTouch(onTouchListener中) 優(yōu)于 onTouchEvent(View中)先執(zhí)行玖瘸。

+ #### gettextsize返回像素單位
setTextSize(int size)默認(rèn)單位sp,可以使用setTextSize(type,size) type TypedValue.COMPLEX_UNIT_PX 限定。


+ #### ListView嵌套ScrollView蔑匣,重寫LisctView 的 onMeasure 方法

    ```java
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
    ```

+ #### Fragment 不會(huì)立即 commit
FragmentTransaction執(zhí)行commit方法后凿将,并非Fragment事務(wù)就立即執(zhí)行牧抵,依賴于系統(tǒng)的處理性能。當(dāng)然你可以調(diào)用executePendingTransactions()方法立即執(zhí)行弛作。其實(shí)這樣做通常沒(méi)有必要映琳,除非Fragment事務(wù)依賴于其他現(xiàn)場(chǎng)的工作任務(wù)。

+ #### 一個(gè)View.animate().setListener(...)之后谎脯,再次View.animate() 會(huì)調(diào)用上一個(gè)listener。


+ #### ListView的 item 布局如果不是透明的废麻,會(huì)覆蓋Listview的 android:listSelector 效果

+ #### 閃屏
Activity的 theme 是透明(android:windowIsTranslucent)時(shí),從其他棧Activity返回時(shí)(例如其他應(yīng)用怜姿、singleInstance的Activity、調(diào)用系統(tǒng)圖庫(kù)相機(jī) 等)會(huì)出現(xiàn)閃現(xiàn)桌面的情況搏恤。


+ #### 自定義控件

1. 繼承ViewGroup(LinearLayout 等)
2. 資源文件 attrs 中聲明 styleable
3. XML 文件中引用藤巢,并聲明屬性
4. 構(gòu)造函數(shù)中通過(guò)以下代碼獲取xml中對(duì)應(yīng)屬性 `R.styleable.IconText_left_text` (styleable名字 + " _ " + 對(duì)應(yīng)屬性名字)

    ```java
        public class TabView extends LinearLayout {       
        public TabView(Context context, AttributeSet attrs) {
            super(context, attrs);
            LayoutInflater.from(context).inflate(R.layout.share_topbar_tip, this);
            TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.IconText);
            String leftIconTextString = a.getString(R.styleable.IconText_left_text);
            a.recycle();
            findControls();
            addListeners();
        }
        }
    ```
    ```xml
    <declare-styleable name="IconText">
        <attr name="left_text" format="string"></attr>
        <attr name="right_text" format="string"></attr>
    </declare-styleable>
    ```

    ```xml
    <com.hisense.pos.xwpos.ui.TabView 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:left_text = "全部交易"
    /> 
    ```

    ```java
    TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.IconText);
    String leftText = a.getString(R.styleable.IconText_left_text);
    a.recycle();
    ```

+ #### ImageView 變形
ImageView的圖片最好用src設(shè)置迈喉,用background設(shè)置會(huì)導(dǎo)致圖片變形始終填充控件孩革,并且設(shè)置scaleType無(wú)效。

+ #### EditText 不彈出輸入法
有時(shí)候EditText設(shè)置focus后饱搏,點(diǎn)擊仍然不彈出輸入法,設(shè)置Hint屬性試試坤学。


+ #### StringBuffer問(wèn)題
StringBuffer沒(méi)有覆蓋equals() 和 hashCode()方法压怠,因此,**將StringBuffer存進(jìn)Java集合類中時(shí)會(huì)出現(xiàn)問(wèn)題**蜗顽。



+ #### TextView 代替 Button
如果不是必須用Button,盡量用TextView 代替 Button雨让,在部分機(jī)器上Button 的背景設(shè)置會(huì)出現(xiàn)各種問(wèn)題雇盖。

+ #### ScrollView 中嵌套 ListView 
要重寫ListView;并且在ListView外層包裹LinearLayout(不包裹栖忠,ListView底部顯示不全)

    ```java
    public class ExpandableListViewForScrollView extends ExpandableListView {
        public ExpandableListViewForScrollView(Context context) {
            super(context);
        }
        public ExpandableListViewForScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
        public ExpandableListViewForScrollView(Context context, AttributeSet attrs,
                int defStyle) {
            super(context, attrs, defStyle);
        }
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                    MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, expandSpec);
        }
    }
    ```


    ```xml
    <ScrollView
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:background="#f0eff4"
                >
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:padding="@dimen/dp20"
                    >
                <com.hisense.pos.xwpos.commonui.ExpandableListViewForScrollView
                    android:id="@+id/lb_list_plus"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/shape_corner_white"
                    android:paddingLeft="@dimen/dp10"
                    android:paddingRight="@dimen/dp10"
                    android:paddingTop="@dimen/dp5"
                    android:paddingBottom="@dimen/dp5"
                    />
                </LinearLayout>
            </ScrollView>
    ```

+ #### fastjson key和屬性名不一致
fastjson的key是根據(jù)javabean里面的getter和setter方法來(lái)的崔挖,不是根據(jù)屬性名的贸街,所以會(huì)出現(xiàn)這個(gè)問(wèn)題薛匪,你在屬性的get和set方法上面寫上標(biāo)注,說(shuō)明轉(zhuǎn)成什么就行了比如 @JSONField(name="SOMETHING") 

+ #### okhttp Gzip不自動(dòng)unzip response
Just omit the accept-encoding header from your code. OkHttp will add its own accept-encoding header, and if the server responds with gzip then OkHttp will silently unzip it for you.
```java
OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.addInterceptor(
                new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        Request.Builder builder = chain.request().newBuilder();
                        builder.addHeader(HTTP.CONTENT_TYPE, "application/x-www-form-urlencoded; charset=UTF-8");
                        //builder.addHeader("Accept-Encoding", "gzip");  不要添加,OkHttp會(huì)自動(dòng)壓縮解壓;添加后反而不能自動(dòng)解壓
                        Request request = builder.build();
                        Response response = chain.proceed(request);
                        return response;
                    }
                }
        );
  • 找不到layout 文件

setContentView(R.layout.activity) 找不到R.layout.activity文件,但是R.layout.activity存在滤港,可能與橫豎屏有關(guān)。

  • 微信分享

微信分享沒(méi)有WXMediaMessage.title 和description 不能分享給朋友,只能分享到朋友圈。出現(xiàn)朋友列表,點(diǎn)擊沒(méi)反應(yīng)鲁冯。

  • View的位置參數(shù)

x = left + translationX
y = top + translationY
width = right - left
height = bottom - top

  • MotionEvent

getX/getY 相對(duì)于當(dāng)前View左上角x和y;getRawX/getRawY 相對(duì)于手機(jī)屏幕左上角x和y.

  • TouchSlop滑動(dòng)最小距離

get(getContext()).getScaledTouchSlop();

  • onPause 和 onResume

第一個(gè)activity的onPause執(zhí)行完后验毡,第二個(gè)activity的onResume才能執(zhí)行,因此不要在onPause中執(zhí)行耗時(shí)操作

  • android:process

android:process = ":remote" //當(dāng)前應(yīng)用的私有進(jìn)程菱皆,xxx.xxx.xxx:remote,其他應(yīng)用的組件不可以跟它跑在同一個(gè)進(jìn)程中。
android:process ="xxx.xxx.xxx.remote" //全局進(jìn)程携茂,其他應(yīng)用通過(guò)ShareUID跟他跑在同一個(gè)進(jìn)程中懒棉。(需要相同的簽名)

  • Serializable 和 Parcelable

Serializable 在反序列化的時(shí)候會(huì)檢測(cè)serialVersionUID值策严,不相等報(bào)異常。serialVersionUID = 1L 系統(tǒng)會(huì)默認(rèn)生成一個(gè)hash值倔韭。靜態(tài)成員和 transient關(guān)鍵字標(biāo)記的不參與序列化過(guò)程。

  • ThreadLocal

不同線程訪問(wèn)同一個(gè)ThreadLocal對(duì)象廊散,獲得的值是不一樣的韭畸。

  • include 僅支持android:layout_*屬性

如果設(shè)置了android:layout_*屬性,必須android:layout_height a 和ndroid:layout_width后才能生效蔓搞。

  • 在一項(xiàng)操作中混用基本類型和裝箱類型胰丁,裝箱類型會(huì)拆箱。

  • View滑動(dòng)

  1. View自身的scrollTo/scrollBy (只能將View中的內(nèi)容進(jìn)行移動(dòng)喂分,并不能將View本身移動(dòng))
  2. 通過(guò)動(dòng)畫 (View動(dòng)畫是對(duì)影像操作锦庸,如果結(jié)束后需要保留最終狀態(tài) 需要有:android:fillAfter="true",并且響應(yīng)位置還是原區(qū)域;屬性動(dòng)畫則不需要 注:)
  3. 改變View的LayoutParams
  • overridePendingTransition Activity的過(guò)渡動(dòng)畫蒲祈,必須在startActivity 或 finish后調(diào)用才有效果甘萧。

  • 無(wú)限循環(huán)的屬性動(dòng)畫需要在Activity退出時(shí)及時(shí)停止,否則會(huì)內(nèi)存泄露

  • View動(dòng)畫后setVisibility(View.GONE) 無(wú)效梆掸,需要用 view.clearAnimation()清除狀態(tài)

  • Activity.getWindow.getDecorView() 可以獲得 decor view

  • RxJava

_apiService.login(mobile, verifyCode)
            .// 略  顯示提示框扬卷、切換線程
            .flatMap(result -> {    // 可以運(yùn)行在IO線程
                if (result.getStatus() == RESTResult.FAILURE) {
                    HttpResponseCode code = result.getCode();
                    // 根據(jù)不同code進(jìn)行不同處理
                    ...

                    return Observable.error(new ServerException(result.getMessage()));
                }
                return Observable.just(result.getData());
            })
            .subscribe(new Observer<User>() {
                @Override
                public void onCompleted() {
                    hideLoadingDialog();
                }

                @Override
                public void onError(Throwable e) {
                    e.printStackTrace();
                    hideLoadingDialog();

                    if(e instanceof ServerException){
                        Toast.makeText(_context, e.getMessage(), Toast.LENGTH_SHORT).show();
                    }else{
                        Toast.makeText(_context, "請(qǐng)求失敗,請(qǐng)稍后重試", Toast.LENGTH_SHORT).show();
                    }
               }

                @Override
                public void onNext(User user) {
                    // 直接是User對(duì)象
                }
            });
  • Android Studio .arr 文件

    ①.將aar包復(fù)制到libs目錄下 
    
    ②.配置build.gradle文件:
    
    加入
    
      repositories {
            flatDir {
            dirs 'libs'
        }
    
    compile(name:'camerascan-1.0', ext:'aar')
    
  • SparseArray ArrayMap HashMap

SparseArray 當(dāng)key 是int時(shí)可以避免自動(dòng)裝箱
ArrayMap 以時(shí)間換取空間,兩個(gè)數(shù)組分別存key 和 value酸钦,空間占用比HashMap小怪得,采用二分法查找,效率比hash低,不適用于大量數(shù)據(jù)汇恤。

  • 耗時(shí)計(jì)算

start = System.nanoTime() 
TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start)+"毫秒"
  • Assert 正確使用方式

    if(BuildConfig.DEBUG && !(ctx instanceof FragmentActivity))
          throw new RuntimeException();
    
  • ImageView的scaleType

    Android中ImageView的scaleType有8個(gè)可選項(xiàng)

    1. atrix不對(duì)圖片進(jìn)行縮放,對(duì)原圖從view的左上角繪制圖片(圖片不變形)

    2. itXY將圖片全部繪制到view中拔恰,但是圖片會(huì)變形因谎;(圖片變形,充滿view)

    3. itStart颜懊、fitCenter财岔、fitEnd三個(gè)屬性會(huì)選擇圖片的較長(zhǎng)的邊為基準(zhǔn)對(duì)圖片進(jìn)行縮放處理,正因?yàn)槿绱撕拥瑘D片不會(huì)完全充滿view匠璧,不同之處在于圖片在view中繪制的錨點(diǎn)不同;(圖片不變形咸这,不能充滿view)

    4. enter不對(duì)圖片進(jìn)行縮放處理夷恍,選取view及圖片的中心點(diǎn)進(jìn)行繪制;(圖片不變形)

    5. enterCrop會(huì)保證圖片充滿view媳维,因此會(huì)選取圖片中較短的邊為基準(zhǔn)做縮放處理酿雪;(圖片不變形,充滿view)

    6. enterInside保證圖片顯示在view中間侄刽,當(dāng)圖片大于view時(shí)指黎,會(huì)選取圖片較長(zhǎng)的邊為基準(zhǔn)對(duì)圖片進(jìn)行縮小,當(dāng)圖片寬高小于view時(shí)州丹,直接將圖片顯示到view中間醋安。(圖片不變形)

  • 點(diǎn)擊響應(yīng)錯(cuò)亂

    當(dāng)前l(fā)ayout中使用了自定義控件,如果當(dāng)前l(fā)ayout中的id 與自定義控件布局中的id有重復(fù)墓毒,會(huì)導(dǎo)致點(diǎn)擊響應(yīng)錯(cuò)亂吓揪,并且編譯器沒(méi)有提示。

  • Error inflating class null

view.inflate異常:Binary XML file line #34: Error inflating class null 原因:布局文件中<View/>組件應(yīng)該為大寫V

  • PendingIntent

PendingIntent主要用于給RomoteViews添加點(diǎn)擊事件蚁鳖,具有“粘滯性”磺芭。
PendingIntent相同的判定標(biāo)準(zhǔn)
1. requestCode相同
2. Intent相同
Intent相同的判定
ComponentName和intent-filter都相同(Extras不參與比較)
PendingIntent 相同時(shí)的判定flags:
1. FlAG_ONE_SHOT 只能使用一次,相同PendingIntent send失敗
2. FLAG_NO_CREATE 不會(huì)主動(dòng)創(chuàng)建醉箕,如果不存在钾腺,工廠方法返回nul。較少使用
3. FLAG_CANCEN_CURRENT cancel當(dāng)前已存在相同PendingIntent讥裤,點(diǎn)擊無(wú)響應(yīng)放棒。新建PendingIntent
4. FLAG_UPDATE_CURRENT 存在相同PendingIntent,更新己英。
5. manager.notifu(id,notification) id相同间螟,每次只能彈出一個(gè)通知替換,無(wú)論P(yáng)endingIntent是否相同。
id不同時(shí)厢破,PendingIntent不同:新的通知荣瑟。PendingIntent相同:FlAG_ONE_SHOT:相同的只能點(diǎn)擊一個(gè),其他失效摩泪。FLAG_CANCEN_CURRENT:最新的點(diǎn)擊有效笆焰;FLAG_UPDATE_CURRENT:所有的都更新到最新的。

  • AppContext不能啟動(dòng)standard模式的 Activity

standard模式的Activity啟動(dòng)會(huì)默認(rèn)進(jìn)入啟動(dòng)它的Activity所屬棧见坑,AppContext沒(méi)有任務(wù)棧嚷掠。可以用FLAG_ACTIVITY_NEW_TASK(singleTask)荞驴。singleTask模式如果當(dāng)前沒(méi)有任務(wù)棧(如:AppContext) 不皆,系統(tǒng)會(huì)默認(rèn)創(chuàng)建任務(wù)棧。

  • AndroidMenifest 和 Intent 設(shè)定 模式的區(qū)別

AndroidMenifest 不能設(shè)定FLAG_ACTIVITY_CLEAR_TOP 標(biāo)識(shí)熊楼,Intent不能指定 singleInstance模式

  • 獲取系統(tǒng)的一些資源com.android.internal.R.drawable.ic_text_dot等

int id = Resources.getSystem().getIdentifier("ic_text_dot", "drawable", "android")

  • onStart霹娄、onResume區(qū)別

onStart——Activity是否可見(jiàn) onResume——Activity是否位于前臺(tái)

  • onCreate 和 onSaveInstanceState區(qū)別

onCreate 需要判空。onSaveInstanceState區(qū)別一定有值鲫骗。

  • 添加 configChanges屬性后项棠,當(dāng)發(fā)生相似情況,不會(huì)重建Activity挎峦,會(huì)調(diào)用onConfigurationChanged

  • 一個(gè)Activity可以有多個(gè)intent-filter

android:onClick="onclick",onclick這個(gè)函數(shù)只能在Activity中香追,在Fragment中無(wú)效;需要包含View參數(shù):onclick(View v)

  • Handler 原理

一坦胶、處理msg的順序:
1透典、msg的callback handler.post(callback)
2、mCallback 創(chuàng)建Handler的時(shí)候可以傳 mCallback參數(shù) new Handler(mCallback)
3顿苇、handler自身的handleMessage(msg) 函數(shù) (可以重寫)
二峭咒、ThreadLocal
線程有個(gè)內(nèi)部對(duì)象ThreadLocalMap,其中 有Entry[] table數(shù)組纪岁,用來(lái)存貯線程私有對(duì)象凑队。Android25源碼中并不是Android開發(fā)藝術(shù)探索中所說(shuō)的table數(shù)組奇數(shù)位存key,key的下一位置存value幔翰。而是table數(shù)組中統(tǒng)一存Entry漩氨,entry中存value。

 static class Entry extends WeakReference<ThreadLocal> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal k, Object v) {
                super(k);
                value = v;
            }
        }

三遗增、理解
Handler實(shí)現(xiàn)線程間的通信本質(zhì)是以共享內(nèi)存的方式實(shí)現(xiàn)的叫惊。Handler持有Looper,Looper中有MessageQueue做修。Looper是線程以ThreadLocal的方式持有的霍狰。線程A向線程B發(fā)送Msg抡草,本質(zhì)是通過(guò)Handler將Msg添加到B的Looper的MessageQueue中。循環(huán)取出并處理消息蔗坯。(Msg中通過(guò)target持有Handler的引用康震,處理消息時(shí),調(diào)用Handler的dispatchMessage(Message msg) 根據(jù)(一)中處理msg的順序處理)

  • EditText不彈出輸入法宾濒,常規(guī)方法都嘗試后看一下是否EditText控件的初始大小是0了

  • 在singleTop 和 singleInstance 的Activity中startActivityForResult()啟動(dòng)另一個(gè)Activity會(huì)直接返回Activity.RESULT_CANCELED签杈。由于Framework層做了限制,Android開發(fā)者認(rèn)為不同Task默認(rèn)不能傳遞數(shù)據(jù)鼎兽,一定要傳遞只能通過(guò)Intent。

  • 以FLAG_ACTIVITY_NO_HISTORY模式啟動(dòng)的铣除, 不會(huì)保留在Activity中谚咬。

  • IntentService

onCreate()的時(shí)候開啟一個(gè)HandlerThread,接收到start命令后傳遞命令給HandlerThread 的Handler尚粘,Handler調(diào)用onHandleIntent方法處理任務(wù)后調(diào)用stopSelf結(jié)束Service择卦。

  • WebView上傳文件,選擇文件返回后以postDelayed的方式上傳郎嫁。猜測(cè)秉继,返回到WebView的Activity時(shí)WebView可能需要重新進(jìn)行某些工作,在此之前操作無(wú)響應(yīng)泽铛。

  • gradle強(qiáng)制依賴版本

 android {
    configurations.all {
        resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尚辑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子盔腔,更是在濱河造成了極大的恐慌杠茬,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弛随,死亡現(xiàn)場(chǎng)離奇詭異瓢喉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)舀透,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門栓票,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人愕够,你說(shuō)我怎么就攤上這事走贪。” “怎么了惑芭?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵厉斟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我强衡,道長(zhǎng)擦秽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮感挥,結(jié)果婚禮上缩搅,老公的妹妹穿的比我還像新娘。我一直安慰自己触幼,他們只是感情好硼瓣,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著置谦,像睡著了一般堂鲤。 火紅的嫁衣襯著肌膚如雪逮光。 梳的紋絲不亂的頭發(fā)上坟奥,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天屎暇,我揣著相機(jī)與錄音履植,去河邊找鬼盼樟。 笑死申屹,一個(gè)胖子當(dāng)著我的面吹牛丛晌,可吹牛的內(nèi)容都是我干的镜廉。 我是一名探鬼主播签餐,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼寓涨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了氯檐?” 一聲冷哼從身側(cè)響起戒良,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冠摄,沒(méi)想到半個(gè)月后蔬墩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耗拓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年拇颅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乔询。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡樟插,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竿刁,到底是詐尸還是另有隱情黄锤,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布食拜,位于F島的核電站鸵熟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏负甸。R本人自食惡果不足惜流强,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一痹届、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧打月,春花似錦队腐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至秘通,卻和暖如春为严,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肺稀。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工第股, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盹靴。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瑞妇,于是被迫代替她去往敵國(guó)和親稿静。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容