1. 程式人生 > >Android學習知識點整理

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 標籤替代他們會稍微高效些。