Activity Recognition Transition API Codelab

1. مقدمه

ما تلفن‌ها را همه جا با خود حمل می‌کنیم، اما تا به حال، برای برنامه‌ها سخت بوده است که تجربه خود را با محیط و فعالیت دائماً در حال تغییر کاربر تنظیم کنند.

برای انجام این کار در گذشته، توسعه‌دهندگان زمان مهندسی ارزشمندی را صرف ترکیب سیگنال‌های مختلف (موقعیت، حسگر و غیره) می‌کردند تا مشخص کنند که فعالیتی مانند راه رفتن یا رانندگی چه زمانی شروع شده یا به پایان رسیده است. حتی بدتر از آن، زمانی که برنامه ها به طور مستقل و پیوسته تغییرات در فعالیت کاربر را بررسی می کنند، عمر باتری کاهش می یابد.

Activity Recognition Transition API این مشکلات را با ارائه یک API ساده حل می کند که تمام پردازش ها را برای شما انجام می دهد و فقط به شما می گوید که واقعاً به چه چیزی اهمیت می دهید: زمانی که فعالیت کاربر تغییر کرده است. برنامه شما به سادگی در یک انتقال در فعالیت هایی که به آنها علاقه دارید مشترک می شود و API شما را از تغییرات مطلع می کند

به عنوان مثال، یک برنامه پیام‌رسانی می‌تواند بپرسد، "به من بگو چه زمانی کاربر وارد یک وسیله نقلیه شده یا از آن خارج شده است" ، تا وضعیت کاربر را به عنوان مشغول تنظیم کند. به طور مشابه، یک برنامه تشخیص پارک می‌تواند بپرسد: «به من بگو چه زمانی کاربر از وسیله نقلیه خارج شده و شروع به راه رفتن کرده است» تا مکان پارک کاربر را ذخیره کند.

در این نرم‌افزار، یاد می‌گیرید که چگونه از Activity Recognition Transition API برای تعیین زمانی که کاربر فعالیتی مانند راه رفتن یا دویدن را شروع یا متوقف می‌کند، استفاده کنید.

پیش نیازها

آشنایی با برنامه نویسی اندروید و آشنایی کمی با callbacks.

چیزی که یاد خواهید گرفت

  • ثبت نام برای انتقال فعالیت
  • پردازش آن رویدادها
  • لغو ثبت نام برای انتقال فعالیت زمانی که دیگر مورد نیاز نیست

آنچه شما نیاز دارید

  • Android Studio Bumblebee
  • یک دستگاه یا شبیه ساز اندرویدی

2. شروع به کار

کلون Repo Project Starter

برای شروع هر چه سریعتر شما، ما یک پروژه آغازین را برای شما آماده کرده ایم تا بر اساس آن بسازید. اگر git را نصب کرده اید، می توانید به سادگی دستور زیر را اجرا کنید. (می توانید با تایپ git --version در ترمینال / خط فرمان بررسی کنید و بررسی کنید که درست اجرا شود.)

 git clone https://github.com/android/codelab-activity_transitionapi

اگر git ندارید می توانید پروژه را به صورت فایل فشرده دریافت کنید:

پروژه را وارد کنید

اندروید استودیو را راه‌اندازی کنید و از صفحه خوش‌آمدگویی «Open an موجود Android Studio» را انتخاب کنید و فهرست پروژه را باز کنید.

پس از بارگیری پروژه، همچنین ممکن است هشداری ببینید که Git تمام تغییرات محلی شما را ردیابی نمی کند، می توانید روی " نادیده گرفتن" یا " X " در بالا سمت راست کلیک کنید. (شما هیچ تغییری را به مخزن Git برنمی‌گردانید.)

در گوشه سمت چپ بالای پنجره پروژه، اگر در نمای اندروید هستید، باید چیزی شبیه به تصویر زیر ببینید. (اگر در نمای پروژه هستید، باید پروژه را گسترش دهید تا همان مورد را ببینید.)

d2363db913d8e5ad.png

