Tạo một widget Android cho ứng dụng của bạn

Tác Giả: Lewis Jackson
Ngày Sáng TạO: 13 Có Thể 2021
CậP NhậT Ngày Tháng: 1 Tháng BảY 2024
Anonim
NGƯỜI CHƠI HỆ ANDROID SÀNH ĐIỆU - TẠO GIAO DIỆN AESTHETIC TRONG VÒNG 1 NỐT NHẠC
Băng Hình: NGƯỜI CHƠI HỆ ANDROID SÀNH ĐIỆU - TẠO GIAO DIỆN AESTHETIC TRONG VÒNG 1 NỐT NHẠC

NộI Dung


Kể từ những ngày đầu của HĐH, các widget cho Android đã cho phép người dùng tương tác với các ứng dụng yêu thích của họ, từ sự thoải mái trên màn hình chính. Vậy làm thế nào để bạn tạo một widget Android?

Đối với nhà phát triển, các widget cung cấp cho ứng dụng của bạn một sự hiện diện có giá trị trên màn hình chính của người dùng. Thay vì bị khuất tầm nhìn trong ngăn kéo ứng dụng, người dùng sẽ được nhắc nhở về ứng dụng của bạn mỗi lần họ liếc nhìn vào màn hình chính của họ - đồng thời nhận được bản xem trước của ứng dụng của bạn, nội dung hữu ích và thú vị nhất.

Các widget cung cấp cho ứng dụng của bạn một sự hiện diện có giá trị trên màn hình chính của người dùng

Trong bài viết này, I hèll sẽ chỉ cho bạn cách cung cấp trải nghiệm người dùng tốt hơn đồng thời khuyến khích người dùng tương tác với ứng dụng của bạn, bằng cách tạo tiện ích Android! Đến cuối bài viết này, bạn sẽ tạo một tiện ích bộ sưu tập có thể cuộn để hiển thị một bộ dữ liệu hoàn chỉnh trên màn hình chính của người dùng.


Để đảm bảo bạn cung cấp loại tiện ích mà người dùng muốn để đặt trên màn hình chính của họ, chúng tôi cũng sẽ tạo ra một Hoạt động cấu hình, cho phép người dùng tùy chỉnh nội dung, giao diện và tính năng của widget. Cuối cùng, tôi sẽ chỉ ra cách bạn có thể khuyến khích mọi người sử dụng tiện ích của mình, bằng cách tạo hình ảnh Xem trước tiện ích hiển thị tốt nhất mà tiện ích của bạn cung cấp.

Cũng đọc: Phát triển cho các thiết bị có thể gập lại: Những gì bạn cần biết

Các widget cho Android là gì?

Một widget ứng dụng là một ứng dụng thu nhỏ, nhẹ, nằm trên màn hình chính của người dùng.

Các widget cho Android có thể cung cấp một loạt nội dung, nhưng thường rơi vào một trong các loại sau:


  • Tiện ích thông tin. Đây là một tiện ích không cuộn được, hiển thị một số thông tin, chẳng hạn như dự báo thời tiết hôm nay hoặc ngày và giờ.
  • Bộ sưu tập vật dụng. Đây là một tiện ích có thể cuộn hiển thị một tập hợp các dữ liệu liên quan, được định dạng dưới dạng ListView, GridView, StackView hoặc AdapterViewFlipper. Các widget bộ sưu tập thường được hỗ trợ bởi một nguồn dữ liệu, chẳng hạn như cơ sở dữ liệu hoặc Mảng.
  • Vật dụng điều khiển. Các tiện ích này hoạt động như một điều khiển từ xa cho phép người dùng tương tác với ứng dụng của bạn, không có phải đưa nó lên tiền cảnh. Các ứng dụng phát phương tiện, chẳng hạn như podcast hoặc âm nhạc, thường có các tiện ích điều khiển cho phép người dùng kích hoạt các hành động Phát, Tạm dừng và Bỏ qua trực tiếp từ màn hình chính của họ.
  • Vật dụng lai. Đôi khi bạn có thể cung cấp trải nghiệm người dùng tốt hơn bằng cách kết hợp các yếu tố từ nhiều danh mục. Ví dụ: nếu bạn đang phát triển tiện ích điều khiển cho ứng dụng nhạc thì bạn có thể cung cấp các điều khiển Phát, Tạm dừng và Bỏ qua, nhưng bạn cũng có thể quyết định hiển thị một số thông tin, chẳng hạn như tiêu đề và ca sĩ của bài hát. Nếu bạn quyết định kết hợp và kết hợp, thì don don được mang đi! Các widget có xu hướng cung cấp trải nghiệm người dùng tốt nhất khi chúng cung cấp quyền truy cập dễ dàng vào một lượng nhỏ thông tin có liên quan, kịp thời hoặc một vài tính năng thường được sử dụng. Để giúp giữ cho các vật dụng lai của bạn gọn nhẹ, nó khuyên bạn nên xác định danh mục chính của bạn, hãy phát triển nó theo danh mục đó và sau đó thêm một vài yếu tố từ thể loại thứ cấp phụ tùng.

Dự án của tôi thực sự cần một widget ứng dụng?

Có một số lý do tại sao bạn nên xem xét thêm một tiện ích ứng dụng vào dự án Android của mình.

Các widget cho Android có thể cải thiện trải nghiệm người dùng

Theo nguyên tắc chung, càng ít bước điều hướng cần thiết để hoàn thành một nhiệm vụ, trải nghiệm người dùng càng tốt.

Bằng cách cung cấp một tiện ích ứng dụng, bạn có thể loại bỏ nhiều bước điều hướng khỏi các luồng được sử dụng phổ biến nhất trong ứng dụng của bạn. Trong trường hợp tốt nhất, người dùng của bạn sẽ có thể nhận được thông tin họ cần chỉ bằng cách liếc vào màn hình chính của họ hoặc thực hiện tác vụ mong muốn chỉ bằng cách nhấn vào nút trong tiện ích điều khiển của bạn.

Mạnh hơn các phím tắt ứng dụng

