目錄:
1.Splash界面的寫法
2.自定義Dialog去標(biāo)題
3.Activity 聲明周期之 onPause()
4.獲取路徑那些事
5.應(yīng)用安裝位置
6.顯示應(yīng)用選擇器(打開外部Activity)
1.我不知道的Splash界面的寫法
此種寫法有一定局限性
以前寫Splash界面都是直接建立一個SplashActivity,然后setContentView(R.layout.splash);
但是歡迎界面如果只是一個簡單的圖片就沒有必要使用splash.xml布局了。
其實就是基礎(chǔ)沒學(xué)好
那就可以這樣寫:
//在Style里設(shè)置無標(biāo)題欄、設(shè)置背景圖片
<style name="SplashTheme" parent="Theme.AppCompat">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@mipmap/splash_backpng</item>//背景圖片
</style>
//在清單文件中引入style
<activity
android:name=".splash"
android:theme="@style/SplashTheme">//引入
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
至于跳轉(zhuǎn),一般都是用動畫、線程、Handler
2. 自定義Dialog去標(biāo)題
在自定義Dialog時候,會出現(xiàn)一個空白標(biāo)題,要去掉的話就要在創(chuàng)建自定義dialog時候加上一句話:
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
或者設(shè)置下主題樣式
如:
MyDialog dialog = new MyDialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉標(biāo)題
layout = inflater.inflate(R.layout.widget_main, null);
dialog.setContentView(layout);
<style name="dialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item><!--邊框-->
<item name="android:windowIsFloating">true</item><!--是否浮現(xiàn)在activity之上-->
<item name="android:windowIsTranslucent">false</item><!--半透明-->
<item name="android:windowNoTitle">true</item><!--無標(biāo)題-->
<item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->
<item name="android:backgroundDimEnabled">false</item><!--模糊-->
</style>
其實原理是一樣的,都是主題樣式和動態(tài)代碼設(shè)定 來改變效果。
要注意的就是在自定義Dialog的構(gòu)造器中主題樣式一定要調(diào)用上(一個參數(shù)的構(gòu)造器調(diào)用兩個參數(shù)的構(gòu)造器)
3. Activity 聲明周期之 onPause()
在Training中,Google 不建議 在onPause()中執(zhí)行耗時/消耗CUP的操作:
您應(yīng)避免在onPause()期間執(zhí)行CPU 密集型工作,比如向數(shù)據(jù)庫寫入信息,因為這會拖慢向下一 Activity 過渡的過程(您應(yīng)改為在onStop()間執(zhí)行高負(fù)載關(guān)機操作)
建議:
- 停止動畫或其他正在進行的可能消耗 CPU 的操作。記住,從 Android7.0 開始,暫停的應(yīng)用可能會在多窗口模式下運行。
- 提交未保存的更改,但僅當(dāng)用戶離開時希望永久性保存此類更改(比如電子郵件草稿)。
- 釋放系統(tǒng)資源,比如廣播接收器、傳感器手柄(比如 GPS) 或當(dāng)您的 Activity 暫停且用戶不需要它們時仍然可能影響電池壽命的任何其他資源。
也就是說耗時全放到onStop()中,onPause()只能保留臨時數(shù)據(jù)、進行不耗時操作(釋放資源)
經(jīng)過測試,Nexus6 頁面跳轉(zhuǎn)一般是30-50毫秒,如果在onPause中進行了耗時操作,可能會導(dǎo)致ANR。更別說界面跳轉(zhuǎn)了 ~ (╯▽╰) ~
想做耗時操作就到onStop()里進行吧
當(dāng)然了,在onStop()里進行特別耗時的,也會造成ANR,怎么造成呢? 比如:A界面跳轉(zhuǎn)到B界面,點擊跳轉(zhuǎn)按鈕,立刻再返回到A界面。就會ANR,因為A界面onStop()里有特別耗時的操作,這是少數(shù)情況。
4. 獲取路徑那些事
使用 getExternalFilesDir()和getExternalCacheDir() 方法獲取的路徑 ,是屬于本應(yīng)用的文件區(qū)域應(yīng)用卸載后文件會被刪除
使用getExternalStorageDirectory() 方法獲取的路徑,是屬于SD卡里的公共區(qū)域,應(yīng)用刪除后數(shù)據(jù)仍保留。
使用getExternalStoragePublicDirectory() 方法獲取的路徑,是屬于SD卡里的公共區(qū)域,其他應(yīng)用也可以用同樣的方法獲取相應(yīng)的目錄,他可以獲取手機中多個文件夾,如圖。應(yīng)用刪除后數(shù)據(jù)仍保留(詳情看代碼)。
使用getFilesDir()和getCacheDir()方法獲取的路徑,都是在內(nèi)部存儲的路徑。
getFilesDir():返回表示您的應(yīng)用的內(nèi)部目錄的File。
getCacheDir():返回表示您的應(yīng)用臨時緩存文件的內(nèi)部目錄的File。務(wù)必刪除所有不再需要的文件并對在指定時間您使用的內(nèi)存量實現(xiàn)合理大小限制,比如,1MB。如果在系統(tǒng)即將耗盡存儲,它會在不進行警告的情況下刪除您的緩存文件。
注意:設(shè)置->應(yīng)用->應(yīng)用詳情里面的”清除緩存“選項會清除 getExternalCacheDir()。而清除數(shù)據(jù)則會刪除本應(yīng)用的外部儲存中的所有文件,也就是刪除 /storage/emulated/0/Android/data/應(yīng)用包名 中的所有文件,包括‘應(yīng)用包名’這個文件夾!
//傳入null則會返回根目錄
getExternalFilesDir(null)//獲取的是: /storage/emulated/0/Android/data/learn.com.learn/files
getExternalCacheDir()//獲取的是: /storage/emulated/0/Android/data/learn.com.learn/cache
Environment.getExternalStorageDirectory()//獲取的是:/storage/emulated/0
//獲取的是我手機里的圖片文件夾,
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)//路徑是:/storage/emulated/0/Pictures
--------------下面是內(nèi)部存儲----------------
getFilesDir()//獲取的是:/data/user/0/learn.com.learn/files
getCacheDir()//獲取的是:/data/user/0/learn.com.learn/cache
5. 應(yīng)用安裝位置
在<manifest>標(biāo)簽中有一個 installLocation 屬性,它是設(shè)置你應(yīng)用安裝位置的。
有三個值,分別是:
- auto 跟隨手機設(shè)置自動匹配位置
- internalOnly 默認(rèn)值 如果內(nèi)存為空,則程序?qū)⒉荒馨惭b(我們做開發(fā)時候經(jīng)常能遇見安裝失敗,這個就是眾多失敗原因之一)
- preferExternal 優(yōu)先安裝到外部,用戶可移動安裝位置
如果安裝在外部存儲,則會喪失一下功能(直接看最后一條):
①Service
運行的Service將被殺死,當(dāng)重新載入SD卡后將Service無法重新啟動。
但是,注冊ACTION_EXTERNAL_APPLICATIONS_AVAILABLE廣播意圖,這將通知您的應(yīng)用程序,安裝在外部存儲應(yīng)用已經(jīng)成為提供給系統(tǒng)一次。
此時,就可以重新啟動服務(wù)。
②Alarm Service
在AlarmManager中注冊的報警將被取消。重新安裝外部存儲器時,必須手動重新注冊任何報警。
③Input Method Engines
你的IME將由默認(rèn)IME被替換。當(dāng)外部存儲設(shè)備重新安裝時,用戶可以打開系統(tǒng)設(shè)置再次啟用IME。
④Live Wallpapers
運行的動態(tài)壁紙 將會被默認(rèn)動態(tài)壁紙更換。當(dāng)外部存儲設(shè)備重新安裝,用戶可以重新選擇動態(tài)壁紙。
⑤App Widgets
當(dāng)外部存儲設(shè)備重新安裝的時候,您的應(yīng)用程序窗口小部件會從主屏幕中移除。你的App的Widget將不能可供用戶選擇,直到系統(tǒng)重置家庭應(yīng)用(通常直到重新啟動系統(tǒng)完成)。
⑥Account Managers
與創(chuàng)建您的賬戶AccountManager將消失,直到外部存儲設(shè)備重新裝入。
⑦Sync Adapters
你的應(yīng)用和 AbstractThreadedSyncAdapter和所有的同步功能將無法工作,直到外部存儲設(shè)備重新裝入。
⑧Device Administrators
我們的DeviceAdminReceiver將會失效
⑨監(jiān)聽開機結(jié)束事件
系統(tǒng)會在加載外部存儲介質(zhì)之前發(fā)送ACTION_BOOT_COMPLETED廣播.因此安裝在外部存儲介質(zhì)的程序?qū)?strong>永遠(yuǎn)不能接收廣播:ACTION_BOOT_COMPLETED
6.顯示應(yīng)用選擇器(打開外部Activity)和查看外部Intent支持的Activity
①顯示應(yīng)用選擇器(打開外部Activity)
在我們的程序內(nèi)部想要打開一個外部Activity時候,比如 用瀏覽器打開一個網(wǎng)址,調(diào)用打電話界面等,一般會出現(xiàn)一個選擇使用那個程序打開,這個選擇界面也可以手動調(diào)出,代碼如下。
主要方法是createChooser(Intent target, CharSequence title)
Uri webpage = Uri.parse("http://www.baidu.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
Intent chooser = Intent.createChooser(webIntent, "這里是選擇框的描述語,按情況填寫");
if (webIntent.resolveActivity(getPackageManager()) != null) {
startActivity(chooser);
}
②查看外部Intent支持的Activity
如果調(diào)用了 Intent,但設(shè)備上沒有可用于處理 Intent 的應(yīng)用,那么應(yīng)用將崩潰。所以有些情況要加一些判斷。
要確認(rèn)是否存在可響應(yīng) Intent 的可用 Activity,請調(diào)用queryIntentActivities()來獲取能夠處理Intent的 Activity 列表。如果返回的List不為空,可以安全地使用該 Intent。例如:
PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;
如果 isIntentSafe 是 true,則至少有一個應(yīng)用將響應(yīng)該 Intent。 如果它是 false,則沒有任何應(yīng)用處理該 Intent。