ตัวอย่างพื้นฐาน

ส่วนนี้จะแสดงวิธีสร้างการโทร Hello World ข้ามโปรไฟล์ภายใน แอปของคุณ วิธีนี้จะทำให้คุณคุ้นเคยกับ SDK และ ที่จะต่อยอดได้อีกด้วย เราขอแนะนำให้คุณพยายามติดตาม โดยการพัฒนาในแอปของคุณ

ตั้งค่าอุปกรณ์ทดสอบที่มีโปรไฟล์งาน

Google สร้างแอป Test DPC เพื่อช่วยให้คุณจำลองและทดสอบ สภาพแวดล้อมในอุปกรณ์ของคุณเอง ระบบจะตั้งค่าโปรไฟล์งานและแจ้งให้คุณทราบ ด้วยตัวควบคุมเพื่อเปิดหรือปิดใช้ฟีเจอร์บางอย่างในอุปกรณ์

  • ติดตั้งแอป Test DPC

    เปิด Google Play Store และดาวน์โหลดแอป Test DPC

  • ตั้งค่าโปรไฟล์งาน

    เมื่อติดตั้งแอปแล้ว คุณจะเห็นไอคอน 2 ไอคอนปรากฏขึ้นบนอุปกรณ์ ไอคอนการตั้งค่าและไอคอนแอปทดสอบ DPC แตะไอคอนการตั้งค่าและทำตาม ขั้นตอน

คุณจะมีโปรไฟล์แยกกัน 2 โปรไฟล์ โดยโปรไฟล์หนึ่งใช้สำหรับแอปส่วนตัวและอีกโปรไฟล์หนึ่งสำหรับแอปงาน คุณสามารถสลับไปมาระหว่างแอปเหล่านี้ผ่านแท็บต่างๆ ที่ด้านบนของรายการแอป

ส่วนตัว/ที่ทำงาน
โปรไฟล์

เมื่อติดตั้งแอปของคุณ โดยปกติแล้วแอปจะติดตั้งในทั้ง 2 เวอร์ชันโดยอัตโนมัติ โปรไฟล์ หากต้องการติดตั้งลงในโปรไฟล์งานโดยตรง สามารถใช้อาร์กิวเมนต์ --user กับ adb install ได้

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

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการตั้งค่าอุปกรณ์ทดสอบ โปรดไปที่ ลิงก์

ตรวจสอบว่าได้กําหนดค่าแอปพลิเคชันอย่างเหมาะสม

เปิดใช้งาน Java 8 การสนับสนุน และตรวจสอบว่า minSdk ของคุณมีค่าอย่างน้อย 19

เพิ่มการอ้างอิง 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'
}

ตัวอย่างนี้ใช้ Guava ข้อกำหนดนี้ไม่ใช่ข้อกำหนดในการใช้ SDK แต่ต้อง ตามด้วยข้อความ Hello World ที่คุณควรเพิ่ม api("com.google.guava:guava:29.0-android")

สร้างคลาสใหม่ที่จะมีการเรียกใช้ข้ามโปรไฟล์ทดสอบ

ในการทำให้มีประโยชน์มากขึ้นในภายหลัง คุณควรใส่ไว้ในแพ็กเกจเดียวกับ ต้องการให้เราติดต่อข้ามโปรไฟล์จริงของคุณ

public class HelloWorld {

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

หากคุณพึ่งพา Guava สำหรับการสนับสนุน Futures ไม่ได้ โปรดติดตามไปก่อนตอนนี้และ ให้ดูขั้นตอนสุดท้ายซึ่งจะบอกให้คุณทราบว่าต้องทำการเปลี่ยนแปลงใด

โทรข้ามโปรไฟล์

คุณสามารถดำเนินการนี้ในชั้นเรียนที่ต้องโทรข้ามโปรไฟล์จริง ในภายหลัง

// 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());

ระบุอินสแตนซ์ให้กับ SDK

แน่นอนว่าการเรียกใช้เมธอด helloWorld ที่กล่าวถึงก่อนหน้านี้เป็นโค้ดที่สร้างขึ้น ไม่ใช่ชั้นเรียนจริง บ่อยครั้งที่คลาสที่แท้จริงของคุณจะเป็นซิงเกิลหรือ คลาสที่ซับซ้อนจะขึ้นอยู่กับเฟรมเวิร์กการแทรกทรัพยากร Dependency เช่น Dagger ถึง ทำให้มีการเรียกตรรกะในชั้นเรียนจริงในโปรไฟล์ของอีกโปรไฟล์หนึ่ง โดยแต่ละรายการ คลาส @CrossProfile ต้องมีเมธอดของผู้ให้บริการที่เกี่ยวข้องใน ชั้นเรียน@CrossProfileProvider สร้างชั้นเรียนนี้

public class HelloWorldProvider {

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

การเดินสายไฟเพิ่มเติม

การสร้างโค้ดที่จำเป็นเพื่อรองรับคลาสและเมธอดที่กำหนดเองจะต้องมี การเดินสายไฟเพิ่มเติมเล็กน้อย เพื่อจัดการกับความซับซ้อนของการมี มีเป้าหมายบิลด์และข้อกำหนดการมองเห็นจำนวนมาก

ขั้นแรก ให้ใส่คำอธิบายประกอบคลาสระดับสูงที่มีอยู่หรือคลาสใหม่ด้วย @CrossProfileConfiguration กำลังชี้ไปที่คลาสของผู้ให้บริการ

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

อันดับที่ 2 เพิ่มบริการที่สร้างโดยอัตโนมัติลงในไฟล์ Manifest <application> tag ปัญหานี้อาจแก้ไขไม่ได้จนกว่าคุณจะสร้างโปรเจ็กต์

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

สุดท้าย ให้สิทธิ์INTERACT_ACROSS_USERSตัวเองเพื่อวัตถุประสงค์ด้านการพัฒนา คุณจะเก็บข้อมูลนี้ไว้ไม่ได้หากยังไม่ได้ดำเนินการ แต่นั่นเป็นวิธีที่ง่ายที่สุดในการเริ่มต้น ก่อนอื่น ให้เพิ่มลงใน ไฟล์ Manifest ดังนี้

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

จากนั้นให้สิทธิ์ตัวเองจากบรรทัดคำสั่งที่มี adb เป็น ดังต่อไปนี้ (หากแอปของคุณยังไม่มี)

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

ถ้าคุณไม่สามารถพึ่งพา Guava สำหรับ Futures คุณจะต้องทำ การเปลี่ยนแปลง ก่อนอื่น ให้กลับไปยังส่วน "สวัสดีโลก" ใส่สตริงโดยตรงและพิมพ์ผลลัพธ์ ของการเรียกใช้ข้ามโปรไฟล์ ประการที่ 2 เนื่องจากตอนนี้การเรียกเหล่านี้เป็นแบบพร้อมกัน คุณควรโทรข้ามโปรไฟล์และพิมพ์ผลลัพธ์ภายใน Listener การเชื่อมต่อ

เมื่อคุณเรียกใช้โค้ดที่แสดงอยู่ใต้ ''make a Cross-profile cal'' คุณควรจะเห็น บันทึก ''สวัสดีโลก'' สองบันทึก คือ 1 บันทึกจากแต่ละโปรไฟล์ หากได้รับบันทึกเพียง 1 รายการ ตรวจสอบว่าคุณได้ติดตั้งแอปในทั้ง 2 โปรไฟล์และให้สิทธิ์ สิทธิ์