دو آیکون پوشه ( base و complete ) وجود دارد. هر یک از آنها به عنوان "ماژول" شناخته می شوند.

لطفاً توجه داشته باشید که Android Studio ممکن است چند ثانیه طول بکشد تا پروژه در پس‌زمینه برای اولین بار کامپایل شود. در این مدت یک اسپینر را در نوار وضعیت در پایین Android Studio خواهید دید:

c9f23d5336be3cfe.png

توصیه می کنیم قبل از ایجاد تغییرات در کد، صبر کنید تا این کار تمام شود. این به Android Studio اجازه می دهد تا تمام اجزای لازم را وارد کند.

به‌علاوه، اگر پیامی دریافت کردید که می‌گوید «بارگذاری مجدد برای اعمال تغییرات زبان؟» یا چیزی مشابه ، "بله" را انتخاب کنید.

پروژه استارت را درک کنید

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

ماژول complete را می توان برای بررسی کار خود استفاده کرد، یا در صورت مواجه شدن با هر گونه مشکلی برای شما مرجع قرار داد.

مروری بر اجزای کلیدی:

  • MainActivity : شامل تمام کدهای مورد نیاز برای تشخیص فعالیت است.

راه اندازی شبیه ساز

اگر برای راه اندازی شبیه ساز اندروید به کمک نیاز دارید، به مقاله اجرای برنامه خود مراجعه کنید.

پروژه استارت را اجرا کنید

بیایید برنامه خود را اجرا کنیم.

  • دستگاه اندروید خود را به رایانه خود وصل کنید یا یک شبیه ساز راه اندازی کنید.
  • در نوار ابزار، پیکربندی base را از انتخابگر کشویی انتخاب کنید و روی دکمه مثلث سبز رنگ (Run) در کنار آن کلیک کنید:

a640a291ffaf62ad.png

  • شما باید برنامه زیر را ببینید:

f58d4bb92ee77f41.png

  • این برنامه اکنون به غیر از چاپ پیام کاری انجام نمی دهد. اکنون به رسمیت شناختن فعالیت اضافه خواهیم کرد.

خلاصه

در این مرحله شما یاد گرفتید:

  • راه اندازی کلی برای Codelab.
  • اصول اولیه برنامه ما
  • نحوه استقرار برنامه

3. کتابخانه را مرور کنید و اجازه نمایش را اضافه کنید

برای استفاده از Transition API در برنامه خود، باید وابستگی به Google Location and Activity Recognition API اعلام کنید و مجوز com.google.android.gms.permission.ACTIVITY_RECOGNITION را در مانیفست برنامه مشخص کنید.

  1. جستجوی TODO: کتابخانه خدمات پخش مورد نیاز برای تشخیص فعالیت را در فایل build.gradle مرور کنید . هیچ اقدامی برای این مرحله (مرحله 1) وجود ندارد، فقط وابستگی اعلام شده مورد نیاز ما را بررسی کنید. باید به این شکل باشد:
    // TODO: Review play services library required for activity recognition.
    implementation 'com.google.android.gms:play-services-location:19.0.1'
  1. در ماژول base ، TODO را جستجو کنید: هر دو مجوز شناسایی فعالیت را به مانیفست در AndroidManifest.xml اضافه کنید و کد زیر را به عنصر <manifest> اضافه کنید.
<!-- TODO: Add both activity recognition permissions to the manifest. -->
<!-- Required for 28 and below. -->
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
<!-- Required for 29+. -->
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />

اکنون کد شما باید چیزی شبیه به این باشد:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.example.myapp">
<!-- TODO: Add both activity recognition permissions to the manifest. -->
<!-- Required for 28 and below. -->
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
<!-- Required for 29+. -->
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />

  ...
</manifest>

همانطور که از نظرات می بینید، شما باید مجوز دوم را برای اندروید 10 اضافه کنید. این برای مجوز زمان اجرا که در API نسخه 29 اضافه شده است لازم است.

همین! اکنون برنامه شما می‌تواند از تشخیص فعالیت پشتیبانی کند، فقط باید کد را اضافه کنیم تا آن را دریافت کنیم.