Các widget ứng dụng thường phản hồi các sự kiện onClick bằng cách khởi chạy cấp cao nhất trong ứng dụng được liên kết, tương tự như một phím tắt ứng dụng. Tuy nhiên, các tiện ích cũng có thể cung cấp quyền truy cập trực tiếp vào các Hoạt động cụ thể trong một ứng dụng, ví dụ: chạm vào một tiện ích, thông báo Nhận mới có thể khởi chạy ứng dụng được liên kết với ứng dụng mới đã mở.

Bằng cách nhúng nhiều liên kết trong bố cục của bạn, bạn có thể cung cấp quyền truy cập một chạm vào tất cả các hoạt động quan trọng nhất của ứng dụng, loại bỏ các bước điều hướng thậm chí nhiều hơn khỏi các luồng được sử dụng phổ biến nhất của bạn.

Bằng cách nhúng nhiều liên kết trong bố cục của bạn, bạn có thể cung cấp quyền truy cập bằng một lần chạm vào tất cả các hoạt động quan trọng nhất của ứng dụng.

Lưu ý rằng các tiện ích chỉ phản hồi với các sự kiện onClick, điều này ngăn người dùng vô tình tương tác với tiện ích của bạn trong khi họ đang vuốt xung quanh màn hình chính. Ngoại lệ duy nhất là khi người dùng đang cố gắng xóa tiện ích của bạn bằng cách kéo nó về phía màn hình chính của họ Xóa hành động, vì trong trường hợp này, tiện ích của bạn sẽ phản hồi bằng cử chỉ vuốt dọc.

Sự tương tác này được quản lý bởi hệ thống Android, vì vậy bạn không cần lo lắng về việc triển khai hỗ trợ vuốt dọc theo cách thủ công trong tiện ích của mình.

Tạo một tiện ích Android để thúc đẩy sự gắn kết lâu dài

Thuyết phục mọi người tải xuống ứng dụng của bạn chỉ là bước đầu tiên để tạo ra một ứng dụng Android thành công. Rất có thể, nếu bạn lấy điện thoại thông minh hoặc máy tính bảng Android của riêng mình và vuốt qua ngăn kéo ứng dụng, thì bạn sẽ khám phá ra nhiều ứng dụng mà bạn đã sử dụng trong vài ngày, vài tuần hoặc thậm chí là vài tháng!

Đọc thêm:Bắt đầu với SDK Facebook cho Android

Khi ứng dụng của bạn được cài đặt thành công trên thiết bị người dùng, bạn sẽ cần phải nỗ lực để giữ cho họ tham gia và thưởng thức ứng dụng của bạn. Cung cấp cho ứng dụng của bạn một sự hiện diện trên màn hình chính có thể là một công cụ mạnh mẽ để giúp thúc đẩy sự gắn kết lâu dài, đơn giản chỉ vì nó nhắc nhở liên tục rằng ứng dụng của bạn tồn tại!

Một tiện ích được thiết kế tốt cũng có thể phục vụ như một quảng cáo liên tục cho ứng dụng của bạn. Mỗi khi người dùng liếc vào màn hình chính của họ, tiện ích của bạn có cơ hội tích cực khuyến khích họ tham gia lại với ứng dụng của bạn, bằng cách hiển thị cho họ tất cả nội dung hữu ích và thú vị nhất của ứng dụng.

Tạo một widget ứng dụng bộ sưu tập

Trong hướng dẫn này, chúng tôi sẽ xây dựng một widget bộ sưu tập hiển thị một mảng dưới dạng ListView có thể cuộn.

Để giúp bạn theo dõi vòng đời của tiện ích ứng dụng, tiện ích này cũng sẽ kích hoạt các loại bánh mì khác nhau khi nó di chuyển qua các trạng thái vòng đời khác nhau. Đến cuối hướng dẫn này, chúng tôi sẽ nâng cao tiện ích của chúng tôi bằng hình ảnh xem trước tùy chỉnh mà sẽ được hiển thị trong Trình chọn widget Android Android và một Hoạt động cấu hình, cho phép người dùng tùy chỉnh tiện ích trước khi đặt nó lên màn hình chính.

Tạo một dự án Android mới với các cài đặt bạn chọn và hãy để bắt đầu!

Xây dựng bố cục widget của bạn

Để bắt đầu, hãy để xác định giao diện người dùng (UI).

Các widget ứng dụng được hiển thị trong một tiến trình ở ngoài ứng dụng của bạn, vì vậy bạn chỉ có thể sử dụng bố cục và Chế độ xem được RemoteViews hỗ trợ.

Khi xây dựng bố cục của bạn, bạn đã hạn chế những điều sau:

  • Tương tự khóa
  • Nút
  • Đồng hồ bấm giờ
  • Khung hình
  • Lưới điện
  • Nút hình ảnh
  • Xem hình ảnh
  • Tuyến tính
  • Thanh tiến trình
  • Giao diện tương đối
  • Xem văn bản
  • ViewStub
  • AdaptorViewFipper
  • Chế độ hiển thị theo ô
  • ListView
  • StackView
  • ViewFlipper

Lưu ý rằng các lớp con của các lớp và Chế độ xem ở trên là không phải được hỗ trợ.

Tạo một tệp tài nguyên bố cục mới có tên list_widget.xml. Vì chúng tôi sẽ hiển thị dữ liệu của mình bằng ListView, bố cục này chủ yếu phục vụ như một thùng chứa cho một thành phần:

Điền vào bộ sưu tập widget

Tiếp theo, chúng ta cần tạo một nhà cung cấp dữ liệu cho ListView của chúng tôi. Tạo một lớp Java mới có tên DataProvider.java và thêm vào như sau:

