Activity và intent

Activity và intent

Trong chương này, bạn sẽ tìm hiểu về lớp activity, khối xây dựng chính của giao diện người dùng (UI) của ứng dụng. Bạn cũng học về cách sử dụng Intent để giao tiếp từ activity này sang activity khác.

Các bài viết liên quan:

Về các activity

Một activity đại diện cho một màn hình duy nhất trong ứng dụng của bạn với giao diện mà người dùng có thể tương tác. Ví dụ: một ứng dụng email có thể có một activity hiển thị danh sách các email mới, một activity khác để soạn email và một activity khác để đọc các thư riêng lẻ. Ứng dụng của bạn có thể là tập hợp các activity do bạn tự tạo hoặc bạn sử dụng lại từ các ứng dụng khác.

Mặc dù các activity trong ứng dụng của bạn phối hợp với nhau để tạo thành trải nghiệm người dùng gắn kết, nhưng mỗi activity đều độc lập với các activity khác. Điều này cho phép ứng dụng của bạn bắt đầu một activity trong một ứng dụng khác và nó cho phép các ứng dụng khác bắt đầu activity trong ứng dụng của bạn (nếu ứng dụng của bạn cho phép điều này). Ví dụ: ứng dụng nhắn tin có thể bắt đầu một activity trong ứng dụng máy ảnh để chụp ảnh, sau đó bắt đầu một activity trong ứng dụng email để cho phép người dùng chia sẻ ảnh trong email. Ứng dụng của bạn có thể bắt đầu một activity trong một ứng dụng khác

Activity và intent

Thông thường, một activity trong ứng dụng được chỉ định làm activity “chính”, ví dụ: MainActivity. Người dùng nhìn thấy activity chính khi họ khởi chạy ứng dụng lần đầu tiên. Mỗi activity có thể bắt đầu các activity khác để thực hiện các hành động khác nhau.

Mỗi khi một activity mới bắt đầu, activity trước đó sẽ bị dừng lại, nhưng hệ thống bảo tồn activity đó trong một ngăn xếp (“ngăn xếp trở lại”). Khi người dùng hoàn tất activity hiện tại và nhấn nút Quay lại, activity sẽ xuất hiện từ ngăn xếp và bị hủy, và activity trước đó sẽ tiếp tục.

Khi một activity bị dừng vì một activity mới bắt đầu, activity đầu tiên được thông báo bằng các phương thức gọi lại activity lifecycle. activity lifecycle là tập hợp các trạng thái mà activity có thể ở: khi activity được tạo lần đầu tiên, khi nào nó dừng hoặc tiếp tục và khi hệ thống hủy nó. Bạn tìm hiểu thêm về activity lifecycle trong chương sau.

Tạo một activity

Để triển khai activity trong ứng dụng của bạn, hãy làm như sau:

  1. Tạo một lớp Activity Java.
  2. Triển khai giao diện người dùng cơ bản cho activity trong tệp layout XML.
  3. Khai báo activity mới trong tệp AndroidManifest.xml.

Khi bạn tạo dự án mới cho ứng dụng của mình hoặc thêm activity mới vào ứng dụng của mình bằng cách chọn File > New > Activity, mẫu sẽ tự động thực hiện các bước được liệt kê ở trên.

Tạo activity

Khi bạn tạo một dự án mới trong Android Studio và chọn tùy chọn Tương thích ngược (AppCompat), MainActivity, theo mặc định, là một lớp con của lớp AppCompatActivity. Lớp AppCompatActivity cho phép bạn sử dụng các tính năng cập nhật của ứng dụng Android như thanh ứng dụng và Material Design, trong khi vẫn cho phép ứng dụng của bạn tương thích với các thiết bị chạy phiên bản Android cũ hơn.

Đây là lớp con khung của AppCompatActivity:

public class MainActivity extends AppCompatActivity {

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

   }

}

Nhiệm vụ đầu tiên đối với bạn trong lớp con activity là triển khai các phương thức gọi lại activity lifecycle tiêu chuẩn (chẳng hạn như onCreate ()) để xử lý các thay đổi trạng thái cho activity của bạn. Những thay đổi trạng thái này bao gồm những thứ như khi activity được created, stopped, resumed, or destroyed. Bạn tìm hiểu thêm về activity lifecycle và các lệnh gọi lại vòng đời trong một chương khác.

Một phương thức gọi lại bắt buộc mà ứng dụng của bạn phải triển khai là phương thức onCreate (). Hệ thống gọi phương thức này khi nó tạo activity của bạn và tất cả các thành phần thiết yếu của activity của bạn phải được khởi tạo tại đây. Quan trọng nhất, phương thức onCreate () gọi setContentView () để tạo layout chính cho Activity.

Bạn thường xác định giao diện người dùng cho activity của mình trong một hoặc nhiều tệp layout XML. Khi phương thức setContentView () được gọi với đường dẫn đến tệp layout, hệ thống sẽ tạo tất cả các View ban đầu từ layout được chỉ định và thêm chúng vào activity của bạn. Điều này thường được gọi là thổi phồng layout.

