Android 常用知識列舉
-
在Activity可見時進行頁面刷新,即處于Activity棧頂,當然,這種刷新操作 可以在onStart,onResume,onRestart,onNewIntent+singleTask中,但最好的位置是onResume,其他方式可能會造成窗體泄露
-
Service的兩種啟動方式,startService和bindService,根據啟動方式的不同,當然也有一種稱為復合方式startService+bindService,Service銷毀的方式不同,startService可以做app退出后的后臺服務,但bindService不行,startService+bindService也可以做后app退出后的后臺服務,但app退出時必須unbind,反過來bindService+startService不能做app退出后的服務
-
建議在Activity增加一個變量activityIsActivity來判斷當前Activity是否處于活動狀態,Activity::onResume和Activity:onPause中改變其值,防止在無界面時發生窗體泄露問題。
-
在Activity的onWindowFocusChanged的方法中監聽焦點的改變
-
使用InputMethodManager 退出鍵盤最靈活的方式是
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()替換成該空間
-
dip轉px的公式是 px = dip*scale+0.5f,scale是密度,當然,還可以使用 (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20, context.getResources().getDisplayMetrics());
-
獲取DisplayMetrics的方式有2種,getWindow.getWindowManager.getDisplayMetrics(DisplayMetric dm),還有一種是context.getResources().getDisplayMetrics(),后者使用比較靈活,建議使用后者
-
自定義權限+引用+使用自定義權限的方式是,自定義<permission android:name="自定義權限" android:protected="根據安全等級設置,如果保密性較高,使用簽名方式" />,然后引用<use-permission android:name="自定義權限" />,使用自定義權限 如下
<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>
-
android:export表示該組件是否被跨進程調用,默認是false,android:windowSoftInputMode表示設置 鍵盤彈出UI布局的改變 以及定義鍵盤彈出狀態,何時彈出等行為
-
android:noHistory表示該組件不會在(最近打開列表中)顯示,android:configChanges表示當發生指定的改變時,Activity程序不會重新啟動,響應的變化也會通過onConfigurationChanged中得到,android:screenOriention表示Activity應該處于何種屏幕狀態,android:lancheMode是指定創建模式
-
強制檢測跨進程調用的權限問題
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(); }
-
<use-library>生命需要的連接共享庫,<use-feature>生命app所需要的硬件環境支持,如支持藍牙等,否則app將安裝失敗。
-
android:clearTaskOnLaunch和android:finishOnTaskLauch的區別是,前者清楚自身以外的Activity,后者清除轉入后臺的Activity Task。后者比較常用。
-
系統會為每一個app分配一個虛擬機進程,因此不想jvm所有的應用共享同一個虛擬機進程
-
使用LocalBroadcastReceiver或者myView.getHandler進行消息隊列方式的更新,自定義Handler時請以靜態方式繼承Handler,否則可能因為Handler持有的Activity無法銷毀,因為Handler本身是持有靜態對象,他的生命周期和app相同,因此為了讓Activity及時銷毀,必須靜態繼承 public static class MyHandler extends Handler
來自:http://my.oschina.net/ososchina/blog/378571