nhập android.content.Context; nhập android.content.Intent; nhập android.widget.RemoteViews; nhập android.widget.RemoteViewsService; nhập java.util.ArrayList; nhập java.util.List; nhập tĩnh android.R.id.text1; nhập android tĩnh.R.layout.simple_list_item_1; lớp công khai DataProvider triển khai RemoteViewsService.RemoteViewsFactory {Danh sách myListView = new ArrayList <> (); Bối cảnh mContext = null; công khai DataProvider (bối cảnh bối cảnh, ý định ý định) {mContext = bối cảnh; } @Override void công khai onCreate () {initData (); } @Override void công khai trênDataSetChanged () {initData (); } @Override void công khai onDestroy () {} @Override public int getCount () {return myListView.size (); } @Override công khai RemoteViews getViewAt (int location) {RemoteViews view = new RemoteViews (mContext.getPackageName (), simple_list_item_1); view.setTextViewText (text1, myListView.get (vị trí)); xem lại; } @Override công khai RemoteViews getLoadingView () {return null; } @Override công khai int getViewTypeCount () {return 1; } @Override dài công khai getItemId (int vị trí) {vị trí trả về; } @Override boolean công khai hasStableIds () {return true; } void void initData () {myListView.clear (); for (int i = 1; i <= 15; i ++) {myListView.add ("Mục ListView" + i); }}}

AppWidgetProvider: Định cấu hình widget của bạn

Để tạo một widget Android, bạn cần tạo một số tệp.

Tệp dành riêng cho tiện ích đầu tiên của chúng tôi là AppWidgetProvider, là BroadcastReceiver nơi bạn sẽ xác định các phương thức vòng đời của tiện ích khác nhau, chẳng hạn như phương thức mà gọi là khi tiện ích của bạn được tạo lần đầu tiên và phương thức mà cuối cùng được gọi khi tiện ích đó bị xóa.

Tạo một lớp Java mới (Tệp> Mới> Lớp Java) có tên CollectionWidget.

Để bắt đầu, tất cả các tệp của nhà cung cấp tiện ích phải mở rộng từ lớp AppWidgetProvider. Sau đó, chúng ta cần tải tệp tài nguyên bố cục list_widget.xml vào một đối tượng RemoteViews và thông báo cho AppWidgetManager về đối tượng RemoteViews đã cập nhật:

