Android學習知識點整理
1、學習網址
http://hukai.me/android-training-course-in-chinese/basics/firstapp/building-ui.html
2、intent中定義變數的習慣方法:
public final static String EXTRA_MESSAGE = "com.mycompany.myfirstapp.MESSAGE";
定義key為一個public型的常量,通常使用應用程式包名作為字首來定義鍵是很好的做法,這樣在應用程式與其他應用程式進行互動時仍可以確保鍵是唯一的。
3、Android適配不同的語言的方式
(1)建立不同的values;其中中文:values_zh_CN,英文預設values,西班牙語,/values-es/strings.xml
(2)讀取語言的方式預設是根據系統配置的語言進行讀取的,
-
Resources resources = getResources(); // 獲得res資源物件
-
Configuration config = resources.getConfiguration(); // 獲得設定物件
-
DisplayMetrics dm = resources.getDisplayMetrics(); // 獲得螢幕引數:主要是解析度,畫素等。
-
config.locale = Locale.ENGLISH</span>; // 設定APP語言設定為英文
-
resources.updateConfiguration(config, dm);
4、Android螢幕適配和寬橫屏的方法
(1)橫豎屏:建立不同的layout資料夾,橫屏:layout-land,預設layout為豎屏
(2)不同解析度:可以根據解析度大小進行分別建立layout:小(small),普通(normal),大(large),超大(xlarge)
(3)圖片使用不同大小:
- xhdpi: 2.0
- hdpi: 1.5
- mdpi: 1.0 (基準)
- ldpi: 0.75
這意味著,如果針對xhdpi的裝置生成了一張200x200的影象,那麼應該為hdpi生成150x150,為mdpi生成100x100, 和為ldpi生成75x75的圖片資源。
5、Fragment的使用
(1)可以直接通過建立類繼承Fragment,然後在activity的xml中直接引用fragment:
<fragment android:name="com.example.android.fragments.HeadlinesFragment"
android:id="@+id/headlines_fragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
(2)上面的這種方式一般用的比較少,可以直接在主Activity中,直接載入想要的Fragment
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// 將 fragment_container View 中的內容替換為此 Fragment,
// 然後將該事務新增到返回堆疊,以便使用者可以向後導航
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// 執行事務
transaction.commit();
(3)Fragment如何和Activity進行通訊呢?
通過在activity中定義介面的方式,在fragment中直接呼叫activity的介面則可以進行值的傳遞。
6、APP可以被分享功能實現
通過在manifest檔案中的<activity>
標籤下新增<intent-filter>
的屬性,使其他的app能夠啟動我們的activity。
<activity android:name="ShareActivity">
<!-- filter for sending text; accepts SENDTO action with sms URI schemes -->
<intent-filter>
<action android:name="android.intent.action.SENDTO"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="sms" />
<data android:scheme="smsto" />
</intent-filter>
<!-- filter for sending text or images; accepts SEND action and text or image data -->
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/*"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
7、圖片拍照後儲存和將圖片顯示在相簿中的方法
String mCurrentPhotoPath;
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = "file:" + image.getAbsolutePath();
return image;
}
(2)將圖片儲存到相簿中的方法
private void galleryAddPic() {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(mCurrentPhotoPath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}
(3)對圖片進行壓縮的方法
private void setPic() {
// Get the dimensions of the View
int targetW = mImageView.getWidth();
int targetH = mImageView.getHeight();
// Get the dimensions of the bitmap
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
// Determine how much to scale down the image
int scaleFactor = Math.min(photoW/targetW, photoH/targetH);
// Decode the image file into a Bitmap sized to fill the View
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
bmOptions.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
mImageView.setImageBitmap(bitmap);
}
8、建立後臺服務IntentService
但是IntentService有下面幾個侷限性:
- 不可以直接和UI做互動。為了把他執行的結果體現在UI上,需要把結果返回給Activity。
- 工作任務佇列是順序執行的,如果一個任務正在IntentService中執行,此時你再發送一個新的任務請求,這個新的任務會一直等待直到前面一個任務執行完畢才開始執行。
- 正在執行的任務無法打斷。
public class RSSPullService extends IntentService {
@Override
protected void onHandleIntent(Intent workIntent) {
// Gets data from the incoming Intent
String dataString = workIntent.getDataString();
...
// Do work here, based on the contents of dataString
...
}
}
<application
android:icon="@drawable/icon"
android:label="@string/app_name">
...
<!--
Because android:exported is set to "false",
the service is only available to this app.
-->
<service
android:name=".RSSPullService"
android:exported="false"/>
...
<application/>
如何回傳IntentService中執行的任務狀態與結果給傳送方。 例如,回傳任務的執行狀態給Activity並進行更新UI。推薦的方式是使用LocalBroadcastManager,這個元件可以限制broadcast intent只在自己的app中進行傳遞。
9、Android頁面佈局的效能優化
1、Android SDK 工具箱中有一個叫做 Hierarchy Viewer 的工具,能夠在程式執行時分析 Layout。你可以用這個工具找到 Layout 的效能瓶頸。
2、使用巢狀的 LinearLayout 可能會使得 View 的層級結構過深,此外,巢狀使用了 layout_weight
引數的 LinearLayout 的計算量會尤其大,因為每個子元素都需要被測量兩次。這對需要多次重複 inflate 的 Layout 尤其需要注意,比如巢狀在 ListView 或 GridView 時。
3、沒用的子節點 — 一個沒有子節點或者背景的 Layout 應該被去掉,來獲得更扁平的層級。
4、沒用的父節點 — 一個節點如果沒有兄弟節點,並且它不是 ScrollView
或根節點,沒有背景,這樣的節點應該直接被子節點取代,來獲得更扁平的層級
5、太深的 Layout — Layout 的巢狀層數太深對效能有很大影響。嘗試使用更扁平的 Layout ,比如 RelativeLayout
或 GridLayout
來提高效能。一般最多不超過10層。
6、合併根 frame — 如果 FrameLayout
是 Layout 的根節點,並且沒有使用 padding 或者背景等,那麼用 merge 標籤替代他們會稍微高效些。