Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.17 MB, 129 trang )
Xây dựng ứng dụng 3D với Android
19
______________________________________________________________________
2.1.1 Tạo một Activity:
Để tạo một Activity mới, cần thừa kế từ lớp Activity, sử dụng các View để cung
cấp các tương tác với người dùng, khai báo các thành phần giao diện và thực thi các
chức năng của ứng dụng.
package com.paad.myapplication;
import android.app.Activity;
import android.os.Bundle;
public class MyActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
}
}
Một lớp Activity cơ bản đưa ra một màn hình rỗng chứa cửa sổ hiển thị. Vì vậy
việc cần thực hiện đầu tiên là khai báo bố cục cho nó bằng cách sử dụng các View và
layout. Activity UI được tạo thành bởi các View. View là các điều khiển giao diện
người dùng, hiển thị dữ liệu và cung cấp tương tác đến người dùng.
Để gắn một giao diện cho một Activity, sử dụng phương thức setContentView
trong lớp Activity được kế thừa.
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
MyView myView = new MyView(this);
setContentView(myView);
}
Xây dựng ứng dụng 3D với Android
20
______________________________________________________________________
Có 2 cách để thiết lập giao diện cho Activity: bằng code hoặc thông qua file định
nghĩa layout . Ở trên là cách tạo giao diện bằng code, sau đây là cách tạo giao diện
người thông qua layout, truyền tham số vào cho phương thức setContentView là một
resource ID
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}
Để dùng một Activity cần khai báo bên trong file manifest. Thêm vào một thẻ
activity mới bên trong nút application. Thẻ activity này bao gồm các thuộc tính cho
siêu dữ liệu (label, icon,…). Một Activity mà không được khai báo một thẻ activity
tương ứng sẽ không được khởi chạy.
Ví dụ sau mô tả cách làm thế nào để khai báo Activity đã được tạo ở phần trên:
android:name=”.MyActivity”>
2.1.2
Vòng đời của Activity:
Xây dựng ứng dụng 3D với Android
21
______________________________________________________________________
Hình 6 – Vòng đời của Activity
2.1.3 Khởi động một Activity:
Để khởi động một Activity, chúng ta dùng Intent:
o Khai báo tường minh: cung cấp chính xác thông tin của activity cần gọi
(nếu cùng ứng dụng chỉ cần cung cấp tên class, nếu ứng dụng khác nhau
thì cung cấp tên package, tên class). Ví dụ: đoạn code bên dưới sẽ khởi
động activity tên là TargetActivity.
Intent intent = new Intent(getApplicationContext(),TargetActivity.class);
startActivity(intent);
o Khai báo không tường minh: cung cấp thao tác cần làm gì, với loại dữ
liệu nào, thao tác thuộc nhóm nào… hệ thống sẽ tìm activity tương ứng
để khởi động. Ví dụ: đoạn code bên dưới sẽ khởi động một activity nào
đó đăng có khả năng xem ảnh.
Xây dựng ứng dụng 3D với Android
22
______________________________________________________________________
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivity(intent);
Với cách khởi động activity không tường minh, chúng ta cần phải biết một chút
về Intent-filter. Intent-filter sẽ giúp một activity đăng ký với hệ thống mình có thể làm
được thao tác gì, trong nhóm nào, với loại dữ liệu nào. Như vậy khi intent và intentfilter khớp nhau, activity sẽ được hệ thống khởi động.
Liên lạc giữa 2 activity:
Có thể khởi động một activity với một yêu cầu nào đó và activity kia khi làm
2.1.4
xong công việc sẽ trả lại kết quả cho activity trước. Ví dụ activity A yêu cầu một
activity làm giúp việc chụp ảnh, activity B đáp ứng được việc này, sau khi user chụp
ảnh xong sẽ trả lại file ảnh cho activity A. Để liên lạc 2 activity chúng ta làm nhu sau:
– Khi khởi động một activity, ta có thể gửi kèm dữ liệu trong intent như ví
dụ sau:
intent.putExtra("value1", new String("Hello"));
intent.putExtra(“value2", new Long(100));
– Bên phía activity được khởi động, có thể lấy dữ liệu được gửi như sau:
getIntent().getExtras().getString("value1");
getIntent().getExtras().getLong("value2");
2.2 Trình thu phát (BroadcastReceiver):
BroadcastReceiver là một trong bốn loại thành phần trong ứng dụng Android.
Chức năng của nó là dùng để nhận các sự kiện mà các ứng dụng hoặc hệ thống phát đi.
Có 2 cách phát-nhận đó là:
Không có thứ tự: receiver nào đủ điều kiện thì nhận hết, không phân
biệt và chúng tách rời nhau.
Có thứ tự: receiver nào đăng ký ưu tiên hơn thì nhận trước, và có thể
truyền thêm thông tin xử lý cho các receiver sau.
2.2.1 Chu kỳ sống:
BroadcastReceiver chỉ có duy nhất một phương thức onReceive().
Xây dựng ứng dụng 3D với Android
23
______________________________________________________________________
– Khi có sự kiện mà BroadcastReceiver đã đăng ký nhận được phát đi, thì
phương thức onReceive() của BroadcastReceiver đó sẽ được gọi.
– Sau khi thực thi xong phương thức này, vòng đời của BroadcastReceiver
kết thúc.
Lưu ý khi sử dụng: Ngay khi onReceive() kết thúc, hệ thống coi như receiver đã
không còn hoạt động và có thể giải phóng tiến trình chứa receiver này bất cứ lúc
nào.
àTránh xử lý các code quá lâu trong onReceive().
à Không có xử lý bất đồng bộ, chờ callback… trong Receiver (cụ thể như
hiển thị Dialog, kết nối service…)
2.2.2 Một số broadcast thông dụng:
o Báo hệ thống khởi động xong.
o Báo pin có sự thay đổi.
o Báo có package mới cài vào hoặc xóa đi.
o Báo tắt máy.
o Báo cắm sạc, rút sạc.
o Thông báo tin nhắn tới.
o Thông báo cắm, rút thẻ nhớ.
o Thông báo có cuộc gọi đi.
o Broadcast do người phát triển ứng dụng tự định nghĩa (giúp liên lạc hoặc
thông báo một sự kiện giữa các ứng dụng).
Hàm onReceive():
Phương thức này được gọi khi có sự kiện tương ứng được phát đi. Ở trong
2.2.3
phương thức này, ta truyền vào context (ngữ cảnh) và intent (nơi nhận).
o context: vì lớp Receiver không kế thừa từ lớp Context nên cần truyền
context mà receiver này đang chạy vào. Thứ nhất là để có thể xử lý các
phương thức yêu cầu truyền thêm Context, thứ hai là để sử dụng các
phương thức của lớp Context.
Xây dựng ứng dụng 3D với Android
24
______________________________________________________________________
o intent: intent được truyền vào sẽ có đầy đủ thông tin như sự kiện nào mà
receiver này đăng ký đã xảy ra dẫn đến onReceive() được gọi, có gửi
kèm thông tin gì hoặc dữ liệu gì hay không. Xem các api:
Intent.getAction();
Intent.get…Extra(String dataName);
2.3 Dịch vụ (Service):
Service là một trong 4 loại thành phần của một ứng dụng Android. Service chạy
nền và không tương tác trực tiếp với người dùng. Sử dụng Service để:
Dùng trong các ứng dụng nghe nhạc.
Dùng để xử lý các thao tác mất thời gian và không nhất thiết phải hiển thị
lên activity (download, upload…).
Đôi khi cần một ứng dụng vận hành liên tục để xử lý những việc mong
muốn mà không làm phiền người dùng.
Làm những thao tác tính toán, xử lý đều đặn nào đó và kết quả khi nào
người dùng cần thì mới xem.
2.3.1 Tạo ra một Service:
Để tạo ra một Service, ta tạo ra một class mới kế thừa lớp Service và override
các phương thức onStart(),onCreate() và onBind().
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MyService extends Service {
@Override
public void onStart(Intent intent, int startId) {
// TODO: Actions to perform when service is started.
}
Xây dựng ứng dụng 3D với Android
25
______________________________________________________________________
@Override
public void onCreate() {
// TODO: Actions to perform when service is created.
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Replace with service binding implementation.
return null;
}
}
Để bắt đầu một Service, sử dụng phương thức startService. Nếu Service yêu cầu
quyền truy cập không tồn tại trong ứng dụng thì một ngoại lệ SecurityException sẽ
được đưa ra. Có 2 cách để bắt đầu một Service mới.
+ Cách 1: khởi động ngầm. Ví dụ:
startService(new Intent(MyService.MY_ACTION));
+ Cách 2: khởi động tường minh. Ví dụ:
startService(new Intent(this, MyService.class));
Để dừng một Serivce, sử dùng phương thức stopService, truyền vào Intent xác
định Service cần ngưng hoạt động. Ví dụ:
ComponentName service = startService(new Intent(this, BaseballWatch.class));
// ngừng dịch vụ bằng cách xác định tên dịch vụ
stopService(new Intent(this, service.getClass()));
// ngừng dịch vụ bằng cách tường minh
Xây dựng ứng dụng 3D với Android
26
______________________________________________________________________
try {
Class serviceClass = Class.forName(service.getClassName());
stopService(new Intent(this, serviceClass));
} catch (ClassNotFoundException e) {}
2.3.2
Vòng đời của Services:
Hình 7 – Vòng đời của service
o Khi có một context nào đó gọi startService() để khởi động một dịch vụ
mong muốn. Nếu dịch vụ đó chưa được tạo thì sẽ gọi onCreate() rồi gọi
tiếp onStart() và khi đó dịch vụ chạy nền bên dưới.
o Nếu sau đó lại có một context muốn khởi động dịch vụ này mà dịch vụ
đã đang chạy thì chỉ có phương thức onStart() của dịch vụ được gọi.
o Dù dịch vụ có được gọi khởi động bao nhiêu lần thì cũng chỉ có thể hiện
của dịch vụ và chỉ cần gọi stopService() một lần để kết thúc dịch vụ.
2.3.3 Kết nối dịch vụ:
Khi một Activity được kết nối tới một Service, nó duy trì một tham chiếu đến
một thực thể Service. Để kết nối đến thực thể này, thực thi phương thức onBind như
sau:
private final IBinder binder = new MyBinder();
@Override
public IBinder onBind(Intent intent) {
return binder;
}
-------------
Xây dựng ứng dụng 3D với Android
27
______________________________________________________________________
public class MyBinder extends Binder {
MyService getService() {
return MyService.this;
}
}
Sự kết nối giữa Service và Acitvity được thể hiện qua một ServiceConnection.
Điều cần làm là thực thi một ServiceConnection mới, override phương thức
onServiceConnected và onServiceDisconnected.
// tham chiếu đến dịch vụ
private MyService serviceBinder;
// xử lý kết nồi giữa service và activity
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder
service) {
// được gọi khi liên kết được thực hiện
serviceBinder = ((MyService.MyBinder)service).getService();
}
public void onServiceDisconnected(ComponentName className) {
// nhận khi dịch vụ ngắt kết nối một cách bất ngờ
serviceBinder = null;
}
Để thực hiện việc kết nối, gọi phương thức bindService:
@Override
public void onCreate(Bundle icicle) {
Xây dựng ứng dụng 3D với Android
28
______________________________________________________________________
super.onCreate(icicle);
// kết nối dịch vụ
Intent bindIntent = new Intent(MyActivity.this, MyService.class);
bindService(bindIntent, mConnection, Context.BIND_AUTO_CREATE);
}
Hoạt động của bindService(): kết nối dịch vụ
Hình 8 – Hoạt động kết nối dịch vụ
Thông thường, vòng đời của dịch vụ khi có client kết nối từ đầu như sau:
o Cũng bắt đầu bằng onCreate() rồi đến onBind() và dịch vụ chạy dưới
nền.
o Khi không còn client kết nối tới thì dịch vụ gọi onUnbind() rồi
onDestroy().
Có một số trường hợp không thông thường, ví dụ như:
o Có một context khởi động một dịch vụ, sau đó có một số client kết nối
(bind) tới service.
o Có nhiều client cùng lúc kết nối tới dịch vụ.
o Một activity vừa gọi startService() vừa gọi bindService().
2.4 Trình cung cấp nội dung (Content Providers):
2.4.1 Giới thiệu:
Có thể coi trình cung cấp nội dung như là một máy chủ cơ sở dữ liệu. Công việc
của nó là quản lý truy cập và chia sẻ dữ liệu đang tồn tại, chẳng hạn như một cơ sở dữ
liệu SQLite. Nó có thể được cấu hình để cho phép các ứng dụng khác truy xuất và
Xây dựng ứng dụng 3D với Android
29
______________________________________________________________________
ngược lại. Nếu ứng dụng rất đơn giản thì không nhất thiết phải tạo ra một trình cung
cấp nội dung.
Content Provider giúp tách biệt tầng ứng dụng ra khỏi tầng dữ liệu. Nó có đầy đủ
các quyền điều khiển và được truy xuất thông qua mô hình URI đơn giản như là có thể
thêm, xóa, cập nhật dữ liệu của các ứng dụng.
Tạo một Content Provider mới:
2.4.2.1 Tạo Content Provider:
2.4.2
Để tạo một Content Provider cần thừa kế lại từ lớp trừu tượng ContentProvide,
override lại phương thức onCreate.
import android.content.*;
import android.database.Cursor;
import android.net.Uri;
import android.database.SQLException;
public class MyProvider extends ContentProvider {
@Override
public boolean onCreate() {
// TODO: Construct the underlying database.
return true;
}
}
Nên cung cấp một biến static CONTENT_URI trả về một URI của provider này.
Content URI phải là duy nhất giữa các provider, vì thế nên dựa vào tên package để xác
định URI, hình thức chung cho việc định nghĩa một Content Provider URI là:
content://com.