Bạn cũng có thể muốn triển khai phương thức onPause () trong activity của mình. Hệ thống gọi phương thức này là dấu hiệu đầu tiên cho thấy người dùng đang rời khỏi activity của bạn (mặc dù không phải lúc nào nó cũng có nghĩa là activity đang bị hủy). Đây thường là nơi bạn nên thực hiện bất kỳ thay đổi nào sẽ được duy trì sau phiên người dùng hiện tại (vì người dùng có thể không quay lại). Bạn tìm hiểu thêm về onPause () và tất cả các lệnh gọi lại vòng đời khác trong chương sau.

Ngoài các lệnh gọi lại vòng đời, bạn cũng có thể triển khai các phương thức trong activity của mình để xử lý các hành vi khác như nhập liệu của người dùng hoặc nhấp vào nút.

Triển khai giao diện người dùng của activity

Giao diện người dùng cho một activity được cung cấp bởi hệ thống phân cấp các phần tử View, hệ thống này kiểm soát một không gian cụ thể trong cửa sổ activity và có thể phản hồi tương tác của người dùng.

Cách phổ biến nhất để xác định giao diện người dùng bằng cách sử dụng phần tử View là tệp layout XML được lưu trữ như một phần của tài nguyên ứng dụng của bạn. Việc xác định layout của bạn trong XML cho phép bạn duy trì thiết kế giao diện người dùng của mình riêng biệt với mã nguồn xác định hành vi activity.

Bạn cũng có thể tạo các phần tử View mới trực tiếp trong mã activity của mình bằng cách chèn các đối tượng View mới vào một ViewGroup, sau đó chuyển ViewGroup gốc đến setContentView (). Sau khi layout của bạn đã được tăng cường — bất kể nguồn của nó — bạn có thể thêm các phần tử View khác ở bất kỳ đâu trong phân cấp View.

Khai báo activity trong AndroidManifest.xml

Mỗi activity trong ứng dụng của bạn phải được khai báo trong tệp AndroidManifest.xml với phần tử <activity>, bên trong phần <application>. Khi bạn tạo dự án mới hoặc thêm activity mới vào dự án của mình trong Android Studio, tệp AndroidManifest.xml sẽ được tạo hoặc cập nhật để bao gồm các khai báo khung cho từng activity. Đây là khai báo cho MainActivity:

<activity android:name=”.MainActivity” >

   <intent-filter>

      <action android:name=”android.intent.action.MAIN” />

      <category android:name=”android.intent.category.LAUNCHER” />

   </intent-filter>

</activity>

Phần tử <activity> bao gồm một số thuộc tính để xác định các thuộc tính của activity như nhãn, biểu tượng hoặc chủ đề của nó. Thuộc tính bắt buộc duy nhất là android: name, chỉ định tên lớp cho Activity (chẳng hạn như MainActivity). Xem tham chiếu phần tử <activity> để biết thêm thông tin về khai báo activity.

Phần tử <activity> cũng có thể bao gồm các khai báo cho Intent filter. Bộ lọc Intent chỉ định loại Intent mà activity của bạn sẽ chấp nhận.

<intent-filter>

   <action android: name = “android.intent.action.MAIN” />

   <category android: name = “android.intent.category.LAUNCHER” />

</intent-filter>

Bộ lọc Intent phải bao gồm ít nhất một phần tử <action> và cũng có thể bao gồm một <category> và <data> tùy chọn. MainActivity cho ứng dụng của bạn cần bộ lọc Intent xác định hành động “main” và danh mục “launcher” để hệ thống có thể khởi chạy ứng dụng của bạn. Android Studio tạo bộ lọc Intent này cho activity chính trong dự án của bạn.

Phần tử <action> chỉ định rằng đây là điểm vào “main” của ứng dụng. Phần tử <category> chỉ định rằng activity này phải được liệt kê trong trình khởi chạy ứng dụng của hệ thống (để cho phép người dùng khởi chạy activity này).

Mỗi activity trong ứng dụng của bạn cũng có thể khai báo bộ lọc Intent, nhưng chỉ activity chính của bạn mới nên bao gồm hành động “main”. Bạn tìm hiểu thêm về cách sử dụng bộ lọc Intent và Intent ngầm trong phần sau.

Thêm một activity khác vào dự án của bạn

MainActivity cho ứng dụng của bạn và tệp layout liên quan được cung cấp bởi mẫu activity trong Android Studio, chẳng hạn như activity trống hoặc activity cơ bản. Bạn có thể thêm activity mới vào dự án của mình bằng cách chọn File > New > Activity. Chọn mẫu activity bạn muốn sử dụng hoặc mở Thư viện để xem tất cả các mẫu có sẵn. Thư viện activity trong Android Studio

Activity và intent

