Mẫu cơ bản

Phần này hướng dẫn bạn cách tạo lệnh gọi hello world trên nhiều hồ sơ trong ứng dụng. Nhờ đó, bạn sẽ làm quen với SDK và cách triển khai ban đầu để xây dựng ứng dụng. Bạn nên chủ động theo dõi bằng cách phát triển trong ứng dụng của bạn.

Thiết lập thiết bị thử nghiệm bằng hồ sơ công việc

Google tạo ứng dụng Kiểm thử DPC để giúp bạn mô phỏng và kiểm thử trên thiết bị của bạn. Thao tác này sẽ thiết lập một hồ sơ công việc và cung cấp cho bạn có các nút điều khiển để bật hoặc tắt một số tính năng trên thiết bị.

  • Cài đặt ứng dụng DPC Kiểm thử

    Mở Cửa hàng Google Play và tải ứng dụng Test DPC xuống.

  • Thiết lập hồ sơ công việc

    Sau khi ứng dụng được cài đặt, bạn sẽ thấy hai biểu tượng xuất hiện trên thiết bị, một biểu tượng biểu tượng thiết lập và biểu tượng ứng dụng Kiểm thử DPC. Nhấn vào biểu tượng thiết lập rồi làm theo bước.

Giờ đây, bạn có hai hồ sơ riêng biệt, một dành cho ứng dụng cá nhân và một dành cho ứng dụng công việc. Bạn có thể chuyển đổi giữa hai hồ sơ này qua các thẻ ở đầu danh sách ứng dụng.

cá nhân/công việc
hồ sơ

Khi cài đặt ứng dụng của bạn, ứng dụng thường sẽ tự động cài đặt ở cả hồ sơ. Nếu cần cài đặt rõ ràng vào hồ sơ công việc, bạn có thể sử dụng đối số --user khi cài đặt adb.

$ adb install --user [id number of profile] [path of apk file]

Để biết thêm thông tin về cách thiết lập thiết bị thử nghiệm, hãy truy cập vào trang này .

Đảm bảo ứng dụng của bạn được định cấu hình phù hợp

Bật java 8 hỗ trợ và đảm bảo minSdk tối thiểu là 19.

Thêm phần phụ thuộc gradle

dependencies {
  annotationProcessor
'com.google.android.enterprise.connectedapps:connectedapps-processor:1.1.2'
  implementation
'com.google.android.enterprise.connectedapps:connectedapps:1.1.2'
  implementation
'com.google.android.enterprise.connectedapps:connectedapps-annotations:1.1.2'
}

Chúng tôi sử dụng Guava trong ví dụ này. Đây không phải là yêu cầu khi sử dụng SDK, mà là Bạn cũng nên thêm api("com.google.guava:guava:29.0-android").

Tạo một lớp mới chứa lệnh gọi kiểm thử giữa nhiều hồ sơ

Để sử dụng tính năng này hữu ích hơn sau này, bạn nên đặt mã này trong cùng một gói muốn thực hiện cuộc gọi thực sự giữa nhiều hồ sơ.

public class HelloWorld {

  @CrossProfile
  public ListenableFuture<String> helloWorld() {
    return Futures.immediateFuture("Hello world");
  }
}

Nếu không thể phụ thuộc vào Guava cho sự hỗ trợ của Futures, thì hiện tại bạn chỉ cần theo dõi và thì hãy xem bước cuối cùng để biết cần thực hiện những thay đổi nào.

Thực hiện cuộc gọi giữa nhiều hồ sơ

Bạn có thể thực hiện việc này trong một lớp cần thực hiện các lệnh gọi thực sự giữa các hồ sơ sau.

// TODO: inject/pass these into the class later instead.
CrossProfileConnector crossProfileConnector =
  CrossProfileConnector.builder(this).build();
ProfileHelloWorld profileHelloWorld =
  ProfileHelloWorld.create(crossProfileConnector);

