অ্যাক্টিভিটি রিকগনিশন ট্রানজিশন API কোডল্যাব

1. ভূমিকা

আমরা সর্বত্র ফোন বহন করি, কিন্তু এখন পর্যন্ত, ব্যবহারকারীর ক্রমাগত পরিবর্তনশীল পরিবেশ এবং কার্যকলাপের সাথে তাদের অভিজ্ঞতা সামঞ্জস্য করা অ্যাপগুলির পক্ষে কঠিন ছিল।

অতীতে এটি করার জন্য, ডেভেলপাররা বিভিন্ন সংকেত (অবস্থান, সেন্সর, ইত্যাদি) একত্রিত করে মূল্যবান প্রকৌশল সময় ব্যয় করতো, হাঁটা বা গাড়ি চালানোর মতো কোনও কার্যকলাপ কখন শুরু হয়েছে বা শেষ হয়েছে তা নির্ধারণ করার জন্য। আরও খারাপ, যখন অ্যাপগুলি স্বাধীনভাবে এবং ক্রমাগত ব্যবহারকারীর কার্যকলাপের পরিবর্তনগুলি পরীক্ষা করে, তখন ব্যাটারির আয়ু হ্রাস পায়।

অ্যাক্টিভিটি রিকগনিশন ট্রানজিশন API এই সমস্যাগুলি সমাধান করে একটি সহজ API প্রদান করে যা আপনার জন্য সমস্ত প্রক্রিয়াকরণ করে এবং আপনাকে কেবল বলে দেয় যে আপনি আসলে কী সম্পর্কে আগ্রহী: যখন কোনও ব্যবহারকারীর কার্যকলাপ পরিবর্তিত হয়। আপনার অ্যাপটি কেবল আপনার আগ্রহের কার্যকলাপের একটি রূপান্তরে সাবস্ক্রাইব করে এবং API আপনাকে পরিবর্তনগুলি সম্পর্কে অবহিত করে।

উদাহরণস্বরূপ, একটি মেসেজিং অ্যাপ ব্যবহারকারীর স্ট্যাটাস ব্যস্ত হিসেবে সেট করার জন্য "ব্যবহারকারী কখন গাড়িতে প্রবেশ করেছেন বা বের হয়েছেন তা আমাকে বলুন" জিজ্ঞাসা করতে পারে। একইভাবে, একটি পার্কিং ডিটেকশন অ্যাপ ব্যবহারকারীর পার্কিং অবস্থান সংরক্ষণ করার জন্য "ব্যবহারকারী কখন গাড়ি থেকে বেরিয়ে হাঁটা শুরু করেছেন তা আমাকে বলুন" জিজ্ঞাসা করতে পারে।

এই কোডল্যাবে, আপনি শিখবেন কিভাবে অ্যাক্টিভিটি রিকগনিশন ট্রানজিশন API ব্যবহার করে একজন ব্যবহারকারী কখন হাঁটা বা দৌড়ানোর মতো কোনও কার্যকলাপ শুরু/বন্ধ করে তা নির্ধারণ করতে হয়।

পূর্বশর্ত

অ্যান্ড্রয়েড ডেভেলপমেন্টের সাথে পরিচিতি এবং কলব্যাকের সাথে কিছুটা পরিচিতি।

তুমি কি শিখবে

  • কার্যকলাপ পরিবর্তনের জন্য নিবন্ধন করা হচ্ছে
  • ঐ ইভেন্টগুলি প্রক্রিয়াকরণ করা হচ্ছে
  • যখন আর প্রয়োজন হবে না তখন অ্যাক্টিভিটি ট্রানজিশনের জন্য নিবন্ধন বাতিল করা

তোমার যা লাগবে

  • অ্যান্ড্রয়েড স্টুডিও বাম্বলবি
  • একটি অ্যান্ড্রয়েড ডিভাইস বা এমুলেটর