Khi bạn chọn một mẫu activity, bạn sẽ thấy cùng một bộ màn hình để tạo activity mới mà bạn đã thực hiện khi tạo dự án. Android Studio cung cấp ba thứ cho mỗi activity mới trong ứng dụng của bạn:

  1. Tệp Java cho Activity mới với định nghĩa lớp khung và phương thức onCreate (). Activity mới, giống như MainActivity, là một lớp con của AppCompatActivity.
  2. Tệp XML chứa layout cho activity mới. Lưu ý rằng phương thức setContentView () trong lớp Activity sẽ định nghĩa layout mới này.
  3. Một phần tử <activity> bổ sung trong tệp AndroidManifest.xml chỉ định activity mới. Định nghĩa activity thứ hai không bao gồm bất kỳ bộ lọc Intent nào. Nếu bạn định chỉ sử dụng activity này trong ứng dụng của mình (và không cho phép bất kỳ ứng dụng nào khác bắt đầu activity đó), bạn không cần thêm bộ lọc.

Về Intent

Mỗi activity được bắt đầu hoặc kích hoạt bằng Intent, là một đối tượng thông báo thực hiện yêu cầu thời gian chạy Android để bắt đầu một activity hoặc thành phần ứng dụng khác trong ứng dụng của bạn hoặc trong một số ứng dụng khác.

Khi ứng dụng của bạn lần đầu tiên được khởi động từ màn hình chính của thiết bị, Android sẽ gửi Intent đến ứng dụng của bạn để bắt đầu activity chính của ứng dụng (Intent được xác định bằng hành động Main và category LAUNCHER trong tệp AndroidManifest.xml). Để bắt đầu một activity khác trong ứng dụng của bạn hoặc để yêu cầu một số activity khác có sẵn trên thiết bị thực hiện một hành động, bạn xây dựng Intent của riêng mình và gọi phương thức startActivity () để gửi Intent.

Ngoài việc bắt đầu một activity, một Intent cũng có thể được sử dụng để chuyển dữ liệu giữa một activity này với một activity khác. Khi bạn tạo Intent để bắt đầu một activity mới, bạn có thể bao gồm thông tin về dữ liệu mà bạn muốn activity mới đó activity. Vì vậy, ví dụ: activity email hiển thị danh sách thư có thể gửi Intent đến activity hiển thị thông báo đó. activity hiển thị cần dữ liệu về thông báo để hiển thị và bạn có thể đưa dữ liệu đó vào mục đích.

Trong chương này, bạn tìm hiểu về cách sử dụng Intent với hành động vities, nhưng Intent cũng có thể được sử dụng để bắt đầu dịch vụ hoặc máy thu phát sóng. Bạn học cách sử dụng các thành phần ứng dụng đó trong một thực tế khác.

Các loại Intent

Intent có thể rõ ràng hoặc ẩn ý:

  1. Explicit intent: Bạn chỉ định activity nhận (hoặc thành phần khác) bằng cách sử dụng tên lớp đủ điều kiện của activity. Bạn sử dụng Explicit intent để khởi động các thành phần trong ứng dụng của riêng mình (ví dụ: để di chuyển giữa các màn hình trong giao diện người dùng), vì bạn đã biết gói và tên lớp của thành phần đó.
  2. Implicit intent: Bạn không chỉ định một activity cụ thể hoặc thành phần khác để nhận được Intent. Thay vào đó, bạn khai báo một hành động chung để thực hiện và hệ thống Android khớp yêu cầu của bạn với một activity hoặc thành phần khác có thể xử lý hành động được yêu cầu. Bạn tìm hiểu thêm về cách sử dụng Implicit intent trong một thực tế khác.

Intent objects và fields

Đối với Explicit intent, các trường chính bao gồm:

Activity class (cho Explicit intent). Đây là tên lớp của Activity hoặc thành phần khác sẽ nhận Intent; ví dụ: com.example.SampleActivity.class. Sử dụng phương thức khởi tạo Intent hoặc phương thức setComponent (), setComponentName () hoặc setClassName () để chỉ định lớp.

Intent data. Trường dữ liệu Intent chứa một tham chiếu đến dữ liệu mà bạn muốn activity nhận activity dưới dạng đối tượng Uri.

Intent extras. Đây là các cặp khóa-giá trị mang thông tin mà activity nhận yêu cầu để thực hiện hành động được yêu cầu.

Intent Flag. Đây là các bit bổ sung của siêu dữ liệu, được xác định bởi lớp Intent. Các cờ có thể hướng dẫn hệ thống Android cách khởi chạy activity hoặc cách xử lý nó sau khi khởi chạy.

Đối với Implicit intent, bạn cũng có thể cần xác định hành động và danh mục Intent. Bạn tìm hiểu thêm về các hành động và danh mục Intent trong một chương khác.

Bắt đầu một activity với một Explicit intent

Để bắt đầu một activity cụ thể từ một activity khác, hãy sử dụng Explicit intent và phương thức startActivity (). Explicit intent bao gồm tên lớp đủ điều kiện cho activity hoặc thành phần khác trong đối tượng Intent. Tất cả các trường Intent khác là tùy chọn và rỗng theo mặc định.

Ví dụ: nếu bạn muốn khởi động ShowMessageActivity để hiển thị một thông báo cụ thể trong một ứng dụng email, hãy sử dụng mã như sau:

