ส่วนนี้จะแสดงวิธีสร้างการโทร 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 โปรไฟล์และให้สิทธิ์ สิทธิ์