2. শুরু করা

স্টার্টার প্রজেক্ট রেপো ক্লোন করুন

যত তাড়াতাড়ি সম্ভব শুরু করার জন্য, আমরা আপনার জন্য একটি স্টার্টার প্রজেক্ট প্রস্তুত করেছি। যদি আপনার গিট ইনস্টল করা থাকে, তাহলে আপনি কেবল নীচের কমান্ডটি চালাতে পারেন। (আপনি টার্মিনাল / কমান্ড লাইনে git --version টাইপ করে পরীক্ষা করতে পারেন এবং এটি সঠিকভাবে কার্যকর হচ্ছে কিনা তা যাচাই করতে পারেন।)

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

যদি আপনার গিট না থাকে তবে আপনি প্রকল্পটি একটি জিপ ফাইল হিসাবে পেতে পারেন:

প্রকল্পটি আমদানি করুন

অ্যান্ড্রয়েড স্টুডিও শুরু করুন, এবং স্বাগতম স্ক্রিন থেকে "একটি বিদ্যমান অ্যান্ড্রয়েড স্টুডিও প্রকল্প খুলুন" নির্বাচন করুন এবং প্রকল্প ডিরেক্টরিটি খুলুন।

প্রজেক্টটি লোড হওয়ার পরে, আপনি একটি সতর্কতাও দেখতে পাবেন যে Git আপনার সমস্ত স্থানীয় পরিবর্তনগুলি ট্র্যাক করছে না, আপনি উপরের ডানদিকে " Ignore" অথবা " X " ক্লিক করতে পারেন। (আপনি কোনও পরিবর্তন Git রেপোতে ফিরিয়ে আনবেন না।)

প্রজেক্ট উইন্ডোর উপরের বাম কোণে, যদি আপনি অ্যান্ড্রয়েড ভিউতে থাকেন তবে নীচের ছবির মতো কিছু দেখতে পাবেন। (যদি আপনি প্রজেক্ট ভিউতে থাকেন, তাহলে একই জিনিস দেখতে আপনাকে প্রজেক্টটি প্রসারিত করতে হবে।)

d2363db913d8e5ad.png

দুটি ফোল্ডার আইকন আছে ( base এবং complete )। তাদের প্রতিটি একটি "মডিউল" নামে পরিচিত।

অনুগ্রহ করে মনে রাখবেন যে অ্যান্ড্রয়েড স্টুডিও প্রথমবারের মতো ব্যাকগ্রাউন্ডে প্রোজেক্টটি কম্পাইল করতে কয়েক সেকেন্ড সময় নিতে পারে। এই সময়ের মধ্যে আপনি অ্যান্ড্রয়েড স্টুডিওর নীচে স্ট্যাটাস বারে একটি স্পিনার দেখতে পাবেন:

c9f23d5336be3cfe.png

আমরা আপনাকে কোড পরিবর্তন করার আগে এটি শেষ না হওয়া পর্যন্ত অপেক্ষা করার পরামর্শ দিচ্ছি। এটি অ্যান্ড্রয়েড স্টুডিওকে সমস্ত প্রয়োজনীয় উপাদানগুলি টেনে আনতে অনুমতি দেবে।

এছাড়াও, যদি আপনি "ভাষা পরিবর্তনগুলি কার্যকর হওয়ার জন্য পুনরায় লোড করুন?" বা অনুরূপ কিছু বলার প্রম্পট পান, তাহলে "হ্যাঁ" নির্বাচন করুন।

স্টার্টার প্রজেক্টটি বুঝুন

ঠিক আছে, তুমি সেট আপ করেছো এবং অ্যাক্টিভিটি রিকগনিশন যোগ করার জন্য প্রস্তুত। আমরা base মডিউল ব্যবহার করব, যা এই কোডল্যাবের জন্য শুরুর বিন্দু। অন্য কথায়, তুমি প্রতিটি ধাপ থেকে base কোড যোগ করবে।