Intent messageIntent = new Intent (this, ShowMessageActivity.class);

startActivity (messageIntent);

Hàm tạo Intent nhận hai đối số cho Explicit intent:

Một bối cảnh ứng dụng. Trong ví dụ này, lớp Activity cung cấp ngữ cảnh (cái này).

Thành phần cụ thể để bắt đầu (ShowMessageActivity.class).

Sử dụng phương thức startActivity () với đối tượng Intent mới làm đối số duy nhất. Phương thức startActivity () gửi Intent đến hệ thống Android, phương thức này sẽ khởi chạy lớp ShowMessageActivity thay mặt cho ứng dụng của bạn. activity mới xuất hiện trên màn hình và activity ban đầu bị paused.

Activity đã bắt đầu vẫn còn trên màn hình cho đến khi người dùng nhấn vào nút Quay lại trên thiết bị, tại thời điểm đó activity đó sẽ đóng lại và được hệ thống thu hồi và activity ban đầu được tiếp tục. Bạn cũng có thể đóng activity đã bắt đầu theo cách thủ công để phản hồi lại hành động của người dùng (chẳng hạn như nhấp vào Button) bằng phương thức finish ():

public void closeActivity (View) {

   finish();

}

Truyền dữ liệu từ activity này sang activity khác

Ngoài việc chỉ bắt đầu một activity từ activity khác, bạn cũng sử dụng Intent để chuyển thông tin từ activity này sang activity khác. Đối tượng Intent mà bạn sử dụng để bắt đầu một activity có thể bao gồm dữ liệu Intent (URI của một đối tượng để hành động) hoặc các putextras của Intent, là các bit dữ liệu bổ sung mà activity có thể cần.

Trong activity (gửi) đầu tiên, bạn:

  1. Tạo đối tượng Intent.
  2. Đưa dữ liệu hoặc extras vào Intent đó.
  3. Bắt đầu activity mới với startActivity ().

Trong activity (nhận) thứ hai, bạn:

  1. Lấy đối tượng Intent mà activity đã được bắt đầu.
  2. Truy xuất dữ liệu hoặc putextras từ đối tượng Intent.

Khi nào sử dụng Intent data hoặc phần Intent extras

Bạn có thể sử dụng dữ liệu Intent hoặc putextras Intent để chuyển dữ liệu từ activity này sang activity khác. Có một số khác biệt chính giữa dữ liệu và putextras xác định bạn nên sử dụng cái nào.