برنامه را اجرا کنید

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

4. بررسی/درخواست مجوزهای زمان اجرا در اندروید

در حالی که مجوز API نسخه 28 و پایین‌تر را داریم، باید از مجوزهای زمان اجرا در API نسخه 29 و بالاتر پشتیبانی کنیم:

  • در MainActivity.java ، بررسی می‌کنیم که آیا کاربر از Android 10 (29) یا بالاتر استفاده می‌کند یا خیر، و اگر دارند، مجوزهای تشخیص فعالیت را بررسی می‌کنیم.
  • اگر مجوزها اعطا نشوند، کاربر را به یک صفحه نمایش ( PermissionRationalActivity.java ) می فرستیم و توضیح می دهد که چرا برنامه به مجوز نیاز دارد و به آنها اجازه می دهیم آن را تأیید کنند.

بررسی کد بررسی نسخه اندروید

در ماژول base ، TODO: بررسی بررسی دستگاه‌های دارای Android 10 (29+) را در MainActivity.java جستجو کنید. شما باید این قطعه کد را ببینید.

توجه داشته باشید هیچ اقدامی برای این بخش وجود ندارد.

// TODO: Review check for devices with Android 10 (29+).
private boolean runningQOrLater =
    android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q;

همانطور که قبلاً گفته شد، برای مجوز زمان اجرا android.permission.ACTIVITY_RECOGNITION در Android 10 و بالاتر نیاز به تأیید دارید. ما از این بررسی ساده برای تصمیم گیری در مورد اینکه آیا نیاز به بررسی مجوزهای زمان اجرا داریم یا خیر استفاده می کنیم.

در صورت نیاز، بررسی مجوز زمان اجرا را برای شناسایی فعالیت بررسی کنید

در ماژول base ، TODO: بررسی مجوز برای 29+ را در MainActivity.java جستجو کنید. شما باید این قطعه کد را ببینید.

توجه داشته باشید هیچ اقدامی برای این بخش وجود ندارد.

// TODO: Review permission check for 29+.
if (runningQOrLater) {

   return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(
           this,
           Manifest.permission.ACTIVITY_RECOGNITION
   );
} else {
   return true;
}

ما از متغیری که در مرحله قبل ایجاد کردیم استفاده می کنیم تا ببینیم آیا باید مجوزهای زمان اجرا را بررسی کنیم یا خیر.

برای Q و بالاتر، ما نتیجه را برای مجوز زمان اجرا بررسی می کنیم و برمی گردانیم. این بخشی از یک روش بزرگتر به نام activityRecognitionPermissionApproved() است که به توسعه دهنده اجازه می دهد در یک تماس ساده بداند که آیا نیاز به درخواست مجوز داریم یا خیر.

درخواست مجوزهای زمان اجرا و فعال/غیرفعال کردن انتقال تشخیص فعالیت

در ماژول base ، TODO را جستجو کنید: ردیابی فعالیت را فعال/غیرفعال کنید و در صورت نیاز در MainActivity.java مجوز بخواهید . بعد از کامنت کد زیر را اضافه کنید.

// TODO: Enable/Disable activity tracking and ask for permissions if needed.
if (activityRecognitionPermissionApproved()) {

   if (activityTrackingEnabled) {
      disableActivityTransitions();

   } else {
      enableActivityTransitions();
   }

} else {  
   // Request permission and start activity for result. If the permission is approved, we
   // want to make sure we start activity recognition tracking.
   Intent startIntent = new Intent(this, PermissionRationalActivity.class);
   startActivityForResult(startIntent, 0);

}

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

برای مواردی که مجوز تأیید نشده است، کاربر را به فعالیت صفحه نمایش اسپلش می فرستیم که توضیح می دهد چرا به مجوز نیاز داریم و به آنها اجازه فعال کردن آن را می دهیم.

کد درخواست مجوز را مرور کنید

در ماژول base ، TODO را جستجو کنید: درخواست مجوز برای شناسایی فعالیت را در PermissionRationalActivity.java بررسی کنید. شما باید این قطعه کد را ببینید.