lớp công khai CollectionWidget mở rộng AppWidgetProvider {static void updateAppWidget (Ngữ cảnh ngữ cảnh, AppWidgetManager appWidgetManager, int appWidgetId) {// Khởi tạo đối tượng RemoteViews // RemoteViews view = new RemoteViews (context.getPackage) setRemoteAdOG (bối cảnh, khung nhìn); // Yêu cầu AppWidgetManager cập nhật tiện ích ứng dụng // appWidgetManager.updateAppWidget (appWidgetId, lượt xem); }

Tạo bộ chuyển đổi

Vì chúng tôi hiển thị dữ liệu của chúng tôi trong ListView, chúng tôi cần xác định phương thức setRemoteAd CHƯƠNG () trong AppWidgetProvider của chúng tôi. SetRemoteAd CHƯƠNG () tương đương với việc gọi absListView.setRemoteViewsAd CHƯƠNG () nhưng được thiết kế để được sử dụng trong các tiện ích ứng dụng.

Trong phương thức này, chúng tôi cần xác định id của Adaptor (R.id.widget_list) và mục đích của dịch vụ mà cuối cùng sẽ cung cấp dữ liệu cho RemoteViewsAd CHƯƠNG của chúng tôi - chúng tôi sẽ sớm tạo ra lớp WidgetService này.

private static void setRemoteAd CHƯƠNG (Ngữ cảnh bối cảnh, @NonNull lượt xem RemoteViews cuối cùng) {Views.setRemoteAd Module (R.id.widget_list, Intent mới (bối cảnh, WidgetService. class)); }}

Xác định các phương thức vòng đời của widget

Trong AppWidgetProvider của chúng tôi, chúng tôi cũng cần xác định các phương thức vòng đời của widget sau:

Lấy nội dung mới với onUpdate

Phương thức vòng đời của tiện ích onUpdate () chịu trách nhiệm cập nhật các chế độ xem phụ tùng của bạn với các thông tin mới.

Phương pháp này được gọi mỗi lần:

  • Người dùng thực hiện một hành động kích hoạt thủ công phương thức onUpdate ().
  • Khoảng thời gian cập nhật được chỉ định của ứng dụng đã trôi qua.
  • Người dùng đặt một phiên bản mới của tiện ích này trên màn hình chính của họ.
  • Mục đích phát sóng ACTION_APPWIDGET_RESTORED được gửi đến AppWidgetProvider. Mục đích phát sóng này được kích hoạt nếu widget được khôi phục từ bản sao lưu.

Đây cũng là nơi bạn sẽ đăng ký bất kỳ trình xử lý sự kiện nào mà widget của bạn nên sử dụng.

Khi cập nhật một tiện ích Android, điều quan trọng cần nhớ là người dùng có thể tạo nhiều phiên bản của cùng một tiện ích. Ví dụ: có thể tiện ích con của bạn có thể tùy chỉnh và người dùng quyết định tạo một số phiên bản của Cameron, hiển thị thông tin khác nhau hoặc cung cấp quyền truy cập vào chức năng duy nhất.

Khi bạn gọi onUpdate (), bạn cần chỉ định xem bạn có đang cập nhật mọi phiên bản của tiện ích này hay chỉ một trường hợp cụ thể. Nếu bạn muốn cập nhật mọi phiên bản, thì bạn có thể sử dụng appWidgetIds, đây là một mảng ID xác định mọi phiên bản trên thiết bị.

Trong đoạn mã sau, tôi sẽ cập nhật mọi trường hợp:

@Override void công khai onUpdate (Ngữ cảnh bối cảnh, AppWidgetManager appWidgetManager, int appWidgetIds) {for (int appWidgetId: appWidgetIds) {// Cập nhật tất cả các phiên bản của tiện ích này // updateAppWidget (bối cảnh, appWidget } super.onUpdate (bối cảnh, appWidgetManager, appWidgetIds); }

Lưu ý rằng để giúp giữ mã đơn giản, phương thức onUpdate () này hiện đang thực hiện bất kỳ thay đổi nào đối với tiện ích con.

onEnables: Thực hiện thiết lập ban đầu

Phương thức vòng đời onEnables () được gọi để đáp ứng với ACTION_APPWIDGET_ENABLED, được gửi khi một phiên bản của tiện ích con của bạn được thêm vào màn hình chính cho Đầu tiên thời gian. Nếu người dùng tạo hai phiên bản của tiện ích con của bạn, thì onEnables () sẽ được gọi cho phiên bản đầu tiên, nhưng không phải Cho lần thứ hai.

Phương thức vòng đời onEnables () là nơi bạn nên thực hiện bất kỳ thiết lập nào mà Yêu cầu đối với tất cả các phiên bản của tiện ích con của bạn, chẳng hạn như tạo cơ sở dữ liệu cung cấp thông tin tiện ích con của bạn.

Tôi sẽ hiển thị một cái bánh mì nướng, vì vậy bạn có thể thấy chính xác khi nào phương thức vòng đời này được gọi là:

@Override void công khai onEnables (Ngữ cảnh ngữ cảnh) {Toast.makeText (bối cảnh, "onEnables được gọi", Toast.LENGTH_LONG) .show (); }

Lưu ý rằng nếu người dùng xóa tất cả các phiên bản của tiện ích con của bạn và sau đó tạo một phiên bản mới, thì đây là trường hợp đầu tiên và phương thức vòng đời onEnables () sẽ được gọi lại một lần nữa.

Dọn dẹp, với onDisables

Phương thức onDisables () được gọi để phản hồi với ACTION_APPWIDGET_DISABLED, được kích hoạt khi người dùng xóa Cuối cùng ví dụ của widget của bạn.

Phương thức vòng đời của widget này là nơi bạn nên dọn sạch mọi tài nguyên bạn đã tạo trong phương thức onEnables (), ví dụ như xóa cơ sở dữ liệu bạn đã tạo trong onEnables ().

Để giúp giữ cho mã của chúng tôi đơn giản, tôi chỉ đơn giản là hiển thị một bánh mì nướng mỗi khi phương thức này được kích hoạt:

@Override void công khai onDisables (Ngữ cảnh ngữ cảnh) {Toast.makeText (bối cảnh, "onDisables được gọi", Toast.LENGTH_LONG) .show (); }

AppWidgetProvider đã hoàn thành

Tệp CollectionWidget của bạn bây giờ trông giống như thế này:

nhập android.appwidget.AppWidgetManager; nhập android.appwidget.AppWidgetProvider; nhập android.content.Context; nhập androidx.annotation.NonNull; nhập android.content.Intent; nhập android.widget.RemoteViews; nhập android.widget.Toast; // Mở rộng từ lớp AppWidgetProvider // lớp công khai CollectionWidget mở rộng AppWidgetProvider {static void updateAppWidget (Ngữ cảnh bối cảnh, AppWidgetManager appWidgetManager, int appWidgetId) {// Tải tập tin tài nguyên bố cục vào RemoteView getPackageName (), R.layout.list_widget); setRemoteAdOG (bối cảnh, khung nhìn); // Thông báo cho AppWidgetManager về đối tượng RemoteViews // appWidgetManager.updateAppWidget (appWidgetId, lượt xem); } @Override void công khai onUpdate (Ngữ cảnh, AppWidgetManager appWidgetManager, int appWidgetIds) {for (int appWidgetId: appWidgetIds) {updateAppWidget (bối cảnh, appWidgetManager, appWidgetManager) } super.onUpdate (bối cảnh, appWidgetManager, appWidgetIds); } @Override void công khai onEnables (Ngữ cảnh ngữ cảnh) {Toast.makeText (bối cảnh, "onEnables được gọi là", Toast.LENGTH_LONG) .show (); } @Override void công khai onDisables (Ngữ cảnh ngữ cảnh) {Toast.makeText (bối cảnh, "onDisables được gọi là", Toast.LENGTH_LONG) .show (); } private void void setRemoteAd CHƯƠNG (Ngữ cảnh bối cảnh, @NonNull lượt xem RemoteViews cuối cùng) {Views.setRemoteAd Module (R.id.widget_list, Intent mới (bối cảnh, WidgetService. class)); }}

Tệp AppWidgetProviderInfo

Tiện ích ứng dụng của bạn cũng yêu cầu tệp AppWidgetProviderInfo, xác định một số thuộc tính quan trọng, bao gồm cả kích thước tối thiểu của widget và mức độ thường xuyên được cập nhật.

Tệp AppWidgetProviderInfo được lưu trữ trong thư mục res / xml dự án của bạn.

Nếu dự án của bạn không có sẵn thư mục này, thì bạn sẽ cần phải tạo nó:

  • Nhấn chuột vào thư mục res res dự án của bạn.
  • Chọn Mới> Thư mục tài nguyên Android.
  • Trong cửa sổ tiếp theo, mở trình đơn thả xuống Loại tài nguyên và chọn xml.
  • Tên thư mục sẽ tự động cập nhật lên xml, nhưng nếu không có tên thì bạn sẽ phải thay đổi bằng tay.
  • Nhấn OK.

Tiếp theo, tạo một tập hợp sưu tập_widget_info mà chúng tôi sẽ sử dụng làm AppWidgetProviderInfo:

  • Control-click vào thư mục xml dự án của bạn.
  • Chọn Mới> tệp tài nguyên XML.
  • Đặt tên cho tập tin này là coll_widget_info.
  • Nhấn OK.

Trong tệp AppWidgetProviderInfo của chúng tôi, chúng tôi cần xác định các thuộc tính sau:

1. android: previewImage

Đây là drawable đại diện cho widget ứng dụng của bạn trong Bộ chọn Widget Widget của thiết bị.

Nếu bạn không cung cấp một chế độ xem trước, thì Android sẽ sử dụng biểu tượng ứng dụng của bạn để thay thế. Để khuyến khích người dùng chọn tiện ích con của bạn từ Trình chọn tiện ích, bạn nên cung cấp một bản vẽ có thể hiển thị tiện ích của bạn sẽ trông như thế nào sau khi nó được cấu hình đúng trên màn hình chính của người dùng.

Cách dễ nhất để tạo hình ảnh xem trước là sử dụng ứng dụng Xem trước tiện ích mà có trong trình giả lập Android. Ứng dụng này cho phép bạn định cấu hình tiện ích của mình và sau đó tạo hình ảnh, sau đó bạn có thể sử dụng trong dự án Android của mình.

Chúng tôi sẽ tạo ra hình ảnh này sau khi chúng tôi hoàn thành việc xây dựng tiện ích của mình, vì vậy hiện tại tôi sẽ sử dụng tài nguyên mipmap / ic_launcher được tạo tự động làm hình ảnh xem trước tạm thời.

2. android: widgetC Category

Các widget ứng dụng phải được đặt bên trong Máy chủ widget ứng dụng, thường là màn hình chính của Android, nhưng cũng có thể là trình khởi chạy của bên thứ ba như Evie Launcher hoặc Nova Launcher.

Giữa các cấp độ API 17 và 20, có thể đặt các widget ứng dụng trên màn hình chính hoặc là màn hình khóa, nhưng hỗ trợ màn hình khóa không được chấp nhận trong API cấp 21.

Bạn có thể chỉ định liệu tiện ích ứng dụng của mình có thể được đặt trên màn hình chính, màn hình khóa (mà Android gọi là keyguard bảo vệ) hay cả hai, sử dụng thuộc tính android: widgetCarget. Vì nó không thể đặt các vật dụng trên màn hình khóa trong các phiên bản mới nhất của Android, nên chúng tôi sẽ chỉ nhắm mục tiêu vào màn hình chính.

Để bảo vệ quyền riêng tư của người dùng, bộ phận của bạn không nên hiển thị bất kỳ thông tin nhạy cảm hoặc riêng tư nào khi nó được đặt trên màn hình khóa.

Nếu bạn cung cấp cho người dùng tùy chọn đặt tiện ích của bạn trên màn hình khóa, thì bất kỳ ai liếc vào thiết bị của người dùng đều có thể thấy tiện ích của bạn và tất cả nội dung của nó. Để giúp giữ gìn quyền riêng tư của người dùng, thì widget của bạn không nên hiển thị bất kỳ thông tin nhạy cảm hoặc riêng tư nào khi nó được đặt trên màn hình khóa. Nếu tiện ích của bạn chứa dữ liệu cá nhân, thì bạn có thể muốn xem xét việc cung cấp bố cục màn hình chính và màn hình khóa riêng biệt.

3. android: initLayout

Đây là tệp tài nguyên bố cục mà tiện ích con của bạn sẽ sử dụng khi nó được đặt trên màn hình chính, dự án của chúng tôi là list_widget.xml.

4. android: resizeMode = ngang ngang | dọc

Thuộc tính android: resizeMode cho phép bạn chỉ định liệu widget của bạn có thể được thay đổi kích thước theo chiều ngang, chiều dọc hoặc dọc theo cả hai trục hay không.

Để đảm bảo tiện ích con của bạn hiển thị chính xác và hoạt động trên nhiều màn hình khác nhau, nó khuyên bạn nên cho phép tiện ích của mình được thay đổi kích thước theo chiều ngang theo chiều dọc, trừ khi bạn có một lý do cụ thể không.

5. android: minHeight và android: minWidth

Nếu tiện ích của bạn có thể thay đổi kích thước, thì bạn cần đảm bảo người dùng không thu nhỏ widget của bạn đến mức không thể sử dụng được. Bạn có thể sử dụng các thuộc tính minHeight và minWidth để xác định nhỏ nhất ứng dụng của bạn sẽ thu nhỏ lại khi nó bị thay đổi kích thước bởi người dùng.

Các giá trị này cũng đại diện cho kích thước ban đầu của widget của bạn, vì vậy nếu widget của bạn không thể thay đổi kích thước thì minHeight và minWidth sẽ xác định kích thước vĩnh viễn của widget.

6. android: updatePeriodMillis

AppWidgetProviderInfo cũng là nơi bạn sẽ chỉ định tần suất tiện ích của bạn yêu cầu thông tin mới.

Khoảng thời gian cập nhật được hỗ trợ nhỏ nhất là cứ sau 1800000 mili giây (30 phút). Ngay cả khi bạn khai báo khoảng thời gian cập nhật ngắn hơn, tiện ích của bạn vẫn sẽ chỉ cập nhật mỗi nửa giờ một lần.

Mặc dù bạn có thể muốn hiển thị thông tin mới nhất càng nhanh càng tốt, hệ thống sẽ đánh thức một thiết bị ngủ để lấy thông tin mới. Các bản cập nhật thường xuyên có thể đốt cháy pin của thiết bị, đặc biệt là trong thời gian thiết bị không hoạt động trong một khoảng thời gian đáng kể, chẳng hạn như qua đêm. Cung cấp trải nghiệm người dùng tốt nhất có thể có nghĩa là cân bằng giữa việc hạn chế mức tiêu thụ pin và cung cấp thông tin mới trong khung thời gian hợp lý.

Bạn cũng nên tính đến loại nội dung mà widget của bạn sẽ hiển thị.

Bạn cũng nên tính đến loại nội dung mà widget của bạn dành cho Android sẽ hiển thị. Ví dụ: tiện ích thời tiết có thể chỉ cần truy xuất dự báo được cập nhật một lần mỗi ngày, trong khi một ứng dụng hiển thị tin nóng sẽ cần cập nhật thường xuyên hơn.

Để tìm sự cân bằng hoàn hảo này, bạn có thể cần kiểm tra tiện ích của mình qua một dải tần số cập nhật và đo lường tác động đến tuổi thọ pin và tính kịp thời của nội dung phụ tùng của bạn. Nếu bạn có một nhóm người thử nghiệm sẵn sàng, thì bạn thậm chí có thể thiết lập thử nghiệm A / B, để xem liệu một số tần số cập nhật có được nhận tích cực hơn các tần số khác hay không.

Cũng có thể đọc: AndroidManifest.xml mọi thứ bạn cần biết

Cuối cùng, khi bạn đã xác định khoảng thời gian cập nhật hoàn hảo, bạn có thể muốn sử dụng khoảng thời gian ngắn hơn khi phát triển và thử nghiệm ứng dụng của mình. Ví dụ: bạn có thể sử dụng tần suất cập nhật ngắn nhất có thể (android: updatePeriodMillis =, 1800 1800 ″) khi bạn thử nghiệm rằng phương pháp ứng dụng của bạn on on Onddate () đang kích hoạt chính xác, sau đó thay đổi giá trị này trước khi phát hành ứng dụng của bạn ra công chúng.

AppWidgetProviderInfo đã hoàn thành

Tệp bộ sưu tập đã hoàn thành sẽ trông giống như thế này:

Don Liên làm lộn xộn màn hình chính của người dùng!

Để đảm bảo màn hình chính không bao giờ bị lộn xộn, chúng tôi sẽ thêm một số phần đệm và lề vào widget của chúng tôi. Nếu dự án của bạn không có một tệp dimens.xml, thì bạn sẽ cần phải tạo một tệp:

  • Nhấp chuột vào thư mục giá trị dự án của bạn.
  • Chọn Mới> Giá trị tệp tài nguyên.
  • Đặt tên cho tập tin này.
  • Nhấn OK.

Mở tệp dimens.xml của bạn và xác định các giá trị lề và phần đệm sau:

10dp 8dp

Gửi dữ liệu đến widget

Tiếp theo, chúng tôi cần tạo một dịch vụ widget, sẽ chịu trách nhiệm gửi dữ liệu thu thập của chúng tôi đến widget.

Tạo một lớp Java mới (Mới> Lớp Java) có tên là WidgetService và thêm vào như sau:

nhập android.content.Intent; nhập android.widget.RemoteViewsService; lớp công khai WidgetService mở rộng RemoteViewsService {@Override công khai RemoteViewsFactory onGetViewFactory (Mục đích ý định) {trả về DataProvider mới (điều này, ý định); }}

Đăng ký widget của bạn trong Manifest

Bây giờ chúng tôi cần thực hiện một số thay đổi đối với dự án Manifest của dự án.

Để bắt đầu, hãy mở Bản kê khai và đăng ký tiện ích của bạn dưới dạng BroadcastReceiver. Chúng tôi cũng cần thêm bộ lọc ý định cho hành động android.appwidget.action.APPWIDGET_UPDATE:

Tiếp theo, bạn cần chỉ định nhà cung cấp tiện ích ứng dụng:

Cuối cùng, chúng ta cần khai báo dịch vụ sẽ gửi dữ liệu đến widget của chúng ta, trong trường hợp này là lớp WidgetService. Dịch vụ này yêu cầu sự cho phép của ERIC.BIND_REMOTEVIEWS:

Đặt widget của bạn để kiểm tra

Nếu bạn đã theo dõi cùng với hướng dẫn này, thì giờ đây bạn sẽ có một tiện ích bộ sưu tập hoàn chỉnh hiển thị một tập hợp dữ liệu trên màn hình chính của người dùng.

Nếu đây là một dự án Android ngoài đời thực, thì bạn sẽ thường mở rộng các phương thức vòng đời, đặc biệt là phương thức onUpdate (), nhưng đây là tất cả những gì chúng ta cần để tạo một tiện ích mà bạn có thể cài đặt và kiểm tra trên thiết bị Android của mình:

  • Cài đặt dự án này trên điện thoại thông minh, máy tính bảng hoặc AVD (Thiết bị ảo Android) tương thích.
  • Nhấn và giữ bất kỳ phần trống nào của màn hình chính và chọn Widgets khi được nhắc; Điều này sẽ khởi chạy Trình chọn Widget.
  • Vuốt qua Trình chọn tiện ích cho đến khi bạn tìm thấy tiện ích ứng dụng bạn vừa tạo.
  • Nhấn và giữ tiện ích này để thêm nó vào màn hình chính của bạn.
  • Vì đây là phiên bản đầu tiên của tiện ích cụ thể này, nên phương thức onEnables () sẽ chạy và bạn sẽ thấy một trò chơi onEnables được gọi là toast.
  • Thay đổi kích thước widget của bạn. Nếu bạn đặt kích thước được hỗ trợ tối thiểu, thì hãy kiểm tra xem bạn có thể thu nhỏ tiện ích qua giá trị này không.
  • Kiểm tra cuộn ListView, như mong đợi.
  • Tiếp theo, bạn nên kiểm tra phương thức onDisables () bằng cách xóa widget của bạn. Nhấn và giữ tiện ích, rồi chọn Xóa khỏi Màn hình chính. Vì đây là phiên bản cuối cùng của tiện ích cụ thể này, nên phương thức onDisables () sẽ chạy và bạn sẽ thấy một trò chơi onDisables được gọi là toast.

Đây là tất cả những gì bạn cần để cung cấp một tiện ích ứng dụng Android hoạt động, nhưng có một vài bổ sung thường có thể cải thiện trải nghiệm người dùng. Trong các phần sau, chúng tôi sẽ khuyến khích người dùng chọn tiện ích này từ Trình chọn tiện ích, bằng cách tạo hình ảnh xem trước hiển thị tiện ích tốt nhất. I hèll cũng chỉ cho bạn cách tạo một widget có thể tùy chỉnh hoàn toàn, bằng cách thêm một Activity cấu hình vào dự án của bạn.

Tạo hình ảnh xem trước widget Android

Nếu bạn lấy thiết bị Android của mình và vuốt qua Trình chọn tiện ích, bạn sẽ thấy mọi tiện ích được thể hiện bằng một hình ảnh, điều này thường cho thấy tiện ích này sẽ trông như thế nào khi nó được cấu hình trên màn hình chính của người dùng.

Để khuyến khích người dùng chọn tiện ích của bạn, bạn nên cung cấp hình ảnh xem trước làm nổi bật tất cả các thông tin và tính năng hữu ích mà tiện ích của bạn cung cấp.

Bạn có thể nhanh chóng và dễ dàng tạo một hình ảnh xem trước, bằng cách sử dụng ứng dụng Xem trước widget mà có trong trình giả lập Android.

Lưu ý rằng Xem trước tiện ích không được bao gồm trong các hình ảnh hệ thống Android mới nhất, do đó, bạn sẽ cần phải tạo AVD bằng Nougat (API cấp 25) hoặc trước đó:

  • Cài đặt ứng dụng của bạn trên AVD mà API chạy API 25 trở xuống.
  • Mở ngăn kéo ứng dụng AVD xông và khởi chạy ứng dụng Xem trước widget.
  • Bản xem trước của Widget sẽ hiển thị danh sách mọi ứng dụng mà hiện đang cài đặt trên AVD này; chọn ứng dụng của bạn từ danh sách.

  • Widget của bạn bây giờ sẽ được hiển thị trên một nền trống. Dành thời gian thay đổi kích thước và điều chỉnh tiện ích của bạn cho đến khi nó hiển thị tốt nhất mà tiện ích của bạn cung cấp.
  • Khi bạn đã hài lòng với nội dung và nội dung của bạn, hãy chọn Chụp nhanh.

  • Để truy xuất ảnh chụp nhanh của bạn, hãy quay lại Android Studio và chọn Xem> Công cụ Windows> Trình khám phá tệp thiết bị từ thanh công cụ. Thao tác này sẽ khởi chạy Trình khám phá tệp thiết bị Android Studio.
  • Trong Trình khám phá tệp thiết bị, điều hướng đến sdcard / Tải xuống. Bạn sẽ tìm thấy hình ảnh xem trước của mình được lưu ở định dạng sau: _ori_.png

  • Kéo hình ảnh này ra khỏi Android Studio và thả nó vào nơi nào đó có thể truy cập dễ dàng, chẳng hạn như Máy tính để bàn của bạn.
  • Cung cấp cho tập tin hình ảnh này một tên mô tả.
  • Kéo và thả tập tin vào thư mục drawable dự án của bạn.
  • Mở AppWidgetProviderInfo của bạn, dự án này là Collection_widget_info.xml.
  • Tìm android: previewImage = Dòng @ mipmap / ic_launcher Dòng và cập nhật nó để tham chiếu hình ảnh xem trước của bạn.

Tiện ích của bạn bây giờ sẽ sử dụng tài nguyên hình ảnh mới này làm hình ảnh xem trước của nó:

  • Cài đặt dự án cập nhật trên thiết bị Android vật lý hoặc AVD của bạn.
  • Nhấn và giữ bất kỳ phần trống nào của màn hình chính.
  • Nhấn Widgets, khởi chạy Trình chọn widget.
  • Di chuyển đến widget của bạn; bây giờ nó sẽ được sử dụng hình ảnh xem trước cập nhật.

Các widget có thể tùy chỉnh: Thêm một cấu hình Hoạt động

Hoạt động cấu hình sẽ tự động khởi chạy khi người dùng đặt từng phiên bản của tiện ích con của bạn trên màn hình chính của chúng.

Có một số lý do tại sao bạn có thể muốn thêm một hoạt động cấu hình cho dự án của bạn.

các widget có xu hướng cung cấp trải nghiệm người dùng tốt nhất khi chúng cung cấp quyền truy cập vào thông tin hoặc tính năng quan trọng nhất đối với người dùng cá nhân.

Đầu tiên, một số tiện ích yêu cầu thiết lập ban đầu, ví dụ: tiện ích hiển thị cảnh báo giao thông có thể cần biết địa chỉ nhà của người dùng, nơi họ làm việc và thời gian họ thường đi làm. Nếu không có cách nào để nhập thông tin này, widget của bạn có thể hoàn toàn vô dụng!

Ngoài ra, các widget có xu hướng cung cấp trải nghiệm người dùng tốt nhất khi chúng cung cấp quyền truy cập vào thông tin hoặc tính năng quan trọng nhất đối với người dùng cá nhân. Bằng cách thêm Hoạt động cấu hình vào dự án của bạn, bạn có thể cho người dùng tự do chọn và chọn chính xác những gì có bao gồm trong widget của bạn.

Ngay cả các tùy chỉnh tương đối đơn giản, chẳng hạn như thay đổi phông nền hoặc phông chữ của widget, có thể có tác động tích cực đến trải nghiệm người dùng - sau tất cả, không ai khác sẽ đánh giá cao một tiện ích trực quan với phần còn lại của màn hình chính!

Không ai khác sẽ đánh giá cao một tiện ích trực quan xung đột với phần còn lại của màn hình chính của họ!

Ngoài ra, đôi khi bạn có thể có một danh sách dài nội dung mà bạn muốn đưa vào tiện ích của mình và bạn đã đấu tranh để thu hẹp các tùy chọn của mình. Hoạt động cấu hình có thể là một cách để sử dụng tốt tất cả các ý tưởng của bạn mà không cần tạo ra một vật dụng lộn xộn, khó hiểu. Hãy nhớ rằng việc thiết lập một widget không nên cảm thấy như một việc vặt, vì vậy nếu bạn cung cấp một cấu hình Hoạt động thì nó khuyên bạn nên giới hạn trong ba tùy chọn cấu hình.

Hãy để thêm một hoạt động cấu hình cho dự án của chúng tôi!

Đầu tiên, Hoạt động cấu hình của chúng tôi cần một bố cục, vì vậy hãy tạo một tệp tài nguyên bố cục mới có tên config_activity.xml.

Tôi sẽ thêm các nút sau vào bố cục này:

  • Nút cấu hình. Trong một dự án thực tế, nút này sẽ sửa đổi widget theo một cách nào đó, ví dụ như thêm hoặc xóa nội dung hoặc thay đổi tần suất cập nhật widget. Để giúp giữ cho mã của chúng tôi đơn giản, nhấp vào nút này sẽ chỉ hiển thị một bánh mì nướng Tùy chọn cấu hình.
  • Nút cài đặt. Khi người dùng hài lòng với cách cấu hình tiện ích của họ, nhấn nút này sẽ đặt tiện ích được cấu hình mới trên màn hình chính của họ.

Tại đây, tập tin config_activity.xml đã hoàn thành của tôi:

Tạo hoạt động cấu hình

Bây giờ, chúng ta cần tạo Hoạt động cấu hình của chúng tôi.

Để bắt đầu, hãy tạo một lớp Java mới có tên là ConfigActivity. Trong Hoạt động này, chúng tôi sẽ truy xuất ID tiện ích ứng dụng từ ý định khởi chạy Hoạt động cấu hình. Nếu mục đích này không có ID phụ tùng, thì chúng tôi sẽ cần gọi phương thức finish ():

Ý định = getIntent (); Gói bổ sung = aim.getExtras (); if (ngoại tuyến! = null) {appWidgetId = extend.getInt (AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {finish (); }

Tiếp theo, chúng ta cần tạo mục đích trả về, vượt qua ứng dụng ban đầuWidgetId và đặt kết quả từ cấu hình Hoạt động:

Kết quả ý địnhValue = new Intent (); resultValue.putExtra (AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); setResult (RESULT_OK, resultValue); hoàn thành(); }}}

Nếu bạn cung cấp Hoạt động cấu hình, thì quảng bá ACTION_APPWIDGET_UPDATE sẽ được gửi tự động khi hoạt động cấu hình được khởi chạy, có nghĩa là phương thức onUpdate () đã thắng được gọi khi người dùng tạo một thể hiện của widget của bạn.

Để đảm bảo tiện ích của bạn được tạo với thông tin và nội dung cập nhật, Hoạt động cấu hình của bạn phải kích hoạt yêu cầu onUpdate () đầu tiên.

Tại đây, cấu hình đã hoàn thành Cấu hình:

nhập android.app.Activity; nhập android.appwidget.AppWidgetManager; nhập android.os.Bundle; nhập android.widget.Button; nhập android.content.Intent; nhập android.view.View; nhập android.view.View.OnClickListener; nhập android.widget.Toast; lớp công khai ConfigActivity mở rộng Hoạt động {@Override void void onCreate (Gói đã lưuInstanceState) {super.onCreate (yetInstanceState); setContentView (R.layout.config_activity); setResult (RESULT_CANCELED); Nút setupWidget = (Nút) findViewById (R.id.setupWidget); setupWidget.setOnClickListener (new OnClickListener () {@Override void công khai onClick (Xem v) {handlesetupWidget ();}}); Nút configButton = (Nút) findViewById (R.id.configButton); configButton.setOnClickListener (new OnClickListener () {@Override void công khai onClick (Xem v) {handleConfigWidget ();}}); } private void voidsetupWidget () {showAppWidget (); } private void handleConfigWidget () {Toast.makeText (ConfigActivity.this, "Tùy chọn cấu hình", Toast.LENGTH_LONG) .show (); } int appWidgetId; khoảng trống riêng tư showAppWidget () {appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; Ý định = getIntent (); Gói bổ sung = aim.getExtras (); if (ngoại tuyến! = null) {appWidgetId = extend.getInt (AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {finish (); } // TO DO: Thực hiện cấu hình // Intent resultValue = new Intent (); resultValue.putExtra (AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); setResult (RESULT_OK, resultValue); hoàn thành(); }}}

Khi bạn đã tạo một Hoạt động cấu hình, bạn cần khai báo Hoạt động này trong Bản kê khai và chỉ định rằng nó chấp nhận hành động APPWIDGET_CONFIGURE:

Cuối cùng, do Hoạt động cấu hình được tham chiếu bên ngoài phạm vi gói, nên chúng ta cần khai báo Hoạt động này trong AppWidgetProviderInfo, trong trường hợp này là tệp Collection_widget_info.xml:

android: configure = "com.jessicathornsby.collectionwidget.ConfigActivity">

Kiểm tra dự án của bạn

Bây giờ đã đến lúc đưa dự án hoàn thành của bạn vào thử nghiệm:

  • Cài đặt dự án cập nhật của bạn trên thiết bị Android vật lý hoặc AVD.
  • Xóa tất cả các phiên bản trước của tiện ích của bạn, để đảm bảo bạn đang làm việc với phiên bản mới nhất.
  • Nhấn và giữ bất kỳ vùng trống nào trên màn hình chính và chọn Widgets khi được nhắc.
  • Tìm widget của bạn trong Bộ chọn widget và nhấn và giữ để chọn nó.
  • Thả các widget vào màn hình chính của bạn. Hoạt động cấu hình sẽ tự động khởi chạy.
  • Nhấp vào nút Thực hiện một số Cấu hình và bánh mì nướng Tùy chọn cấu hình sẽ xuất hiện, xác nhận rằng tương tác này đã được đăng ký thành công.
  • Hãy tưởng tượng rằng bạn đã tinh chỉnh các cài đặt của widget và bây giờ đã sẵn sàng để đặt nó trên màn hình chính của bạn; nhấn nút Tạo nút Tiện ích và tiện ích này sẽ được tạo thành công.

Bạn có thể tải xuống dự án widget bộ sưu tập đã hoàn thành từ GitHub.

Gói lại

Trong bài viết này, chúng tôi đã tạo một tiện ích bộ sưu tập có thể cuộn để hiển thị một tập dữ liệu trên màn hình chính của người dùng.

Nếu bạn muốn tiếp tục làm việc với dự án này, thì bạn có thể thử thêm mã của riêng mình vào phương thức onUpdate (), để tạo một tiện ích cập nhật thông tin mới theo khoảng thời gian được xác định trong tệp AppWidgetProviderInfo của bạn (bộ sưu tập_betget_info).

Nếu bạn tạo một tiện ích Android, thì hãy chắc chắn chia sẻ sáng tạo của bạn trong các bình luận bên dưới!

Tích cựcThiết kế đẹp Chất lượng xây dựng tuyệt vời Màn hình ống động Hole-punch được thực hiện tốt Chất lượng camera tuyệt vời pin lâu dài Hiệu uất nhanh Giắc cắm tai ngh...

Android 10 đã cập bến, hoàn thành với một tên mới, linh vật mới và một ố tính năng thú vị. Một trong những khía cạnh quan trọng nhất của hệ điều hành mới l...

ĐọC Sách NhiềU NhấT