complete মডিউলটি আপনার কাজ পরীক্ষা করার জন্য ব্যবহার করা যেতে পারে, অথবা যদি আপনি কোনও সমস্যার সম্মুখীন হন তবে রেফারেন্স করার জন্য।

মূল উপাদানগুলির সংক্ষিপ্ত বিবরণ:

  • MainActivity : কার্যকলাপ স্বীকৃতির জন্য প্রয়োজনীয় সমস্ত কোড ধারণ করে।

এমুলেটর সেটআপ

যদি আপনার অ্যান্ড্রয়েড এমুলেটর সেট আপ করতে সাহায্যের প্রয়োজন হয়, তাহলে "আপনার অ্যাপ চালান" নিবন্ধটি পড়ুন।

স্টার্টার প্রজেক্টটি চালান

আমাদের অ্যাপটি চালাও।

  • আপনার অ্যান্ড্রয়েড ডিভাইসটি আপনার কম্পিউটারের সাথে সংযুক্ত করুন অথবা একটি এমুলেটর শুরু করুন।
  • টুলবারে, ড্রপ-ডাউন নির্বাচক থেকে base কনফিগারেশন নির্বাচন করুন এবং এর পাশে থাকা সবুজ ত্রিভুজ (রান) বোতামে ক্লিক করুন:

a640a291ffaf62ad.png সম্পর্কে

  • আপনার নীচের অ্যাপ্লিকেশনটি দেখা উচিত:

f58d4bb92ee77f41.png সম্পর্কে

  • অ্যাপটি এখন বার্তা প্রিন্ট করা ছাড়া আর কিছুই করে না। আমরা এখন কার্যকলাপ স্বীকৃতি যোগ করব।

সারাংশ

এই ধাপে আপনি যা শিখেছেন:

  • কোডল্যাবের জন্য সাধারণ সেটআপ।
  • আমাদের অ্যাপের মূল বিষয়গুলি।
  • আপনার অ্যাপটি কীভাবে স্থাপন করবেন।

৩. লাইব্রেরি পর্যালোচনা করুন এবং ম্যানিফেস্টের অনুমতি যোগ করুন

আপনার অ্যাপে ট্রানজিশন API ব্যবহার করতে, আপনাকে Google Location and Activity Recognition API-এর উপর নির্ভরতা ঘোষণা করতে হবে এবং অ্যাপ ম্যানিফেস্টে com.google.android.gms.permission.ACTIVITY_RECOGNITION অনুমতি নির্দিষ্ট করতে হবে।

  1. TODO অনুসন্ধান করুন: build.gradle ফাইলে কার্যকলাপ স্বীকৃতির জন্য প্রয়োজনীয় play services লাইব্রেরি পর্যালোচনা করুন । এই ধাপের জন্য কোনও পদক্ষেপ নেই (ধাপ ১), কেবল আমাদের প্রয়োজনীয় ঘোষিত নির্ভরতা পর্যালোচনা করুন। এটি দেখতে এরকম হওয়া উচিত:
    // TODO: Review play services library required for activity recognition.
    implementation 'com.google.android.gms:play-services-location:19.0.1'
  1. base মডিউলে, AndroidManifest.xml এর ম্যানিফেস্টে TODO: Add both activity recognition permissions অনুসন্ধান করুন এবং <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>

মন্তব্যগুলি থেকে আপনি দেখতে পাচ্ছেন, আপনাকে Android 10 এর জন্য দ্বিতীয় অনুমতি যোগ করতে হবে। API সংস্করণ 29-এ যোগ করা রানটাইম অনুমতির জন্য এটি প্রয়োজন।

ব্যস! আপনার অ্যাপ এখন অ্যাক্টিভিটি রিকগনিশন সাপোর্ট করতে পারে, এটি পেতে আমাদের কেবল কোডটি যোগ করতে হবে।