Dữ liệu Intent chỉ có thể chứa một phần thông tin: một URI đại diện cho vị trí của dữ liệu mà bạn muốn thao tác. URI đó có thể là URL trang web (http: //), số điện thoại (tel: //), vị trí địa lý (geo: //) hoặc bất kỳ URI tùy chỉnh nào khác mà bạn xác định.

Sử dụng trường Intent data:

  • Khi bạn chỉ có một thông tin cần gửi cho activity đã bắt đầu.
  • Khi thông tin đó là một vị trí dữ liệu có thể được đại diện bởi một URI.

Intent extra dành cho bất kỳ dữ liệu tùy ý nào khác mà bạn muốn chuyển cho activity đã bắt đầu. Các phần Intent extra được lưu trữ trong một đối tượng Bundle dưới dạng các cặp khóa và giá trị. Bundle là một map, được tối ưu hóa cho Android, trong đó khóa là một chuỗi và giá trị có thể là bất kỳ kiểu nguyên thủy hoặc đối tượng nào (các đối tượng phải triển khai implement Parcelable). Để đưa dữ liệu vào putextras Intent, bạn có thể n sử dụng bất kỳ phương thức putExtra () nào của lớp Intent hoặc tạo Gói của riêng bạn và đưa nó vào Intent với putExtras ().

Sử dụng các tính năng Intent extras:

  • Nếu bạn muốn chuyển nhiều thông tin cho activity đã bắt đầu.
  • Nếu bất kỳ thông tin nào bạn muốn chuyển qua URI không thể hiện được.

Intent data và các extras không phải là độc quyền; bạn có thể sử dụng dữ liệu cho một URI và các putextras cho bất kỳ thông tin bổ sung nào mà activity đã bắt đầu cần để xử lý dữ liệu trong URI đó.

Thêm Intent data

Để thêm dữ liệu vào Explicit intent từ activity gốc, hãy tạo đối tượng Intent như bạn đã làm trước đây:

Intent messageIntent = new Intent (this, ShowMessageActivity.class);

Sử dụng phương thức setData () với một đối tượng Uri để thêm URI đó vào Intent. Một số ví dụ về việc sử dụng setData () với URI:

// URL trang web

messageIntent.setData (Uri.parse (“http://www.google.com”));

// một URI tệp mẫu

messageIntent.setData (Uri.fromFile (Tệp mới (“/ sdcard / sample.jpg”)));

// Nội dung mẫu: URI cho mô hình dữ liệu ứng dụng của bạn

messageIntent.setData (Uri.parse (“content: //mysample.provider/data”));

// URI tùy chỉnh

messageIntent.setData (Uri.parse (“tùy chỉnh:” + dataID + buttonId));

Hãy nhớ rằng trường dữ liệu chỉ có thể chứa một URI duy nhất; nếu bạn gọi setData () nhiều lần thì chỉ giá trị cuối cùng được sử dụng. Sử dụng extras Intent để bao gồm thông tin bổ sung (bao gồm cả URI.)

Sau khi đã thêm dữ liệu, bạn có thể bắt đầu activity với Mục đích như bình thường:

startActivity (messageIntent);

Thêm Intent extras

Để thêm phần Intent extras vào Explicit intent từ activity ban đầu:

  • Xác định các khóa để sử dụng cho thông tin bạn muốn đưa vào putextras hoặc xác định thông tin của riêng bạn. Mỗi phần thông tin cần một khóa duy nhất của riêng nó.
  • Sử dụng các phương thức putExtra () để thêm các cặp khóa / giá trị của bạn vào putextras Intent. Theo tùy chọn, bạn có thể tạo một đối tượng Gói, thêm dữ liệu của bạn vào Gói, sau đó thêm Gói vào Intent.

Lớp Intent bao gồm các khóa bổ sung mà bạn có thể sử dụng, được định nghĩa là các hằng số bắt đầu bằng từ EXTRA_. Ví dụ: bạn có thể sử dụng Intent.EXTRA_EMAIL để chỉ ra một mảng địa chỉ email (dưới dạng chuỗi) hoặc Intent.EXTRA_REFERRER để chỉ định thông tin về activity gốc đã gửi Intent.

Bạn cũng có thể xác định các khóa phụ Intent của riêng mình. Thông thường, bạn xác định các khóa phụ Intent dưới dạng các biến tĩnh có tên bắt đầu bằng EXTRA_. Để đảm bảo rằng khóa là duy nhất, giá trị chuỗi cho chính khóa phải được bắt đầu bằng tên lớp đủ điều kiện của ứng dụng của bạn. Ví dụ:

Intent messageIntent = new Intent (this, ShowMessageActivity.class);

Sử dụng phương thức putExtra () với một khóa để đưa dữ liệu vào putextras Intent. Lớp Intent định nghĩa nhiều phương thức putExtra () cho các loại dữ liệu khác nhau:

messageIntent.putExtra (EXTRA_MESSAGE, “đây là tin nhắn của tôi”);

messageIntent.putExtra (EXTRA_POSITION_X, 100);

messageIntent.putExtra (EXTRA_POSITION_Y, 500);

Ngoài ra, bạn có thể tạo một Bundle  mới và điền vào Bundle đó với các extras Intent của bạn. Bundle xác định nhiều phương thức “put” cho các loại dữ liệu nguyên thủy khác nhau cũng như các đối tượng triển khai giao diện Parcelable của Android hoặc Serializable của Java.

Bundle extras = new Bundle();

extras.putString(EXTRA_MESSAGE, “this is my message”);

extras.putInt(EXTRA_POSITION_X, 100);

extras.putInt(EXTRA_POSITION_Y, 500);

Sau khi bạn đã điền Gói, hãy thêm nó vào Intent bằng phương thức putExtras () (lưu ý chữ “s” trong Extras):

messageIntent.putExtras(extras);

Bắt đầu activity với Mục đích như bình thường:

startActivity (messageIntent);

Truy xuất dữ liệu từ Intent trong activity đã bắt đầu

Khi bạn bắt đầu một activity với một Intent, thì activity đã bắt đầu có quyền truy cập vào Intent và dữ liệu mà nó chứa.

Để truy xuất Intent mà Activity (hoặc thành phần khác) đã được bắt đầu, hãy sử dụng phương thức getIntent ():

Intent intent = getIntent();

Sử dụng getData () để lấy URI từ Intent đó:

Uri locationUri = intent.getData();

Để khai thác các extras từ Intent, bạn cần biết các khóa cho các cặp khóa / giá trị. Bạn có thể sử dụng các putextras Intent tiêu chuẩn nếu bạn đã sử dụng chúng hoặc bạn có thể sử dụng các khóa mà bạn đã xác định trong activity ban đầu (nếu chúng được xác định là công khai).

Sử dụng một trong các phương thức getExtra () để trích xuất dữ liệu bổ sung ra khỏi đối tượng Intent:

String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE); 

int positionX = intent.getIntExtra(MainActivity.EXTRA_POSITION_X);

int positionY = intent.getIntExtra(MainActivity.EXTRA_POSITION_Y);

Hoặc bạn có thể lấy toàn bộ Gói bổ sung từ Intent và trích xuất các giá trị bằng các phương pháp Gói khác nhau:

Bundle extras = intent.getExtras();

String message = extras.getString(MainActivity.EXTRA_MESSAGE);

Lấy dữ liệu trở lại từ một activity

Khi bạn bắt đầu một activity có Intent, activity ban đầu sẽ bị tạm dừng và activity mới vẫn ở trên màn hình cho đến khi người dùng nhấp vào nút Quay lại hoặc bạn gọi phương thức finish () trong trình xử lý nhấp chuột hoặc hàm khác kết thúc activity của người dùng tham gia vào activity này.

Đôi khi, khi bạn gửi dữ liệu cho một activity có Intent, bạn cũng muốn lấy lại dữ liệu từ Intent đó. Ví dụ: bạn có thể bắt đầu activity thư viện ảnh cho phép người dùng chọn ảnh. Trong trường hợp này, activity ban đầu của bạn cần nhận thông tin về ảnh mà người dùng đã chọn lại từ activity đã khởi chạy.

Để khởi chạy activity mới và nhận lại kết quả, hãy thực hiện các bước sau trong activity ban đầu của bạn:

  • Thay vì khởi chạy Activity với startActivity (), hãy gọi startActivityForResult () với Intent và mã yêu cầu.
  • Tạo Intent mới trong activity đã khởi chạy và thêm dữ liệu trả về vào Intent đó.
  • Triển khai onActivityResult () trong activity gốc để xử lý dữ liệu trả về.

Bạn tìm hiểu về từng bước này trong các phần sau.

Sử dụng startActivityForResult () để khởi chạy activity

Để lấy lại dữ liệu từ một activity đã khởi chạy, hãy bắt đầu activity đó bằng phương thức startActivityForResult () thay vì startActivity ().

startActivityForResult (messageIntent, TEXT_REQUEST);

Phương thức startActivityForResult (), như startActivity (), nhận đối số Intent chứa thông tin về activity sẽ được khởi chạy và bất kỳ dữ liệu nào để gửi đến activity đó. Tuy nhiên, phương thức startActivityForResult () cũng cần một mã yêu cầu.

Mã yêu cầu là một số nguyên xác định yêu cầu và có thể được sử dụng để phân biệt giữa các kết quả khi bạn xử lý dữ liệu trả về. Ví dụ: nếu bạn khởi chạy một activity để chụp ảnh và một activity khác để chọn ảnh từ thư viện, bạn cần các mã yêu cầu khác nhau để xác định dữ liệu trả về thuộc về yêu cầu nào.

Thông thường, bạn xác định mã yêu cầu dưới dạng các biến số nguyên tĩnh có tên bao gồm REQUEST. Sử dụng một số nguyên khác nhau cho mỗi mã. Ví dụ:

public static final int PHOTO_REQUEST = 1;

public static final int PHOTO_PICK_REQUEST = 2;

public static final int TEXT_REQUEST = 3;

Nhận phản hồi từ activity đã khởi chạy

Dữ liệu phản hồi từ activity đã khởi chạy trở lại activity ban đầu được gửi trong Mục đích, trong dữ liệu hoặc putextras. Bạn xây dựng Intent trả lại này và đưa dữ liệu vào đó giống như cách bạn làm đối với Intent gửi. Thông thường, activity đã khởi chạy của bạn sẽ có phương thức gọi lại onClick () hoặc phương thức gọi lại đầu vào của người dùng khác, trong đó bạn xử lý hành động của người dùng và đóng activity. Đây cũng là nơi bạn xây dựng phản hồi.

Để trả về dữ liệu từ Activity đã khởi chạy, hãy tạo một đối tượng Intent trống mới.

Intent returnIntent = new Intent ();

Lưu ý: Để tránh nhầm lẫn dữ liệu đã gửi với dữ liệu trả về, hãy sử dụng đối tượng Intent mới thay vì sử dụng lại đối tượng Intent gửi ban đầu.

Kết quả trả về Intent không cần tên lớp hoặc thành phần để kết thúc ở đúng vị trí. Hệ thống Android hướng phản hồi trở lại activity ban đầu cho bạn.

Thêm dữ liệu hoặc putextras vào Intent giống như cách bạn đã làm với Intent ban đầu. Bạn có thể cần xác định các khóa cho putextras Intent trả về.

public final static String EXTRA_RETURN_MESSAGE = 

                                  “com.example.mysampleapp.RETURN_MESSAGE”;

Sau đó đưa dữ liệu trả về của bạn vào Intent như bình thường. Trong phần sau, tin nhắn trả lại là putextras Intent với khóa.

messageIntent.putExtra(EXTRA_RETURN_MESSAGE, mMessage);

Sử dụng phương thức setResult () với mã phản hồi và Intent với dữ liệu phản hồi:

setResult (RESULT_OK, replyIntent);

Các mã phản hồi được xác định bởi lớp activity và có thể

  • RESULT_OK: Yêu cầu đã thành công.
  • RESULT_CANCELED: Người dùng đã hủy thao tác.
  • RESULT_FIRST_USER: Để xác định mã kết quả của riêng bạn.

Bạn sử dụng mã kết quả trong activity ban đầu.

Cuối cùng, gọi finish () để đóng activity và tiếp tục activity ban đầu:

finish();

Đọc dữ liệu phản hồi trong onActivityResult ()

Bây giờ activity được khởi chạy đã gửi dữ liệu trở lại activity ban đầu có Intent, activity đầu tiên đó phải xử lý dữ liệu đó. Để xử lý dữ liệu trả về trong activity gốc, hãy triển khai phương thức gọi lại onActivityResult (). Đây là một ví dụ đơn giản.

public void onActivityResult(int requestCode, int resultCode,  Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == TEXT_REQUEST) {

        if (resultCode == RESULT_OK) {

            String reply = 

               data.getStringExtra(SecondActivity.EXTRA_RETURN_MESSAGE);

               // process data

        }

    }

}

Ba đối số của onActivityResult () chứa tất cả thông tin bạn cần để xử lý dữ liệu trả về.

Request code: Mã yêu cầu bạn đặt khi khởi chạy activity với startActivityForResult (). Nếu bạn khởi chạy một activity khác để thực hiện các activity khác nhau, hãy sử dụng mã này để xác định dữ liệu cụ thể mà bạn đang lấy lại.

Result code: mã kết quả được đặt trong activity đã khởi chạy, thường là một trong số RESULT_OK hoặc RESULT_CANCELED.

Intent data: Intent chứa dữ liệu được trả về từ activity khởi chạy.

Phương pháp ví dụ hiển thị ở trên cho thấy logic điển hình để xử lý các request  và response codes. Thử nghiệm đầu tiên dành cho yêu cầu TEXT_REQUEST và kết quả là RESULT_OK. Bên trong phần thân của các bài kiểm tra đó, bạn trích xuất thông tin trả về từ Intent. Sử dụng getData () để lấy dữ liệu Intent hoặc getExtra () để truy xuất các giá trị từ putextras Intent bằng một khóa cụ thể.

Điều hướng activity

Mọi ứng dụng có độ phức tạp bất kỳ mà bạn xây dựng sẽ bao gồm nhiều hơn một activity. Khi người dùng di chuyển xung quanh ứng dụng của bạn và từ activity này sang activity khác, điều hướng nhất quán trở nên quan trọng hơn đối với trải nghiệm người dùng của ứng dụng. Rất ít điều khiến người dùng thất vọng hơn là điều hướng cơ bản activity theo những cách không nhất quán và không mong muốn. Thiết kế điều hướng ứng dụng của bạn một cách cẩn thận sẽ giúp cho việc sử dụng ứng dụng của bạn trở nên dễ đoán và đáng tin cậy đối với người dùng.

Hệ thống Android hỗ trợ hai dạng chiến lược điều hướng khác nhau cho ứng dụng của bạn.

Back (temporal) navigation, được cung cấp bởi nút Quay lại của thiết bị và ngăn xếp phía sau.

Up (ancestral) navigation, do bạn cung cấp dưới dạng một tùy chọn trong thanh ứng dụng.

Back navigation, tasks, và the back stack

Back navigation cho phép người dùng của bạn quay lại activity trước đó bằng cách nhấn vào nút quay lại thiết bị Nút quay lại thiết bị. Back navigation còn được gọi là điều hướng tạm thời vì nút quay lại điều hướng lịch sử của các màn hình đã xem gần đây, theo thứ tự thời gian đảo ngược.

Ngăn xếp phía sau là tập hợp từng activity mà người dùng đã truy cập và người dùng có thể quay lại ngăn xếp đó bằng nút quay lại. Mỗi khi một activity mới bắt đầu, nó sẽ được đẩy lên ngăn xếp phía sau và lấy người dùng tập trung. activity trước đó bị dừng nhưng vẫn có sẵn trong ngăn xếp phía sau. Ngăn xếp trở lại activity theo cơ chế “vào cuối cùng, xuất trước”, vì vậy khi người dùng hoàn tất activity hiện tại và nhấn nút Quay lại, activity đó sẽ xuất hiện từ ngăn xếp (và bị hủy) và activity trước đó sẽ tiếp tục.

Activity và intent

Bởi vì một ứng dụng có thể bắt đầu một activity cả bên trong và bên ngoài một ứng dụng, ngăn xếp phía sau chứa từng activity đã được người dùng khởi chạy theo thứ tự ngược lại. Mỗi lần người dùng nhấn nút Quay lại, mỗi activity trong ngăn xếp sẽ bật ra để hiển thị activity trước đó, cho đến khi người dùng quay lại Màn hình chính. Ngăn xếp activity trở lại

Android cung cấp một ngăn xếp phía sau cho mỗi tác vụ. Nhiệm vụ là một khái niệm tổ chức cho từng activity mà người dùng tương tác khi thực hiện một thao tác, cho dù họ đang ở bên trong ứng dụng của bạn hay trên nhiều ứng dụng. Hầu hết các tác vụ bắt đầu từ màn hình chính của Android và việc nhấn vào biểu tượng ứng dụng sẽ bắt đầu một tác vụ (và một ngăn xếp mới) cho ứng dụng đó. Nếu người dùng sử dụng một ứng dụng trong một thời gian, chạm vào trang chủ và bắt đầu một ứng dụng mới, thì ứng dụng mới đó sẽ khởi chạy trong tác vụ của riêng nó và có ngăn xếp riêng của nó. Nếu người dùng quay lại ứng dụng đầu tiên, ngăn xếp trở lại của tác vụ đầu tiên đó sẽ trở lại. Điều hướng bằng nút Quay lại chỉ quay lại activity trong tác vụ hiện tại, không phải cho tất cả các tác vụ đang chạy trên thiết bị. Android cho phép người dùng điều hướng giữa các tác vụ bằng màn hình tổng quan hoặc màn hình tác vụ gần đây, có thể truy cập bằng nút vuông ở góc dưới bên phải của thiết bị Nút tác vụ thiết bị. Màn hình công việc gần đây

Trong hầu hết các trường hợp, bạn không phải lo lắng về việc quản lý các tác vụ hoặc ngăn xếp phía sau cho ứng dụng của mình — hệ thống sẽ theo dõi những điều này cho bạn và nút quay lại luôn có sẵn trên thiết bị.

Activity và intent

Tuy nhiên, có thể có những lúc bạn muốn ghi đè hành vi mặc định cho các tác vụ hoặc cho ngăn xếp phía sau. Ví dụ: nếu màn hình của bạn chứa trình duyệt web được nhúng nơi người dùng có thể điều hướng giữa các trang web, bạn có thể muốn sử dụng hành vi quay lại mặc định của trình duyệt khi người dùng nhấn nút Quay lại của thiết bị, thay vì quay lại activity trước đó. Bạn cũng có thể cần phải thay đổi hành vi mặc định cho ứng dụng của mình trong các trường hợp đặc biệt khác, chẳng hạn như với thông báo hoặc tiện ích, trong đó activity nằm sâu bên trong ứng dụng của bạn có thể được khởi chạy như một nhiệm vụ riêng của nó mà không có ngăn xếp nào cả. Bạn tìm hiểu thêm về cách quản lý các tác vụ và ngăn xếp phía sau trong phần sau.

Up navigation

Up navigation, đôi khi được gọi là điều hướng tổ tiên hoặc điều hướng logic, được sử dụng để điều hướng trong ứng dụng dựa trên mối quan hệ phân cấp rõ ràng giữa các màn hình. Với Up navigation, mỗi activity được sắp xếp theo thứ bậc và mỗi activity “con” hiển thị một mũi tên hướng sang trái trong thanh ứng dụng Nút lên (trong thanh ứng dụng) đưa người dùng trở lại activity “mẹ”. activity trên cùng trong hệ thống phân cấp thường là MainActivity và người dùng không thể đi lên từ đó. Nút lên để Up navigation

Activity và intent

Ví dụ: nếu activity chính trong ứng dụng email là danh sách tất cả thư, việc chọn thư sẽ khởi chạy activity thứ hai để hiển thị lỗi đó gle email. Trong trường hợp này, thông báo activity sẽ cung cấp một nút Lên để quay lại danh sách thông báo.

Hành vi của nút Lên do bạn xác định trong mỗi activity dựa trên cách bạn thiết kế điều hướng ứng dụng của mình. Trong nhiều trường hợp, Up navigation và Quay lại có thể cung cấp cùng một hành vi: chỉ quay lại activity trước đó. Ví dụ: activity cài đặt có thể có sẵn từ bất kỳ activity nào trong ứng dụng của bạn, vì vậy “lên” cũng giống như quay lại — chỉ cần đưa người dùng trở lại vị trí cũ của họ trong hệ thống phân cấp.

Cung cấp hành vi Nâng cấp cho ứng dụng của bạn là tùy chọn, nhưng là một phương pháp thiết kế tốt, để cung cấp điều hướng nhất quán cho ứng dụng của bạn.

Triển khai điều hướng với Up activity

Với các dự án mẫu tiêu chuẩn trong Android Studio, thật dễ dàng để triển khai Up navigation. Nếu một activity là con của activity khác trong phân cấp activity của ứng dụng, hãy chỉ định cấp độ gốc của activity khác đó trong tệp AndroidManifest.xml.

Bắt đầu từ Android 4.1 (API cấp 16), hãy khai báo cấp độ gốc logic của mỗi activity bằng cách chỉ định thuộc tính android: parentActivityName trong phần tử <activity>. Để hỗ trợ các phiên bản Android cũ hơn, hãy bao gồm thông tin <meta-data> để xác định activity mẹ một cách rõ ràng. Sử dụng cả hai phương pháp để tương thích ngược với tất cả các phiên bản Android.

Sau đây là các định nghĩa khung trong AndroidManifest.xml cho cả activity chính (cha) (MainActivity) và activity (con) thứ hai (SecondActivity):

Activity và intent

Bạn tìm hiểu thêm về Up navigation và các tính năng điều hướng người dùng khác trong một thực tế khác.

Quý khách có thể tham khảo hơn ở các dịch vụ do websitehcm.com cung cấp như: dịch vụ seo, dịch vụ viết content , dịch vụ chăm sóc website, dịch vụ thiết kế website 

Leave a Reply