1. Trang chủ >
  2. Luận Văn - Báo Cáo >
  3. Công nghệ thông tin >

Chương 2: Các thành phần cơ bản của một ứng dụng trên Android

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..provider./



Xem Thêm
Tải bản đầy đủ (.docx) (129 trang)

×