توجه داشته باشید هیچ اقدامی برای این بخش وجود ندارد.

// TODO: Review permission request for activity recognition.
ActivityCompat.requestPermissions(
             this,
             new String[]{Manifest.permission.ACTIVITY_RECOGNITION},
             PERMISSION_REQUEST_ACTIVITY_RECOGNITION)

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

خارج از آن، کلاس PermissionRationalActivity.java منطقی را نشان می دهد که چرا کاربر باید مجوز شناسایی فعالیت (بهترین عمل) را تأیید کند. کاربر می تواند روی دکمه No Thanks یا دکمه Continue (که کد بالا را فعال می کند) کلیک کند.

اگر می خواهید بیشتر بدانید، می توانید فایل را مرور کنید.

5. ثبت/لغو ثبت گیرنده برای انتقال فعالیت

قبل از اینکه کد شناسایی فعالیت را تنظیم کنیم، می‌خواهیم مطمئن شویم که Activity ما می‌تواند اقدامات انتقالی را که توسط سیستم انجام می‌شود، انجام دهد.

یک BroadcastReceiver برای انتقال ایجاد کنید

در ماژول base ، TODO را جستجو کنید: یک BroadcastReceiver برای گوش دادن به انتقال فعالیت در MainActivity.java ایجاد کنید. قطعه را در زیر بچسبانید.

// TODO: Create a BroadcastReceiver to listen for activity transitions.
// The receiver listens for the PendingIntent above that is triggered by the system when an
// activity transition occurs.
mTransitionsReceiver = new TransitionsReceiver();

یک BroadcastReceiver برای انتقال ثبت کنید

در ماژول base ، TODO را جستجو کنید: یک BroadcastReceiver را برای گوش دادن به انتقال فعالیت در MainActivity.java ثبت کنید. (این در onStart() است). قطعه را در زیر بچسبانید.

// TODO: Register a BroadcastReceiver to listen for activity transitions.
registerReceiver(mTransitionsReceiver, new IntentFilter(TRANSITIONS_RECEIVER_ACTION));

اکنون ما راهی برای دریافت به‌روزرسانی‌ها در هنگام افزایش فعالیت‌ها از طریق PendingIntent داریم.

پخش کننده پخش کننده

در ماژول base ، هنگامی که کاربر برنامه را ترک می‌کند در MainActivity.java ، گیرنده انتقال فعالیت Unregister را جستجو کنید. (این در onStop() ) است. قطعه را در زیر قرار دهید.

// TODO: Unregister activity transition receiver when user leaves the app.
unregisterReceiver(mTransitionsReceiver);

بهترین روش لغو ثبت یک گیرنده زمانی است که Activity در حال خاموش شدن است.

6. انتقال فعالیت را تنظیم کنید و درخواست به روز رسانی کنید

برای شروع دریافت به‌روزرسانی‌های انتقال فعالیت، باید موارد زیر را اجرا کنید:

فهرستی از ActivitiyTransitions برای دنبال کردن ایجاد کنید

برای ایجاد شی ActivityTransitionRequest ، باید لیستی از اشیاء ActivityTransition ایجاد کنید که نشان دهنده انتقالی است که می خواهید ردیابی کنید. یک شی ActivityTransition شامل داده های زیر است:

  1. یک نوع فعالیت که با کلاس DetectedActivity نمایش داده می شود. Transition API از فعالیت های زیر پشتیبانی می کند:
  1. یک نوع انتقال که با کلاس ActivityTransition نشان داده می شود. انواع انتقال عبارتند از:

در ماژول base ، TODO را جستجو کنید: انتقال فعالیت را برای ردیابی در MainActivity.java اضافه کنید. بعد از کامنت کد زیر را اضافه کنید.

// TODO: Add activity transitions to track.
activityTransitionList.add(new ActivityTransition.Builder()
        .setActivityType(DetectedActivity.WALKING)
        .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
        .build());
activityTransitionList.add(new ActivityTransition.Builder()
        .setActivityType(DetectedActivity.WALKING)
        .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
        .build());
