Android app開發經常使用知識列舉

  1. 在Activity可見時進行頁面刷新,即處於Activity棧頂,固然,這種刷新操做 能夠在onStart,onResume,onRestart,onNewIntent+singleTask中,但最好的位置是onResume,其餘方式可能會形成窗體泄露
    java

  2. Service的兩種啓動方式,startService和bindService,根據啓動方式的不一樣,固然也有一種稱爲複合方式startService+bindService,Service銷燬的方式不一樣,startService能夠作app退出後的後臺服務,但bindService不行,startService+bindService也能夠作後app退出後的後臺服務,但app退出時必須unbind,反過來bindService+startService不能作app退出後的服務android

  3. 建議在Activity增長一個變量activityIsActivity來判斷當前Activity是否處於活動狀態,Activity::onResume和Activity:onPause中改變其值,防止在無界面時發生窗體泄露問題。安全

  4. 在Activity的onWindowFocusChanged的方法中監聽焦點的改變app

  5. 使用InputMethodManager 退出鍵盤最靈活的方式是jvm

    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    boolean isOpen=imm.isActive();//isOpen若返回true,則表示輸入法打開
    if(isOpen)
    {
        imm.hideSoftInputFromWindow(MainActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);  
        //(WidgetSearchActivity是當前的Activity)
    }

    固然,若是頁面只會有一個能夠啓動鍵盤的EditText,可直接將MainActivity.this.getCurrentFocus()替換成該空間ide

  6. dip轉px的公式是 px = dip*scale+0.5f,scale是密度,固然,還能夠使用  (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20, context.getResources().getDisplayMetrics());佈局

  7. 獲取DisplayMetrics的方式有2種,getWindow.getWindowManager.getDisplayMetrics(DisplayMetric dm),還有一種是context.getResources().getDisplayMetrics(),後者使用比較靈活,建議使用後者優化

  8. 自定義權限+引用+使用自定義權限的方式是,自定義<permission android:name="自定義權限" android:protected="根據安全等級設置,若是保密性較高,使用簽名方式" />,而後引用<use-permission android:name="自定義權限" />,使用自定義權限 以下ui

    <receiver android:name=".SmsBroadCastReceiver" android:export="false" android:permission="自定義權限">  
                <intent-filter android:priority="20">  
                    <action android:name="android.provider.Telephony.SMS_RECEIVED"/>  
                </intent-filter>  
            </receiver>
  9. android:export表示該組件是否被跨進程調用,默認是false,android:windowSoftInputMode表示設置 鍵盤彈出UI佈局的改變 以及定義鍵盤彈出狀態,什麼時候彈出等行爲this

  10. android:noHistory表示該組件不會在(最近打開列表中)顯示,android:configChanges表示當發生指定的改變時,Activity程序不會從新啓動,響應的變化也會經過onConfigurationChanged中獲得,android:screenOriention表示Activity應該處於何種屏幕狀態,android:lancheMode是指定建立模式

  11. 強制檢測跨進程調用的權限問題

    public boolean isEnable(){
    
        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK,"you donot have the wake_lock permission");
        Log.d("pid="+Binder.getCallingPid()+",uid="+Binder.getCallingUid());
        return isEnableInternal();
    }


  12. <use-library>生命須要的鏈接共享庫,<use-feature>生命app所須要的硬件環境支持,如支持藍牙等,不然app將安裝失敗。

  13. android:clearTaskOnLaunch和android:finishOnTaskLauch的區別是,前者清楚自身之外的Activity,後者清除轉入後臺的Activity Task。後者比較經常使用。

  14. 系統會爲每個app分配一個虛擬機進程,所以不想jvm全部的應用共享同一個虛擬機進程

  15. 使用LocalBroadcastReceiver或者myView.getHandler進行消息隊列方式的更新,自定義Handler時請以靜態方式繼承Handler,不然可能由於Handler持有的Activity沒法銷燬,由於Handler自己是持有靜態對象,他的生命週期和app相同,所以爲了讓Activity及時銷燬,必須靜態繼承 public static class MyHandler extends Handler

16.android:process="string",如過值爲 :string 則必要時自動建立新進程,若是是 普通string 則會必要時加入全局的進程,所以建議使用前者

   <service 
            android:name="com.example.actiontabbar.RemoteService"
            android:exported="true"
            android:enabled="true"
            android:process=":remote"
            ></service>

效果以下

17.關於可滑動的ViewGroup滑到邊界時出現陰影的消除方法

  android:overScrollMode="never"

18.Fragment中的onCreateView用於加載layout.,而onViewCreate用於初始化被onCreateView加載的layout

19.Manifest中一些屬性的說明,相關補充參考 android Manifest.xml選項

android:excludeFromRecents="true"--->表示不在最近打開的列表中顯示
android:singleUser="true"--->表示單用戶,全部用戶使用的Activity是同一個,和singletop,singletask的區別是,不管如何啓動,他老是一個。
android:multiprocess=["true" | "false"] ---->指定是否容許多個app實例運行在不一樣進程上
android:permission=""   ---->外部其餘程序調用該組件要使用的權限
android:noHistory=["true" | "false"] 是否須要移除這個activity當用戶切換到其餘屏幕時
android:exported=["true" | "false"]是否容許activity被其它程序調用
android:showOnLockScreen="" 是否顯示在鎖屏界面上面(qq有這功能,鎖屏以後也能看見信息)
android:hardwareAccelerated=["true" | "false"] 是否硬件加速,此標誌只是說明app可能須要該權限,但實際上開發中須要手動設置。
android:largeHeap=["true" | "false"] 是否容許最大堆
android:finishOnTaskLaunch=["true" | "false"]是否關閉已打開的activity當用戶從新啓動這個任務的時候

20.getWindow().getAttributes()返回的是Window.LayoutParams,可設置窗體效果

 private void setTranslucentStatus(boolean on) {
        Window win = getWindow();
        WindowManager.LayoutParams winParams = win.getAttributes();
        final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
        if (on) {
            winParams.flags |= bits;
        } else {
            winParams.flags &= ~bits;
        }
        win.setAttributes(winParams);
    }

21.View方法addOnLayoutChangeListener(listener)可用來監聽View是否已經繪製完畢

22.關於內存優化add/remove,register/unregister,bind/unbind等方法必須等次出現,以防止內存泄露

23.BroadcastReceiver不能啓動線程的緣由是其生命週期相對短暫,並且不能執行耗時操做。

24.在Application中監聽ActivityLifecycleCallbacks ,監聽Activity的生命週期

 public interface ActivityLifecycleCallbacks {
        void onActivityCreated(Activity activity, Bundle savedInstanceState);
        void onActivityStarted(Activity activity);
        void onActivityResumed(Activity activity);
        void onActivityPaused(Activity activity);
        void onActivityStopped(Activity activity);
        void onActivitySaveInstanceState(Activity activity, Bundle outState);
        void onActivityDestroyed(Activity activity);
    }

25.使用android.os.Debug.dumpHprofData(path)生成app堆棧信息文件,檢測OOM問題

26.FileObserver文件觀察者,用於觀察目錄和文件的變化

相關文章
相關標籤/搜索