نمونه پایه

این بخش به شما نشان می‌دهد که چگونه می‌توانید یک تماس با پروفایل متقابل hello world در برنامه خود ایجاد کنید. این به شما امکان می دهد با SDK و یک پیاده سازی اولیه برای ساخت در بالای آن آشنا شوید. به شما توصیه می شود که با توسعه در برنامه خود به طور فعال دنبال کنید.

یک دستگاه آزمایشی با نمایه کاری راه اندازی کنید

Google برنامه Test DPC را برای کمک به شبیه سازی و آزمایش یک محیط مدیریت شده در دستگاه خود می سازد. یک نمایه کاری راه‌اندازی می‌کند و کنترل‌هایی را برای فعال یا غیرفعال کردن برخی ویژگی‌های دستگاه در اختیار شما قرار می‌دهد.

  • برنامه Test DPC را نصب کنید

    فروشگاه Google Play را باز کنید و برنامه Test DPC را دانلود کنید.

  • یک نمایه کاری تنظیم کنید

    هنگامی که برنامه نصب می شود، باید دو نماد روی دستگاه ظاهر شود، یک نماد تنظیم و نماد برنامه تست DPC. روی نماد تنظیمات ضربه بزنید و مراحل را دنبال کنید.

اکنون دو نمایه جداگانه دارید، یکی برای برنامه های شخصی و دیگری برای برنامه های کاری. می‌توانید از طریق برگه‌های بالای فهرست برنامه‌ها بین آن‌ها جابه‌جا شوید.

personal/work
profile

هنگام نصب برنامه، معمولاً به طور خودکار در هر دو نمایه نصب می شود. اگر نیاز به نصب صریح آن در نمایه کاری دارید، می توانید از آرگومان --user با نصب adb استفاده کنید.

$ 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'
}

ما در این مثال از گواوا استفاده می کنیم. این یک الزام برای استفاده از SDK نیست، اما برای دنبال کردن دنیای hello، باید api("com.google.guava:guava:29.0-android") نیز اضافه کنید.

یک کلاس جدید ایجاد کنید که شامل تماس با نمایه متقابل آزمایشی شما باشد

برای اینکه بعداً این کار مفیدتر باشد، باید آن را در همان بسته‌ای قرار دهید که می‌خواهید تماس‌های واقعی متقابل شما انجام شود.

public class HelloWorld {

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

اگر نمی‌توانید به پشتیبانی Guava for 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 که قبلاً ذکر شد، روی یک کلاس تولید شده است و کلاس واقعی نیست. اغلب، کلاس‌های واقعی شما تک‌تن یا کلاس‌های پیچیده دیگری هستند که به چارچوب‌های تزریق وابستگی مانند Dagger وابسته هستند. برای اجازه دادن به منطق در کلاس واقعی در پروفایل دیگر، هر کلاس سفارشی @CrossProfile باید یک متد ارائه دهنده مربوطه در یک کلاس @CrossProfileProvider داشته باشد. این کلاس را ایجاد کنید.

public class HelloWorldProvider {

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

سیم کشی اضافی

تولید کد مورد نیاز برای پشتیبانی از کلاس ها و روش های سفارشی به مقدار کمی سیم کشی اضافی نیاز دارد. این برای رسیدگی به پیچیدگی‌های داشتن اهداف ساخت و الزامات دید در مقیاس است.

ابتدا، یک کلاس سطح بالا یا جدید را با @CrossProfileConfiguration حاشیه نویسی کنید و به کلاس های ارائه دهنده خود اشاره کنید.

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

در مرحله دوم، سرویس تولید شده به صورت خودکار را به مانیفست خود، در داخل <application> tag اضافه کنید. این ممکن است تا زمانی که پروژه خود را نسازید حل نشود.

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

در نهایت، برای اهداف توسعه، به خود اجازه INTERACT_ACROSS_USERS بدهید. اگر قبلاً آن را ندارید، نمی‌توانید آن را در تولید نگه دارید، اما این ساده‌ترین راه برای شروع است. ابتدا آن را به صورت زیر به مانیفست خود اضافه کنید:

<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 for Futures وابسته باشید، باید چند تغییر ایجاد کنید. ابتدا، رشته "Hello World" را مستقیماً برگردانید و نتایج فراخوانی بین پروفایل را چاپ کنید. ثانیا، از آنجایی که این تماس‌ها اکنون همزمان هستند، باید تماس متقابل خود و چاپ نتایج را در شنونده اتصال قرار دهید.

هنگامی که کد فهرست شده در زیر "ساخت یک حساب متقابل" را اجرا می کنید، باید دو گزارش برای "Hello World" مشاهده کنید، یکی از هر نمایه. اگر فقط یک گزارش دریافت می‌کنید، مطمئن شوید که برنامه خود را در هر دو نمایه نصب کرده‌اید و مجوز را داده‌اید.