ListenableFuture<Map<Profile, String>> resultsFuture =
  profileHelloWorld.both().helloWorld();

FluentFuture.from(resultsFuture)
  .addCallback(new FutureCallback<Map<Profile, String>>() {
    @Override
    public void onSuccess(Map<Profile, String> results) {
      for (Profile profile : results.keySet()) {
        Log.w("tag", "CROSS_PROFILE profile: " + profile.asInt()
          +   "; result: " + results.get(profile));
      }
    }
    @Override
    public void onFailure(Throwable t) {
      Log.e(TAG, "Failed to say hello world on both profiles", t);
    }
  }, directExecutor());

Cung cấp thực thể cho SDK

Tất nhiên, lệnh gọi phương thức helloWorld đã đề cập trước đó nằm trên một chứ không phải lớp thực. Thông thường, các lớp thực của bạn là singleton hoặc các lớp khác các lớp phức tạp phụ thuộc vào các khung chèn phần phụ thuộc như Dagger. Người nhận cho phép gọi logic trên lớp thực trên hồ sơ khác, mỗi tuỳ chỉnh Lớp @CrossProfile phải có phương thức trình cung cấp tương ứng trong một Lớp @CrossProfileProvider. Tạo lớp này.

public class HelloWorldProvider {

  @CrossProfileProvider
  public HelloWorld getHelloWorld() {
    return new HelloWorld();
  }
}

Dây bổ sung

Để tạo mã để hỗ trợ các lớp và phương thức tuỳ chỉnh, bạn cần rất ít đi dây bổ sung. Việc này nhằm xử lý các vấn đề phức tạp của việc có nhiều mục tiêu xây dựng và yêu cầu về mức độ hiển thị trên quy mô lớn.

Trước tiên, hãy chú thích một lớp cấp cao hiện có hoặc mới bằng @CrossProfileConfiguration, trỏ đến các lớp của trình cung cấp.

@CrossProfileConfiguration(providers = HelloWorldProvider.class)
abstract class HelloWorldConfiguration {}

Thứ hai, thêm dịch vụ được tạo tự động vào tệp kê khai của bạn, bên trong <application> tag. Điều này có thể không giải quyết được cho đến khi bạn tạo dự án của mình.

<service
android:name="com.google.android.enterprise.connectedapps.CrossProfileConnector_Service"
android:exported="false"/>

Cuối cùng, để phục vụ mục đích phát triển, hãy tự cung cấp cho bạn INTERACT_ACROSS_USERS quyền. Nếu chưa có tài khoản này, bạn sẽ không thể lưu giữ nhưng đó là cách dễ nhất để bắt đầu. Trước tiên, hãy thêm tài khoản đó vào tệp kê khai như sau:

<uses-permission
      android:name="android.permission.INTERACT_ACROSS_USERS"
      tools:ignore="ProtectedPermissions"/>

Sau đó, bạn có thể tự cấp quyền từ dòng lệnh bằng adb dưới dạng sau (nếu ứng dụng của bạn chưa có):

adb shell pm grant <your package> android.permission.INTERACT_ACROSS_USERS

Nếu không thể phụ thuộc vào Guava cho tương lai, bạn sẽ cần thực hiện một vài thay đổi. Trước tiên, hãy trả về dòng lệnh "Hello World" ("Xin chào thế giới") nhập trực tiếp vào chuỗi và in kết quả của lệnh gọi giữa nhiều hồ sơ. Thứ hai, vì các lệnh gọi này hiện đồng bộ, bạn nên thực hiện cuộc gọi đa hồ sơ và in kết quả trong trình nghe kết nối.

Khi bạn chạy mã được liệt kê trong phần ''make a cross-profile cal'' bạn sẽ thấy hai nhật ký cho ''Hello World'', một nhật ký cho mỗi hồ sơ. Nếu chỉ nhận được một nhật ký, đảm bảo bạn đã cài đặt ứng dụng trong cả hai hồ sơ và đã cấp quyền quyền.