學(xué)習(xí)Android小知識點 --- 記錄&總結(jié)

目錄:
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ù)仍保留(詳情看代碼)。

手機內(nèi)公共文件夾

使用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)用安裝位置的。
有三個值,分別是:

  1. auto 跟隨手機設(shè)置自動匹配位置
  2. internalOnly 默認(rèn)值 如果內(nèi)存為空,則程序?qū)⒉荒馨惭b(我們做開發(fā)時候經(jīng)常能遇見安裝失敗,這個就是眾多失敗原因之一)
  3. 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。

7

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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