অ্যাপ চালান

অ্যান্ড্রয়েড স্টুডিও থেকে আপনার অ্যাপটি চালান। এটি দেখতে ঠিক একই রকম হওয়া উচিত। আমরা এখনও ট্রানজিশন ট্র্যাক করার জন্য কোনও কোড যোগ করিনি, এটি পরবর্তী বিভাগে থাকবে।

৪. অ্যান্ড্রয়েডে রানটাইম অনুমতি পরীক্ষা করা/অনুরোধ করা

যদিও API সংস্করণ 28 এবং তার নিচের সংস্করণে আমাদের অনুমতির আওতায় রয়েছে, তবুও API সংস্করণ 29 এবং তার পরবর্তী সংস্করণে রানটাইম অনুমতি সমর্থন করতে হবে:

  • MainActivity.java তে, আমরা ব্যবহারকারীর Android 10 (29) বা তার পরবর্তী সংস্করণ আছে কিনা তা পরীক্ষা করব, এবং যদি থাকে, তাহলে আমরা কার্যকলাপ স্বীকৃতির অনুমতিগুলি পরীক্ষা করব।
  • যদি অনুমতি না দেওয়া হয়, তাহলে আমরা ব্যবহারকারীকে একটি স্প্ল্যাশ স্ক্রিনে ( PermissionRationalActivity.java ) পাঠাবো যেখানে ব্যাখ্যা করা হবে কেন অ্যাপটির অনুমতির প্রয়োজন এবং তাদের এটি অনুমোদনের অনুমতি দেওয়া হবে।

অ্যান্ড্রয়েড ভার্সনের কোড চেকিং পর্যালোচনা করুন

base মডিউলে, MainActivity.java তে "TODO: Review check for Android 10 (29+)" অনুসন্ধান করুন। আপনি এই কোড স্নিপেটটি দেখতে পাবেন।

মনে রাখবেন, এই বিভাগের জন্য কোনও পদক্ষেপ নেই।

// 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 অনুমোদনের প্রয়োজন। রানটাইম অনুমতি পরীক্ষা করা প্রয়োজন কিনা তা নির্ধারণ করতে আমরা এই সহজ পরীক্ষাটি ব্যবহার করি।

প্রয়োজনে অ্যাক্টিভিটি শনাক্তকরণের জন্য রানটাইম অনুমতি পরীক্ষা পর্যালোচনা করুন

base মডিউলে, MainActivity.java তে TODO: Review permission check for 29+ অনুসন্ধান করুন। আপনি এই কোড স্নিপেটটি দেখতে পাবেন।

মনে রাখবেন, এই বিভাগের জন্য কোনও পদক্ষেপ নেই।

// 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 মডিউলে, MainActivity.java তে TODO: Enable/Disable activity tracking অনুসন্ধান করুন এবং প্রয়োজনে অনুমতি চাইতে বলুন । মন্তব্যের পরে নীচের কোডটি যোগ করুন।

// 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 মডিউলে, PermissionRationalActivity.java তে TODO: Review permission request for activity recognition অনুসন্ধান করুন। আপনি এই কোড স্নিপেটটি দেখতে পাবেন।

মনে রাখবেন, এই বিভাগের জন্য কোনও পদক্ষেপ নেই।

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

এটি কার্যকলাপের সবচেয়ে গুরুত্বপূর্ণ অংশ এবং পর্যালোচনা করার অংশ। ব্যবহারকারী যখন অনুমতির অনুরোধ করেন তখন কোডটি অনুমতির জন্য অনুরোধটি ট্রিগার করে।

এর বাইরে, PermissionRationalActivity.java ক্লাসটি ব্যবহারকারীর কার্যকলাপ স্বীকৃতির অনুমতি কেন অনুমোদন করা উচিত তার একটি যুক্তি প্রদর্শন করে (সর্বোত্তম অনুশীলন)। ব্যবহারকারী হয় "না ধন্যবাদ" বোতামে ক্লিক করতে পারেন অথবা " চালু থাকুন " বোতামে ক্লিক করতে পারেন (যা উপরের কোডটি ট্রিগার করে)।