activityTransitionList.add(new ActivityTransition.Builder()
        .setActivityType(DetectedActivity.STILL)
        .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
        .build());
activityTransitionList.add(new ActivityTransition.Builder()
        .setActivityType(DetectedActivity.STILL)
        .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
        .build());

این کد انتقال‌هایی را که می‌خواهیم ردیابی کنیم را به یک لیست خالی اضافه می‌کند.

یک PendingIntent ایجاد کنید

همانطور که قبلا گفته شد، اگر می‌خواهیم در مورد هر گونه تغییر در ActivityTransitionRequest به ما هشدار داده شود، به یک PendingIntent نیاز داریم، بنابراین قبل از اینکه ActivityTransitionRequest خود را تنظیم کنیم، باید یک PendingIntent ایجاد کنیم.

در ماژول base ، عبارت TODO: Initialize PendingIntent را جستجو کنید که هنگامی که یک انتقال فعالیت در MainActivity.java رخ می دهد، راه اندازی می شود . بعد از کامنت کد زیر را اضافه کنید.

// TODO: Initialize PendingIntent that will be triggered when a activity transition occurs.
Intent intent = new Intent(TRANSITIONS_RECEIVER_ACTION);
mActivityTransitionsPendingIntent =
        PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);

اکنون یک PendingIntent داریم که می‌توانیم زمانی که یکی از ActivityTransition رخ می‌دهد، راه‌اندازی کنیم.

یک ActivityTransitionRequest ایجاد کنید و درخواست به روز رسانی کنید

شما می توانید با ارسال لیست ActivityTransition به کلاس ActivityTransitionRequest یک شی ActivityTransitionRequest ایجاد کنید.

در ماژول base ، Create request را جستجو کنید و به تغییرات فعالیت در MainActivity.java گوش دهید. بعد از کامنت کد زیر را اضافه کنید.

// TODO: Create request and listen for activity changes.
ActivityTransitionRequest request = new ActivityTransitionRequest(activityTransitionList);

// Register for Transitions Updates.
Task<Void> task =
        ActivityRecognition.getClient(this)
                .requestActivityTransitionUpdates(request, mActivityTransitionsPendingIntent);


task.addOnSuccessListener(
        new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void result) {
                activityTrackingEnabled = true;
                printToScreen("Transitions Api was successfully registered.");

            }
        });
task.addOnFailureListener(
        new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                printToScreen("Transitions Api could NOT be registered: " + e);
                Log.e(TAG, "Transitions Api could NOT be registered: " + e);

            }
        });

بیایید کد را بررسی کنیم. ابتدا یک ActivityTransitionRequest از لیست انتقال فعالیت خود ایجاد می کنیم.

ActivityTransitionRequest request = new ActivityTransitionRequest(activityTransitionList);

در مرحله بعد، با ارسال نمونه ActivityTransitionRequest شما و آبجکت PendingIntent که در آخرین مرحله ایجاد کردیم، برای به‌روزرسانی‌های انتقال فعالیت ثبت نام می‌کنیم. متد requestActivityTransitionUpdates() یک شی Task را برمی گرداند که می توانید موفقیت یا شکست آن را بررسی کنید، همانطور که در بلوک بعدی کد نشان داده شده است:

// Register for Transitions Updates.
Task<Void> task =
        ActivityRecognition.getClient(this)
                .requestActivityTransitionUpdates(request, mActivityTransitionsPendingIntent);


task.addOnSuccessListener(
        new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void result) {
                activityTrackingEnabled = true;
                printToScreen("Transitions Api was successfully registered.");

            }
        });
task.addOnFailureListener(
        new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                printToScreen("Transitions Api could NOT be registered: " + e);
                Log.e(TAG, "Transitions Api could NOT be registered: " + e);

            }
        });

پس از ثبت نام موفقیت آمیز برای به روز رسانی های انتقال فعالیت، برنامه شما اعلان هایی را در PendingIntent ثبت شده دریافت می کند. همچنین متغیری را تنظیم کرده‌ایم که ردیابی فعالیت فعال است تا به ما امکان دهد اگر کاربر دوباره روی دکمه کلیک کرد، غیرفعال یا فعال شود یا خیر.

