Tài liệu Bài giảng Lập trình Android: Lập trình AndroidNguyen Ha GiangFIT – Hutechnguyenha.giang@yahoo.com1Tổng quan hệ điều hành AndroidĐặc điểmKiến trúcPhiên bảnLập trình trên môi trường AndroidMôi trường lập trìnhAVDQuá trình phát triển ứng dụng Android.Ứng dụng cơ bản AndroidTìm hiểu Android projectCác cách tiếp cận trong lập trình Android.Nội dungTập phần mềm dành cho thiết bị di động bao gồmMột hệ điều hànhMidlewareCác ứng dụng cơ sở Sử dụng Linux để cung cấp dịch vụ hệ thống lõiSecurityMemory managementProcess managementPower managementHardware driversHệ điều hành mã nguồn mởGoogle Android ?Android architechture code và version name không giống nhau.Mỗi version name (platform level) thì có duy nhất một version code (API level) đi kèm.Android vesioningPlatformCodenameAPI LevelAndroid 1.5Cupcake3Android 1.6Donut4Android 2.0Eclair5Android 2.0.16Android 2.17Android 2.2Froyo8Android 2.3 Android 2.3.2Gingerbread9Android 2.3.3Android 2.3.710Android 3.0, 3.1,3.2Honeycomb11, 12, 13Nguồn: Android developer, Oct 3, 2011Versi...
143 trang |
Chia sẻ: Khủng Long | Lượt xem: 1001 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu tài liệu Bài giảng Lập trình Android, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Lập trình AndroidNguyen Ha GiangFIT – Hutechnguyenha.giang@yahoo.com1Tổng quan hệ điều hành AndroidĐặc điểmKiến trúcPhiên bảnLập trình trên môi trường AndroidMôi trường lập trìnhAVDQuá trình phát triển ứng dụng Android.Ứng dụng cơ bản AndroidTìm hiểu Android projectCác cách tiếp cận trong lập trình Android.Nội dungTập phần mềm dành cho thiết bị di động bao gồmMột hệ điều hànhMidlewareCác ứng dụng cơ sở Sử dụng Linux để cung cấp dịch vụ hệ thống lõiSecurityMemory managementProcess managementPower managementHardware driversHệ điều hành mã nguồn mởGoogle Android ?Android architechture code và version name không giống nhau.Mỗi version name (platform level) thì có duy nhất một version code (API level) đi kèm.Android vesioningPlatformCodenameAPI LevelAndroid 1.5Cupcake3Android 1.6Donut4Android 2.0Eclair5Android 2.0.16Android 2.17Android 2.2Froyo8Android 2.3 Android 2.3.2Gingerbread9Android 2.3.3Android 2.3.710Android 3.0, 3.1,3.2Honeycomb11, 12, 13Nguồn: Android developer, Oct 3, 2011Version distributionẩn bị môi trường trên PCCài đặt JDK ếu dùng Eclipse để phát triển ứng dụng thì download một phiên bản Eclipse SDK Start packageải nén thư mục này vào ổ đĩa, nhớ note lại thư mục để tham chiếu trong bước cài đặt Eclipse. Installling Android SDKCài đặt ADT plugin cho EclipsePlugin này gọi là Android Development Tool, hỗ trợ công cụ để phát triển ứng dụng AndroidMở rộng Eclipse với chức năngTạo mới Android projectTạo ứng dụng UI AndroidTest ứng dụng trên emulator Android SDKDebug ứng dụng dùng Android SDK Tool.Nếu dùng IDE khác thì không cần cài Eclipse + ADT plugin!Installling Android SDKCài đặt ADT plugin cho Eclipse: Install New SoftwareInstallling Android SDKBước InstallInstallling Android SDKAdd Site, có 2 lựa chọnNếu download file zip chứa ADT rồi thì chọn Archive browse đến file zip (vd: ADT-12.0.0.zip)Nếu chưa download và muốn cài trực tiếp thì nhập URL sau vào locationhttps://dl-ssl.google.com/android/eclipse/Cuối cùng chọn OK, để thực hiện install ADTSau khi cài xong ADT thì restart lại Eclipse!Installling Android SDKConfiguring the ADT PluginBước này cài đặt ADT tham chiếu đến Android SDK mà ở bước trước đã download và install vào thư mục trên đĩa.Chọn Window > Preferences trong Eclipse, trong SDK location, browse đến thư mục Android SDKInstallling Android SDKSau bước này hoàn tất việc tạo môi trường để xây dựng Android appEmulator là thành phần quan trọng để test ứng dụng nhưng không thể thay thế hoàn toàn thiết bị thật!Emulator trên Android được gọi là Android Virtual Devices (AVDs)Android SDK và AVD manager cho phép tạo các AVDs hướng tới bất kỳ phiên bản Android API.AVD cho phép cấu hình:ResolutionRAMSD cardSkinHardware khácAndroid Emulator & AVDAndroid Emulator: 1.6 DeviceDevice 1.6Android Emulator: 2.2 DeviceDevice 2.2Android Emulator: 3.0 DeviceDevice 3.0Sử dụng bàn phím của máy tínhSử dụng pointer máy tính như "finger"Sử dụng kết nối internet của máy tínhCác button: Home, Menu, Back, SearchCtrl + F11: landscape portraitAlt + Enter: full screen modeEmulator basicHãy bỏ ra ít thời gian để làm quen với Android Emulator!!!Không hỗ trợ việc gọi và nhận thật sự cuộc gọiGiả lập cuộc gọi và tin nhắn qua emulator consoleKhông hỗ trợ USB connectionCamera/video (input)HeadphoneBattery charge level & AC charging stateBluetooth Emulation limitationsTest your app on an actual device!Mở chức năng Android SDK và AVD manager trong EclipseSetting up an EmulatorSDK/AVD ManagerMở chức năng Android SDK và AVD manager trong EclipseSetting up an EmulatorChọn New virtual device Setting up an EmulatorĐặt tênChọn platformChọn SD card nếu cần Chọn skin HVGAVới project Android đang làm việc, chọn Run (Ctrl +F11), lúc này emulator đã thiết lập sẽ khởi động.Lần đầu tiên thời gian khởi động emulator khá lâu (vài phút ) do phải tạo môi trường virtual Linux system.Running the app in the emulatorPort numberAVD nameĐể thuận tiện cho việc coding, build & run thì emulator khởi động một lần trong suốt quá trình làm việc.Ta cứ việc code, build và run, khi đó emulator tự động cập nhật mã lệnh mới, không cần phải restart lại emulator!Running the app: emulatorRun Emulator 1 lần cho suốt phiên làm việc!Always with the userTypically have Internet accessTypically GPS enabledTypically have accelerometer & compassMany have cameras & microphonesMany apps are free or low-costMobile Devices: AdvantagesMobile Devices: DisadvLimited screen sizeLimited battery lifeLimited processor speedLimited and sometimes slow network accessLimited or awkward input: soft keyboard, phone keypad, touch screen, or stylusLimited web browser functionalityRange of platforms & configurations across devicesĐược xây dựng trên Java và SDK mớiKhông support một số thư viện Java như Swing & AWTOracle đang kiện Google vi phạm bản quyền! Java code được biên dịch vào Dalvik byte code (.dex)Được tối ưu cho thiết bị di động (memory, battery)Dalvik VM chạy những file .dex Android AppsMã Java được biên dịch sang Dalvik byte code!Producing an Android AppDalvik exeByte code.java.classOther .class filesjavacdxclasses.dexAndroidManifest.xmlResources.apkaaptJava codeByte codeTrong Eclipse chọn Alt +Shift + N.First Android ApplicationNew Android ProjectChọn tên project, build target (platform) và package nameFirst Android ApplicationPackage name: ký tự đầu tiên phải chữ thường, phải có dấu chấm (2 định danh)Tên projectplatformScroll down để thấy phần package nameToàn bộ Adroid project được khởi tạo từ EclipseFirst Android ApplicationChọn Package Explorer để xem cấu trúc của ứng dụngCode JavaChứa resourceFile cấu hình appFirst Android Applicationsrc/NguyenhagiangActivity.javaActivity của ứng dụng, hiển thị khi ứng dụng chạyres/layout/main.xmlĐịnh nghĩa layout & widgets cho activityres/values/strings.xmlKhai báo hằng chuỗi dùng trong chương trìnhgen/R.java (Don’t touch!)File được tạo tự động các ID từ các file *.xmlAndroidManifest.xmlKhai báo tất cả thành phần của app (tất cả các activity).Tên thư viện cần thiết được dùng trong ứng dụngXác định những permission mà ứng dụng được cấp.Phiên bản, cấu hìnhImportant FilesActivity là thành phần sẽ hiển thị khi chạy ứng dụng. Do ứng dụng này đơn giản chỉ có 1 activity nên là activity chính của ứng dụng!src/NguyenhagiangActivity.javaKhai báo layouts & widgets cho activityres/layout/main.xmlKhai báo hằng chuỗi dùng trong appHỗ trợ Localizationres/values-es/values/strings.xml (Spanish)res/values-fr/values/strings.xml (French)res/values/string.xmlNội dung chuỗiTên truy cập chuỗiFile được tự động khởi tạo với các định danh từ main.xml, string.xml và các phần khác.gen/R.javaKhông được chỉnh sửa!Khai báo tất cả các thành phần của app với systemPhiên bản: version code, version nameApplication: icon, name, labelTham chiếu đến tên các thư viện mà app có sử dụngQuy định các permission mà ứng dụng được phép.AndroidManifest.xmlThiết lập UI cho một activityCreate UI public class HelloWorldActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); }}main.xml chứa trong thư mục res/layoutTạo một nội dung trực tiếp từ code không dùng XMLCreate UIpublic class HelloWorldActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText("Hello, Android"); setContentView(tv); }}Tạo button đáp ứng sự kiện clickBasic Event handlerpublic class HelloWorldActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Button btn = new Button(this); btn.setText("Click me!"); setContentView(tv); }}Khai báo listener để xử lý sự kiện clickBasic Event handler (2)// thiết lập event click handlerbtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText( getApplicationContext(), "Hello World", Toast.LENGTH_LONG).show(); }}); Three Main Approaches forAndroid programmingJava-basedSử dụng Java để định nghĩa String, layout window, tạo các GUI, gán event handler, giống như lập trình SwingXML-basedSử dụng file XML để định nghĩa String, layout window, tạo các GUI, gán event handler. Phương thức Java chỉ đọc layout từ file XML và truyền vào setContentView.HybridSử dụng file XML định nghĩa String, layout window, và tạo GUI control. Sử dụng Java để gán event handler.Three Main ApproachesJava-based approachpublic class NguyenHaGiangActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String message="Message 1"; LinearLayout window = new LinearLayout(this); TextView txt = new TextView(this); txt.setText(message); Button btn = new Button(this); btn.setText("Button Label"); btn.setOnClickListener(new SomeHandler()); window.addView(txt); window.addView(btn); setContentView(window); }// end onCreate //(next page)Code JavaJava-based approach... //(previous page) private class SomeHandler implements OnClickListener{ @Override public void onClick(View clickedButton) { // doSomething();... Toast.makeText(getApplicationContext(), "Hello World", Toast.LENGTH_LONG).show(); } // end onClick } // end class SomeHandler} // end class NguyenHaGiangActivity Code JavaXML-based approachJavaXMLpublic class SomeClass extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void handlerMethod(View clickedButton) { String someName = getResources().getString(R.string.name); doSomethingWith(someName); } }res/values/strings.xmlres/layout/main.xml JavaXMLLấy control thông qua IDsKhông sử dụng android:onClick để gán handlerHybrid approachpublic class SomeClass extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button b = (Button)findViewById(R.id.button_id); b.setOnClickListener(new SomeHandler()); } private class SomeHandler implements OnClickListener { @Override public void onClick(View clickedButton) { doSomething(...); } } }Java-based LayoutApproachSử dụng Java để định nghĩa chuỗi, layout window, tạo GUI control, gán trình xử lý sự kiện.AvantagesThân thiện với giới Java desktop developer. Giống cách tiếp cận để xây dựng Swing, SWT, và AWT.Thuận tiện cho việc xây dựng layout động, tuỳ biến vào logic lập trình.DisadvantagesPhần code và phần UI xen lẫn với nhau.Chỉ thấy được giao diện khi chạy ứng dụng.Main ideaPhần code trong onCreateCode (Main Method)String appName = "Demo Java-baed Application";String windowText = "Press the button";String buttonLabel = "Show Greeting";LinearLayout mainWindow = new LinearLayout(this); mainWindow.setOrientation(LinearLayout.VERTICAL);setTitle(appName);TextView label = new TextView(this);label.setText(windowText); label.setText(windowText);mainWindow.addView(label);Button greetingButton = new Button(this);greetingButton.setText(buttonLabel);greetingButton.setOnClickListener(new Toaster());mainWindow.addView(greetingButton);setContentView(mainWindow);Lớp thực thi interface onClickListenerCode (Main Method)private class Toaster implements OnClickListener { @Override public void onClick(View clickedButton) { String greetingText = "Hello from Android!"; Toast t = Toast.makeText(getApplicationContext(), greetingText, Toast.LENGTH_LONG); t.show(); }}Results on EmulatorXML-based LayoutApproachSử dụng file XML để định nghĩa chuỗi, layout window, tạo UI control và gán event handlerĐịnh nghĩa layout và control in res/layout/main.xmlĐịnh nghĩa các chuỗi trong res/values/strings.xmlAdvantagesDễ quản lýDùng visual layout editor của eclipseĐây là cách tiếp cận được khuyến khích DisaventagesViệc tạo layout động.Main Ideares/layout/main.xmlĐịnh nghĩa layout và widget với mô tả XML define widget Tham chiếu đến chuỗi (strings.xml) với @string/string_nameGán event handler với android:onClickres/value/strings.xmlĐịnh nghĩa chuỗi dùng trong GUIJava codeTham chiếu đến layout với R.layout.main Tham chiếu đến chuỗi với getString(R.string.string_name)Tham chiếu đến widget với findViewById(R.id.xyz_id)More detailsres/layout/main.xmlProject layoutTham chiếu đến layout được định nghĩa trong res/layout/main.xml với R.layout.mainĐịnh nghĩa giao diện và widget. Đôi khi có phần khai báo event handler.Tham chiếu đến string định nghĩa trong res/values/strings.xml với cú pháp @string/string_nameĐịnh nghĩa chuỗi được dùng trong UICode (res/layout/main.xml)Các thuộc tính orientation, layout_width được định nghĩa trong JavaDoc API cho LinearLayoutChuỗi được định nghĩa trong res/values/strings.xmlPhương thức này là public khai báo trong main class, giá trị trả về là void, có một tham số là ViewCode (res/values/strings.xml)Tên của ứng dụngCác chuỗi được định nghĩa trong strings.xml được tham chiếu trong main.xml và java codemain.xml: @string/string_nameJava code: getString(R.string.string_name)Java codeTham chiếu đến main.xmlTham chiếu đến chuỗi tên greeting_text được định nghĩa trong strings.xmlHybrid LayoutApproachSử dụng XML để định nghĩa string, layout window, và UI widgetSử dụng Java để gán event handlerAdvantagesTương tự như cách tiếp cận XML-basedNgoài ra việc gán event handler từ code có thể dễ hiểu hơn, do event handler cũng là phần java code.DisadvantagesKhó tạo layout động.Main ideaCode (res/layout/main.xml)Định nghĩa id cho button để button có thể được tham chiếu trong Java code với findViewById(R.id.greetind_button)Không gán event handler ở đây, do ta sẽ làm trong java code!Code (res/values/strings.xml)File strings.xml tương tự như phần trước!Code (java)Phải thiết lập setContentView trước khi gọi findViewById, nếu không sẽ nhận được nullViết ứng dụng basic calculator cho phép tính các phép toán cơ bản {cộng,trừ, nhân, chia} theo các cách tiếp cận như sau:Java basedXML basedHybridBài tậpBasic LayoutOrganizing the ScreenLinearLayoutCách thức tổ chức layout nhiều cấpSử dụng màu sắcRelativeLayoutTableLayoutContentsXML-basedKhai báo layout trong res/layouts/some_layout.xmlThiết lập thuộc tính XMLSử dụng visual editor trong EclipseLoad layout với setContentView(R.layout.some_layout)Java-basedTạo thể hiện layout, thiết lập thuộc tính, chèn sub-layoutLinearLayout window = new LinearLayout(this)// thiết lập các thuộc tính cho windowwindow.addView(widgetOrLayout)Load với phương thức setContentView(window)Layout StrategiesMỗi lớp Layout đều có lớp inner là LayoutParams định nghĩa tham số XML cho layout sử dụng.Các tham số này có tên android:layout_xyz, thường dùng để định kích thước và canh lề.VD: XML Layout AttributesSizeandroid:layout_width, android:layout_heightmatch_parent: fill the parent space (minus padding)Phiên bản cũ là fill_parentwrap_content: kích thước bao nội dungandroid:layout_weight:Giá trị số cho biết tỷ lệ phân chia kích thướcAlignmentandroid:layout_gravityCho biết cách thức canh lề của view ở trong containing viewandroid:gravityCho biết cách thức text và thành phần bên trong view được canh lề.Commonly Used AttributesAlignment (tt)Giá trị thường dùngTop, bottom, left, right, center_vertical, center_horizontal, center, fill_vertical, fill_horizontal, fill, clip_vertical, clip_horizontal.Margin (blank space outside)Android:layout_marginBottom, android:layout_marginTop, android:layout_marginLeft, android:layout_marginRightUnitsdp: density-independent pixels (scaled by device resol.)sp: scaled pixel (font size)px: pixels, in: inches, mm: milimeters.Commonly Used AttributesPadding (blank space inside)android:paddingBottom/Top/Left?RightGiá trị là con số theo đơn vị unit bên trênIDandroid:idSử dụng khi java code cần tham chiếu đến viewSử dụng trong RelativeLayout khi cần tham chiếu đến view nào đó để làm mốc.Colorsandroid:background (color, image)android:textColorGiá trị thường dùng"#rrggbb", "#aarrggbb", "@color/color_name"Commonly Used AttributesÝ nghĩaCho phép đặt những thành phần theo 1 dòng hay 1 cộtCó thể lồng ghép để tạo thành những dòng với các cột.Các thuộc tính XML quan trọng.android:orientation"horizontal" (row) or "vertical" (column)Horizontal là mặc địnhandroid:gravityCách các view bên trong được canh lềBasic LinearLayoutGeneral ApproachExample (nested layout)Example (nested layout)Horizontal Linearlayout với gravity là leftHorizontal linearlayout với gravity là center_horizontalExample (nested layout)Horizontal LinearLayoutChứa 2 layout Horizontal LinearLayoutLayout đầu tiên màu vàng có layout_width ="wrap_content" và gravity ="left" Layout thứ hai màu xanh có layout_width="match_parent"và gravity là "right" Example (nested layout)Horizontal LinearLayoutChứa 3 vertical bên trongLinearLayout với orientation là vertical và 4 button bên trongChứa RadioGroup với orientation là vertical và 4 RadioButton bên trong.LinearLayout với orientation là vertical và 4 LinearLayout bên trong. 2 cột đầu có layout_width là wrap_content và cột thứ 3 là match_parent.Example (nested layout)Vertical LinearLayoutLayout này chứa 4 horizontal bên trong.Gravity là center_horizontalGravity là leftGravity là rightChứa 2 horizontal LinearLayout bên trongLayout_width là wrap_content và gravity là leftLayout_width là match_parent và gravity là rightExample (nested layout)Buttonandroid:layout_width="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop= "20dp" ButtonAndroid:layout_width="match_parent"Mặc dù màu có thể định nghĩa cụ thể trong file layout (background="#ff0000"), tuy nhiên có thể định nghĩa tên màu trong file riêng biệt, khi đó tham chiếu thông qua tên màu. Nếu cần thì chỉ thay đổi giá trị của màu, lúc đó sẽ tác động lên toàn bộ nơi tham chiếu đến tên màu.SyntaxConventionSử dụng file res/values/colors.xmlCó thể đặt với bất cứ tên nào miễn hợp lệ!Setting Colors #rrggbb Color File #f00 #ffa500 #ffff00 #0f0 #00f #4b0082 #ee82ee #000 #fffcolors.xmlTham chiếu màu trong file layout.Tham chiếu trong codegetResource().getColor(R.color.red)Layout fileÝ nghĩaGán những con số cho android:layout_weight, kích thước sẽ được phân chia theo tỷ số này.Cách dùng (cho height)Thiết lập android:layout_height = 0dpSử dụng những giá trị tương ứng cho layout_weightVd: nếu có 3 thành phần với layout_weight tương ứng là 1, 1 và 2 thì tỷ lệ tương ứng là 25%, 25% và 50% của 3 thành phần so với chiều cao của cha.Tương tự cho thiết lập width!Có thể xem giá trị weight là 100, sử dụng những giá trị 25, 25, và 50 cũng tương ứng như 1, 1 và 2!Layout WeightLayout FileResultÝ tưởngMỗi view có id xác địnhCho phép xác định vị trí tương đối của view với những view khác thông qua id.Thuộc tính XML quan trọngAlign với containerlayout_alignParentBottom (Top,Right,Left)layout_centerInParent (centerHorizontal, centerVertical)Tất cả giá trị là true hay falseAlign với viewlayout_alignBottom (Top, Right, Left)layout_toLeftOf ( toRightOf, above, below)Tất cả giá trị là id của view nào đóRelativeLayoutButton thứ 1Button thứ 2 Referring to Existing IDs@+id: để gán id mới@id: (không có dấu cộng) tham chiếu đến button đã cóExampleExample Example IdeaCho phép widget và layout khác chứa bên trong grid (không có đường biên)Tương tự như HTML table, số dòng và cột xác định tự động, không cần phải khai báo.Các view được đặt bên trong TableRowXML attributesandroid:stretchColumnsChứa chỉ số cột sẽ được stretch khi table nhỏ hơn parentandroid:shrinkColumnsLiệt kê các cột sẽ co lại khi table lớn hơn parentandroid:collapseColumnsNhững cột sẽ bị thu lại, có thể lập trình để hiện ra sau.TableLayoutDùng để định nghĩa một dòng trong TableLayoutThuộc tính XML quan trọng sử dụng bên trong TableRowandroid:layout_columnCó thể xác định chính xác cột của thành phần, cột bỏ qua đó sẽ rỗng.android:layout_spanSố cột mà thành phần sẽ chiếm giữ, giống colspan trong HTML tableKhông có thuộc tính tương ứng với rowspan trong HTML, dùng nested table để thực hiện.TableRowExampleExampleExampleExampleTạo activity có layout như sau: (chỉ dùng TableLayout)VDButton WidgetsButtonsImageButtons với 1 ảnhImageButtons với 3 ảnh (normal/focused/pressed)RadioButtons – OnClickListenerRadioButtons – OnCheckedChangeListenerCheckBoxesToggleButtonsTopics in this sectionButton layoutHorizontal LinearLayout (3 button)Horizontal LinearLayout (3 Imagebutton)Horizontal LinearLayout (3 Imagebutton)Horizontal RadioGroup (3 RadioButton)Horizontal RadioGroup (3 RadioButton)Horizontal LinearLayout (3 CheckBox)Horizontal RadioGroup (3 ToggleButton)Vertical LinearLayoutLà nút nhấn có nhãn bên trênListener: View.OnClickListenerNếu sử dụng phương pháp XML based thì có thể không cần phải khai báo lớp Listener này.Thuộc tính XML thường dùngandroid:textNhãn của button, có thể truy xuất bằng code java thông qua phương thức setText và getTextandroid:onClickBasic ButtonLà nút nhấn có ảnh hiển thị bên trênListener: View.OnClickListenerThuộc tính XMLandroid:srcảnh hiển thị trên button, tham chiếu đến tên (không có phần mở rộng) của ảnh trong thư mục res/drawableHỗ trợ các kiểu ảnh png, jpeg, gif và bmp.Có thể dùng Java code để thiết lập với setImageDrawableandroid:onClickImageButtonImageButtonLà nút chọn, cho phép chọn một trong số mục chọn cùng nhóm.ListenerView.OnClickListenerGán cho mỗi nút nếu quan tâm đến sự kiện chọn trên từng item.Có thể dùng cách khác là bắt sự kiện trên RadioGroup.Thuộc tính XMLandroid:text, android:onClickRadioButtonTương tự như LinearLayout, cho phép chứa các RadioButton bên trong.Quản lý trạng thái RadioButton là exclusive.Listener: OnCheckedChangeListenerThuộc tính XMLTương tự như LinearLayoutSử dụng android:id để tham chiếu trong chương trình (khi thiết lập OnCheckedChangeListener)Không có thuộc tính andoird:onXYZ để thiết lập RadioGroup listener trong XML.RadioGroupMinh hoạĐáp ứng với mỗi click trên từng radio button bằng cách hiện thông điệp message nào đóCách thực hiệnĐặt các radiobutton vào trong radiogroup Gán event handler, sử dụng onClick cho mỗi RadioButton.Không cần id cho RadioGroup, không cần listener cho RadioGroup.Event handler cho RadioButtonEvent handler cho RadioButtonMinh hoạMỗi khi nút nào được nhấn thì hiển thị message báo tên nút được nhấnCách thực hiệnĐặt RadioButton bên trong RadioGroupTrong XML, tạo id cho RadioGroupTrong Java, xác định RadioGroup và thiết lập ListenerEvent handler cho RadioGroupXử lý trong hàm onCreateEvent handler cho RadioGroupMinh hoạ cách dùngCheckBoxLà dạng tương tự như combo boxListenerAdapterView.OnItemSelectedListenerAdapterView.OnItemClickedListenerThuộc tính XMLandroid:id, android:promptandroid:entryĐịnh nghĩa mục chọn, có thể định nghĩa trong strings.xml hoặc arrays.xmlSpinnerKhai báo SpinnerSpinnerStrings.xml hay arrays.xmlTham chiếu đến SpinnerLớp thực thi ListenerSpinnerLấy item được chọn Cách tiếp cận khác là tạo spinner thông qua code Java.Sinh viên tìm hiểu thêm cách tiếp cận này!SpinnerIntentCó thể dùng Intent để gọi một activity từ một activity đang hiển thị.Cú phápDùng Intent để gọi ActivityIntent activityIntent = new Intent(this, NewActivity.class);startActivity(activityIntent);// khai báo trong AndroidManifest.xml Cách thực hiệnTạo đối tượng Bundle, chứa dữ liệu cần gởi cho activity mới, attach đối tượng Bundle này kèm theo IntentCú phápJava (original Activity)Java (new Activity)Gởi dữ liệu giữa ActivityIntent activityIntent = new Intent(this, NewActivity.class);Bundle newActivityInfo = new Bundle();newActivityInfo.putXYZ(); //putDouble, putStringactivityIntent.putExtras(newActivityInfo);startActivity(activityIntent); Intent intent = getIntent();Bundle info = intent.getExtras();If (info != null) { // getXYZ() } VD: Truyền dữ liệu từ original activity sang new activity.Gởi dữ liệu giữa ActivityHàm xử lý submitGởi dữ liệu giữa Activity public void submit(View v){ Intent newActivity = new Intent(this,NewActivity.class); Bundle info = new Bundle(); String sName, sEmail; EditText ed1 = (EditText)findViewById(R.id.editText1); EditText ed2 = (EditText)findViewById(R.id.editText2); info.putString("Name", ed1.getText().toString()); info.putString("Email", ed2.getText().toString() ); newActivity.putExtras(info); startActivity(newActivity);}Xử lý trong new activityGởi dữ liệu giữa ActivitysetContentView(R.layout.new_activity);// tham chiếu đến intentString sName, sEmail;Intent intent = getIntent();Bundle info = intent.getExtras();if (info != null){sName = info.getString("Name");sEmail = info.getString("Email");TextView tv1 = (TextView)findViewById(R.id.tvHoTen);tv1.setText(sName);TextView tv2 = (TextView)findViewById(R.id.tvEmail);tv2.setText(sEmail);}Tình huống:Activity mới sau khi tương tác với user, thu thập được dữ liệu, kết thúc activity và gởi lại cho activity gọi nó (original activity).Gởi dữ liệu giữa ActivityActivity AActivity BGọi activity B (có thể truyền dữ liệu cho B tuỳ ý)Acvitity B kết thúc và gởi dữ liệu về cho APhần xử lý ở lớp activity A (Original Activity)Phần xử lý trên thường đặt trong hàm xử lý sự kiện của button hay menu.Gởi dữ liệu giữa ActivityIntent newActivity = new Intent(this, ActivityB.class);final int result = 1;// gọi activity B hiển thị và chờ lấy kết quả trả vềstartActivityForResult(newActivity, result);Phần xử lý ở lớp activity A (Original Activity), khi nhận kết quả trả về từ activity B (new Activity).Override phương thức onActivityResult trong ActivityA để nhận kết quả trả về (khi ActivityB đóng).Gởi dữ liệu giữa Activityprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // lấy Bundle chứa dữ liệu Bundle bundle = data.getExtras(); int data1 = bundle.getInt(""); int data2 = bundle.getInt(""); String data3 = bundle.getString(""); }Phần xử lý trong activity B (activity được gọi từ A)Gởi dữ liệu giữa Activity// gởi dữ liệu về activity trướcIntent intent = new Intent();Bundle bundle = new Bundle();// gởi dữ liệu vào bundle bundle.putInt("", data1); bundle.putInt("", data2);Bundle.putString("", data3); intent.putExtras(bundle); // gởi kèm dữ liệusetResult(RESULT_OK, intent); // gởi kết quả vềfinish(); // đóng activityCung cấp URI tham chiếu đến new activityNew Activity sẽ đăng ký trong androidmanifest có mô tả dùng URICú phápJava (original Activity)XML (phần khai báo cho activity được gọi)Gọi Activity thông qua URIUri uri = Uri.parse("call://ex.intent.uri/ActivityC");Intent intent = new Intent(Intent.ACTION_VIEW, uri);startActivity(intent); Ý tưởngNhúng tham số trong URI, tương tự như query string trong Web.Cú phápJava (original Activity)Java (new Activity)Gởi dữ liệu qua tham số URIUri uri = Uri.parse("call://ex.intent.uri/ActivityC?str=hello class");Intent intent = new Intent(Intent.ACTION_VIEW, uri);startActivity(intent);Uri uri = getIntent().getData();String str = uri.getQueryParameter("str");// xử lý với chuỗi, nếu truyền là chuỗi số thì chuyển sang sốExtrasProsCan send data of different typesNo parsing required in Activity that receives the dataConsMore complex for originating activityRequires parsing in originating activity if values come from EditTextURI parametersPros:Simpler for originating Activity, especially if EditText usedMore consistent with URI usageConsCan send Strings onlyRequires parsing in receiving Activity Extras vs. URI parameterÝ tưởngTạo tab window, mỗi tab là một activityCó thể gọi activity thông qua class hay URIGởi dữ liệu thông qua extras Bundle hay URITab Window Activity và các activity phải cùng project.Cú phápJavaMở rộng từ lớp TabActivity, sử dụng TabHost, TabSpecXML: (androidManifest.xml)Tương tự như phần trước.Activity với Tabbed WindowSử dụng TabActivity: outlineTạo ứng dụng demo như sau:Activity với Tabbed WindowActivity với Tabbed Window Resources resource = getResources(); TabHost host = getTabHost(); Intent intent1 = new Intent(this, activity1.class); Drawable tabIcon1 = resource.getDrawable(R.drawable.b1); TabSpec tab1 = host.newTabSpec("Tab One").setIndicator("Activity 1",tabIcon1) .setContent(intent1); host.addTab(tab1); Intent intent2 = new Intent(this, activity2.class); Drawable tabIcon2 = resource.getDrawable(R.drawable.b2); TabSpec tab2 = host.newTabSpec("Tab Two").setIndicator("Activity 2",tabIcon2) .setContent(intent2); host.addTab(tab2); Intent intent3 = new Intent(this, activity3.class); Drawable tabIcon3 = resource.getDrawable(R.drawable.b3); TabSpec tab3 = host.newTabSpec("Tab Three").setIndicator("Activity 3",tabIcon3) .setContent(intent3); host.addTab(tab3);Service là thành phần nền tảng của Android.Đôi khi ứng dụng run process với khoảng thời gian lâu và không có hoặc hiếm khi có sự can thiệp từ người dùng.Tiến trình nền này có thể xử lý ngay cả khi phone được sử dụng cho activity/task khác.Các lớp thực thi service phải mở rộng từ lớp Service trong gói android.app.ServiceCác phương thức override là: onCreate, onDestroy, onStartServiceMinh hoạ:Tạo một service thực thi việc chạy file nhạc nền.Service này được gọi thông qua UI trên Activity.ServiceSử dụng ToggleButton để on/off service Bước 1: Chuẩn bị file nhạc mp3.Tạo thư mục raw trong res (nếu chưa có raw)Import một file nhạc mp3 nào đó vào thư mục res/rawServiceVí dụ import file only_time.mp3 vào thư mục rawBước 2: Tạo layout cho activity chính của ứng dụngService Bước 3: Tạo một lớp mới extend từ ServiceServiceTên lớp service sẽ tạoExtend từ lớp ServiceBước 4: Override các phương thức onCreate, onDestroy, onStart của service.Tạo đối tượng player là MediaPlayerServicepublic class MyService extends Service { private static final String TAG ="HaGService"; private MediaPlayer player; @Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate() {// TODO Auto-generated method stub}@Overridepublic void onDestroy() {// TODO Auto-generated method stub}@Overridepublic void onStart(Intent intent, int startId) {// TODO Auto-generated method stub}}Bước 5: viết các phần xử lý cho onCreateHiển thị một messge báo "Service created"Hiển thị thông tin debug trong LogCatLoad file nhạc vào biến playerThiết lập cờ looping.Service@Overridepublic void onCreate() { // TODO Auto-generated method stub Toast.makeText(this, "Service created", Toast.LENGTH_LONG).show(); Log.d(TAG,"onCreate"); player = MediaPlayer.create(this, R.raw.only_time); player.setLooping(false);}Bước 6: thực thi hàm onStart và onDestroyService@Overridepublic void onStart(Intent intent, int startId) { // TODO Auto-generated method stub Toast.makeText(this, "Service started", Toast.LENGTH_LONG).show(); Log.d(TAG, "onStart"); player.start(); // chạy file nhạc}@Overridepublic void onDestroy() { // TODO Auto-generated method stub Toast.makeText(this, "Service stopped", Toast.LENGTH_LONG).show(); Log.d(TAG,"onDestroy"); player.stop(); // dừng file nhạc}Bước 7: viết phần xử lý cho sự kiện onClick của ToggleButton trong activity chính của ứng dụngServicepublic void doService(View view){ // tham chiếu đến ToggleButton ToggleButton btn = (ToggleButton)view; if (btn.isChecked()==true) { startService( new Intent(this,MyService.class) ); } else { stopService( new Intent(this,MyService.class) ); }}Bước 8: khai báo service trong AndroidManifest.xmlViệc khai báo service trong file AndroidManifest là bắt buộc. Nếu thiếu phần khai báo thì service sẽ không chạy được.Service Tên của serviceThiết lập trạng thái của Service là anableBroadcast ReceiversThành phần có thể respond lại các thông báo của hệ thống. VD:Thông báo màn hình bị tắt, pin yếu, ảnh được chụpThông báo cuộc gọi đến, tin nhắn đếnNgoài ra ứng dụng cũng có thể khởi tạo broadcast để báo cho ứng dụng khác hay hệ thống biết thông tin gì đóỨng dụng báo đã hoàn thành việc download về thiết bị và sẵn sàng cho việc sử dụng.Có thể dùng để start một service chạy nền nào đó. Phần tìm hiểu thêmContent providersQuản lý sự chia sẻ dữ liệu của ứng dụng. Bao gồm các dạngShared preferencesInternal storageLocal cacheExternal storageSQLite database (Chapter 12: Android App Dev for Dummies)Network connection Phần tìm hiểu thêm
Các file đính kèm theo tài liệu này:
- tailieu.pptx