আরও জানতে চাইলে ফাইলটি পর্যালোচনা করতে দ্বিধা করবেন না।

৫. কার্যকলাপ পরিবর্তনের জন্য রিসিভার নিবন্ধন/নিবন্ধনমুক্ত করুন

অ্যাক্টিভিটি রিকগনিশন কোড সেটআপ করার আগে, আমরা নিশ্চিত করতে চাই যে আমাদের অ্যাক্টিভিটি সিস্টেম দ্বারা উত্থাপিত ট্রানজিশন অ্যাকশনগুলি পরিচালনা করতে পারে।

ট্রানজিশনের জন্য একটি ব্রডকাস্ট রিসিভার তৈরি করুন

base মডিউলে, MainActivity.java তে কার্যকলাপ পরিবর্তন শুনতে TODO: Create a BroadcastReceiver অনুসন্ধান করুন। নীচের স্নিপেটটি পেস্ট করুন।

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

ট্রানজিশনের জন্য একটি ব্রডকাস্টরিসিভার নিবন্ধন করুন

base মডিউলে, TODO: Register a 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 activity transition receiver অনুসন্ধান করুন। (এটি onStop() তে আছে)। নীচের স্নিপেটটি পেস্ট করুন।

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

Activity বন্ধ হয়ে যাওয়ার সময় রিসিভারের নিবন্ধন বাতিল করাই সবচেয়ে ভালো পদ্ধতি।

৬. অ্যাক্টিভিটি ট্রানজিশন সেটআপ করুন এবং আপডেটের অনুরোধ করুন

অ্যাক্টিভিটি ট্রানজিশন আপডেট পেতে শুরু করতে, আপনাকে অবশ্যই এগুলি বাস্তবায়ন করতে হবে:

  • একটি ActivityTransitionRequest অবজেক্ট যা কার্যকলাপের ধরণ এবং রূপান্তর নির্দিষ্ট করে।
  • একটি PendingIntent কলব্যাক যেখানে আপনার অ্যাপ বিজ্ঞপ্তি পায়। আরও তথ্যের জন্য, একটি pending intent ব্যবহার দেখুন।

অনুসরণ করার জন্য ActivitiyTransitions এর একটি তালিকা তৈরি করুন

ActivityTransitionRequest অবজেক্ট তৈরি করতে, আপনাকে ActivityTransition অবজেক্টের একটি তালিকা তৈরি করতে হবে, যা আপনি যে ট্রানজিশনটি ট্র্যাক করতে চান তা উপস্থাপন করে। একটি ActivityTransition অবজেক্টে নিম্নলিখিত ডেটা থাকে:

  1. একটি কার্যকলাপের ধরণ, যা DetectedActivity ক্লাস দ্বারা প্রতিনিধিত্ব করা হয়। Transition API নিম্নলিখিত কার্যকলাপগুলিকে সমর্থন করে:
  1. একটি ট্রানজিশন টাইপ, যা ActivityTransition ক্লাস দ্বারা প্রতিনিধিত্ব করা হয়। ট্রানজিশন টাইপগুলি হল:

base মডিউলে, MainActivity.java তে TODO: Add activity transitions to track অনুসন্ধান করুন। মন্তব্যের পরে নীচের কোডটি যোগ করুন।

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

এই কোডটি আমরা যে ট্রানজিশনগুলি ট্র্যাক করতে চাই তা পূর্বে খালি তালিকায় যুক্ত করে।

একটি মুলতুবি ইন্টেন্ট তৈরি করুন

যেমনটি আগে বলা হয়েছিল, আমাদের 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 তৈরি করুন এবং আপডেটের অনুরোধ করুন