هنگامی که برنامه بسته می شود، به روز رسانی ها را حذف کنید

مهم است که به‌روزرسانی‌های انتقال را هنگام بسته شدن برنامه حذف کنیم.

در ماژول base ، Stop listening برای تغییرات فعالیت را در MainActivity.java جستجو کنید. بعد از کامنت کد زیر را اضافه کنید.

// TODO: Stop listening for activity changes.
ActivityRecognition.getClient(this).removeActivityTransitionUpdates(mActivityTransitionsPendingIntent)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                activityTrackingEnabled = false;
                printToScreen("Transitions successfully unregistered.");
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                printToScreen("Transitions could not be unregistered: " + e);
                Log.e(TAG,"Transitions could not be unregistered: " + e);
            }
        });

اکنون باید زمانی که برنامه در حال خاموش شدن است، متد حاوی کد بالا را فراخوانی کنیم

در ماژول base ، TODO را جستجو کنید: وقتی کاربر برنامه را در MainActivity.java در onPause() ترک می‌کند، انتقال فعالیت را غیرفعال کنید. بعد از کامنت کد زیر را اضافه کنید.

// TODO: Disable activity transitions when user leaves the app.
if (activityTrackingEnabled) {
    disableActivityTransitions();
}

این برای ردیابی تغییرات در انتقال فعالیت است. اکنون فقط باید به روز رسانی ها را پردازش کنیم.

7. پردازش رویدادها

هنگامی که انتقال فعالیت درخواستی رخ می دهد، برنامه شما یک پاسخ تماس Intent دریافت می کند. یک شی ActivityTransitionResult را می توان از Intent استخراج کرد که شامل لیستی از اشیاء ActivityTransitionEvent است. رویدادها به ترتیب زمانی مرتب می‌شوند، برای مثال، اگر برنامه‌ای برای نوع فعالیت IN_VEHICLE در انتقال‌های ACTIVITY_TRANSITION_ENTER و ACTIVITY_TRANSITION_EXIT درخواست کند، وقتی کاربر شروع به رانندگی می‌کند، یک شی ActivityTransitionEvent دریافت می‌کند و زمانی که کاربر به هر فعالیت دیگری منتقل می‌شود، یک شیء دیگر دریافت می‌کند.

بیایید کدی را برای مدیریت آن رویدادها اضافه کنیم.

در ماژول base ، TODO را جستجو کنید: اطلاعات انتقال فعالیت را از listener در MainActivity.java در onReceive() BroadcastReceiver که قبلا ایجاد کردیم، استخراج کنید. بعد از کامنت کد زیر را اضافه کنید.

// TODO: Extract activity transition information from listener.
if (ActivityTransitionResult.hasResult(intent)) {

    ActivityTransitionResult result = ActivityTransitionResult.extractResult(intent);

    for (ActivityTransitionEvent event : result.getTransitionEvents()) {

        String info = "Transition: " + toActivityString(event.getActivityType()) +
                " (" + toTransitionType(event.getTransitionType()) + ")" + "   " +
                new SimpleDateFormat("HH:mm:ss", Locale.US).format(new Date());

        printToScreen(info);
    }
}

این اطلاعات را به یک String تبدیل می کند و آن را روی صفحه چاپ می کند.

همین، تمام شدی! سعی کنید برنامه را اجرا کنید.

نکته مهم: بازتولید تغییرات فعالیت در شبیه ساز سخت است، بنابراین توصیه می کنیم از یک دستگاه فیزیکی استفاده کنید.

شما باید بتوانید تغییرات فعالیت را ردیابی کنید.

برای بهترین نتیجه، برنامه را روی یک دستگاه فیزیکی نصب کنید و راه بروید. :)

8. کد را مرور کنید

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

به راحتی می توانید کد را به طور کامل بخوانید تا کارهایی را که انجام داده اید مرور کنید و ایده بهتری از نحوه عملکرد آن با هم داشته باشید.