ActivityTransitionRequest ক্লাসে ActivityTransitions তালিকাটি পাস করে আপনি একটি 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() পদ্ধতিতে পাস করে অ্যাক্টিভিটি ট্রানজিশন আপডেটের জন্য নিবন্ধন করি। 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 মডিউলে, MainActivity.java তে "Stop listening for activity changes" অনুসন্ধান করুন। মন্তব্যের পরে নীচের কোডটি যোগ করুন।

// 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 মডিউলে, onPause() তে MainActivity.java তে TODO: Disable activity transitions when user leaves the app অনুসন্ধান করুন। মন্তব্যের পরে নীচের কোডটি যোগ করুন।

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

কার্যকলাপ পরিবর্তনের পরিবর্তনগুলি ট্র্যাক করার জন্য এটিই যথেষ্ট। এখন আমাদের কেবল আপডেটগুলি প্রক্রিয়া করতে হবে।

৭. ইভেন্ট প্রক্রিয়াকরণ

যখন অনুরোধ করা অ্যাক্টিভিটি ট্রানজিশন ঘটে, তখন আপনার অ্যাপটি একটি Intent কলব্যাক পায়। Intent থেকে একটি ActivityTransitionResult অবজেক্ট বের করা যেতে পারে, যার মধ্যে ActivityTransitionEvent অবজেক্টের একটি তালিকা থাকে। ইভেন্টগুলি কালানুক্রমিক ক্রমে সাজানো হয়, উদাহরণস্বরূপ, যদি কোনও অ্যাপ ACTIVITY_TRANSITION_ENTER এবং ACTIVITY_TRANSITION_EXIT ট্রানজিশনে IN_VEHICLE অ্যাক্টিভিটি টাইপের জন্য অনুরোধ করে, তাহলে ব্যবহারকারী যখন ড্রাইভিং শুরু করে তখন এটি একটি ActivityTransitionEvent অবজেক্ট পায় এবং যখন ব্যবহারকারী অন্য কোনও অ্যাক্টিভিটিতে ট্রানজিশন করে তখন অন্য একটি।

চলুন, এই ইভেন্টগুলি পরিচালনা করার জন্য কোডটি যোগ করি।

base মডিউলে, আমরা আগে তৈরি করা BroadcastReceiver-এর onReceive() তে MainActivity.java তে TODO: Extract activity transition information from listener অনুসন্ধান করুন। মন্তব্যের পরে নীচের কোডটি যোগ করুন।

// 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 এ রূপান্তর করবে এবং স্ক্রিনে প্রিন্ট করবে।

এই তো, তুমি শেষ! অ্যাপটি চালানোর চেষ্টা করো।

গুরুত্বপূর্ণ দ্রষ্টব্য: এমুলেটরে কার্যকলাপের পরিবর্তনগুলি পুনরুত্পাদন করা কঠিন, তাই আমরা একটি ফিজিক্যাল ডিভাইস ব্যবহার করার পরামর্শ দিচ্ছি।

আপনার কার্যকলাপের পরিবর্তনগুলি ট্র্যাক করতে সক্ষম হওয়া উচিত।

সেরা ফলাফলের জন্য, একটি ফিজিক্যাল ডিভাইসে অ্যাপটি ইনস্টল করুন এবং ঘুরে দেখুন। :)

৮. কোডটি পর্যালোচনা করুন

তুমি একটা সহজ অ্যাপ তৈরি করেছো যা অ্যাক্টিভিটি ট্রানজিশন ট্র্যাক করে এবং স্ক্রিনে সেগুলো তালিকাভুক্ত করে।

আপনি কী করেছেন তা পর্যালোচনা করতে এবং এটি কীভাবে একসাথে কাজ করে সে সম্পর্কে আরও ভাল ধারণা পেতে কোডটি সম্পূর্ণরূপে পড়তে দ্বিধা করবেন না।