অ্যালার্ম নির্ধারণ করুন

অ্যালার্ম ( AlarmManager ক্লাসের উপর ভিত্তি করে) আপনাকে আপনার আবেদনের জীবনকালের বাইরে সময়-ভিত্তিক ক্রিয়াকলাপ সম্পাদন করার একটি উপায় দেয়। উদাহরণস্বরূপ, আপনি একটি দীর্ঘ-চলমান অপারেশন শুরু করতে একটি অ্যালার্ম ব্যবহার করতে পারেন, যেমন আবহাওয়ার পূর্বাভাস ডাউনলোড করতে দিনে একবার একটি পরিষেবা শুরু করা।

অ্যালার্মগুলির এই বৈশিষ্ট্যগুলি রয়েছে:

  • তারা আপনাকে নির্দিষ্ট সময় এবং/অথবা ব্যবধানে ইন্টেন্টগুলি ফায়ার করতে দেয়।

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

  • এগুলি আপনার অ্যাপ্লিকেশনের বাইরে কাজ করে, তাই আপনি ইভেন্ট বা অ্যাকশন ট্রিগার করার জন্য ব্যবহার করতে পারেন এমনকি আপনার অ্যাপটি না চললেও এবং ডিভাইসটি নিজে ঘুমিয়ে থাকলেও৷

  • তারা আপনাকে আপনার অ্যাপের রিসোর্স প্রয়োজনীয়তা কমাতে সাহায্য করে। আপনি টাইমারের উপর নির্ভর না করে বা ক্রমাগত পরিষেবা চালু না করেই ক্রিয়াকলাপ নির্ধারণ করতে পারেন।

একটি সঠিক অ্যালার্ম সেট করুন

যখন একটি অ্যাপ একটি সঠিক অ্যালার্ম সেট করে, সিস্টেমটি ভবিষ্যতে কোনো সময়ে অ্যালার্ম সরবরাহ করে। অযৌক্তিক অ্যালার্মগুলি অ্যালার্ম বিতরণের সময় সম্পর্কে কিছু গ্যারান্টি প্রদান করে যখন ব্যাটারি-সংরক্ষণের বিধিনিষেধকে সম্মান করে যেমন ডোজ

অযৌক্তিক অ্যালার্ম বিতরণের সময় কাস্টমাইজ করতে বিকাশকারীরা নিম্নলিখিত API গ্যারান্টিগুলি ব্যবহার করতে পারে৷

একটি নির্দিষ্ট সময়ের পরে একটি অ্যালার্ম সরবরাহ করুন

যদি আপনার অ্যাপ set() , setInexactRepeating() , অথবা setAndAllowWhileIdle() কল করে, সরবরাহ করা ট্রিগার সময়ের আগে অ্যালার্ম কখনই বন্ধ হয় না।

অ্যান্ড্রয়েড 12 (এপিআই লেভেল 31) এবং উচ্চতর ক্ষেত্রে, সিস্টেম সরবরাহ করা ট্রিগার সময়ের এক ঘন্টার মধ্যে অ্যালার্ম আহ্বান করে, যদি না ব্যাটারি সেভার বা ডোজ- এর মতো ব্যাটারি-সাশ্রয়ী বিধিনিষেধ কার্যকর না হয়।

একটি টাইম উইন্ডোর সময় একটি অ্যালার্ম সরবরাহ করুন

যদি আপনার অ্যাপ setWindow() কল করে, সরবরাহকৃত ট্রিগার সময়ের আগে অ্যালার্ম কখনই বন্ধ হয় না। কোনো ব্যাটারি-সংরক্ষণ বিধিনিষেধ কার্যকর না হলে, প্রদত্ত ট্রিগার সময় থেকে শুরু করে নির্দিষ্ট সময় উইন্ডোর মধ্যে অ্যালার্ম বিতরণ করা হয়।

যদি আপনার অ্যাপটি Android 12 বা উচ্চতরকে লক্ষ্য করে, তাহলে সিস্টেমটি অন্তত 10 মিনিটের জন্য একটি সময়-উইন্ডোড অযৌক্তিক অ্যালার্মের আহ্বানকে বিলম্বিত করতে পারে। এই কারণে, 600000 এর নিচে windowLengthMillis প্যারামিটার মান 600000 এ ক্লিপ করা হয়েছে।

মোটামুটি নিয়মিত বিরতিতে একটি পুনরাবৃত্তি অ্যালার্ম সরবরাহ করুন

যদি আপনার অ্যাপ কল করে setInexactRepeating() , সিস্টেম একাধিক অ্যালার্ম আহ্বান করে:

  1. প্রদত্ত ট্রিগার সময় থেকে শুরু করে, নির্দিষ্ট সময় উইন্ডোর মধ্যে প্রথম অ্যালার্মটি বন্ধ হয়ে যায়।
  2. পরবর্তী অ্যালার্মগুলি সাধারণত নির্দিষ্ট সময় উইন্ডো শেষ হওয়ার পরে বন্ধ হয়ে যায়। অ্যালার্মের পরপর দুটি আহ্বানের মধ্যে সময় পরিবর্তিত হতে পারে।

একটি সঠিক অ্যালার্ম সেট করুন

সিস্টেমটি ভবিষ্যতে একটি সুনির্দিষ্ট মুহূর্তে একটি সঠিক অ্যালার্ম আহ্বান করে।

বেশিরভাগ অ্যাপ্লিকেশানগুলি বেশ কয়েকটি সাধারণ ব্যবহারের ক্ষেত্রে সম্পূর্ণ করতে অযৌক্তিক অ্যালার্ম ব্যবহার করে কার্য এবং ইভেন্টগুলি নির্ধারণ করতে পারে৷ যদি আপনার অ্যাপের মূল কার্যকারিতা একটি সুনির্দিষ্ট-সময়ের অ্যালার্মের উপর নির্ভর করে—যেমন একটি অ্যালার্ম ক্লক অ্যাপ বা একটি ক্যালেন্ডার অ্যাপের জন্য—তাহলে এর পরিবর্তে একটি সঠিক অ্যালার্ম ব্যবহার করা ঠিক।

সঠিক অ্যালার্মের প্রয়োজন নাও হতে পারে এমন ক্ষেত্রে ব্যবহার করুন

নিম্নলিখিত তালিকাটি সাধারণ ওয়ার্কফ্লোগুলি দেখায় যেগুলির জন্য সঠিক অ্যালার্মের প্রয়োজন নাও হতে পারে:

আপনার অ্যাপের জীবদ্দশায় সময় নির্ধারণের ক্রিয়াকলাপ
Handler ক্লাসে টাইমিং ক্রিয়াকলাপগুলি পরিচালনা করার জন্য বেশ কয়েকটি ভাল পদ্ধতি রয়েছে, যেমন আপনার অ্যাপটি জীবিত থাকাকালীন প্রতি n সেকেন্ডে কিছু কাজ করা: postAtTime() এবং postDelayed() । মনে রাখবেন যে এই APIগুলি সিস্টেম আপটাইমের উপর নির্ভর করে এবং রিয়েল টাইমে নয়।
নির্ধারিত ব্যাকগ্রাউন্ডের কাজ, যেমন আপনার অ্যাপ আপডেট করা এবং লগ আপলোড করা
WorkManager সময়-সংবেদনশীল পর্যায়ক্রমিক কাজের সময়সূচী করার একটি উপায় প্রদান করে। কাজের জন্য দানাদার রানটাইম সংজ্ঞায়িত করতে আপনি একটি পুনরাবৃত্তি ব্যবধান এবং flexInterval (15 মিনিট সর্বনিম্ন) প্রদান করতে পারেন।
ব্যবহারকারী-নির্দিষ্ট ক্রিয়া যা একটি নির্দিষ্ট সময়ের পরে হওয়া উচিত (এমনকি নিষ্ক্রিয় অবস্থায় সিস্টেম থাকলেও)
একটি অযৌক্তিক অ্যালার্ম ব্যবহার করুন। বিশেষভাবে, setAndAllowWhileIdle() কল করুন।
ব্যবহারকারী-নির্দিষ্ট ক্রিয়া যা একটি নির্দিষ্ট সময়ের পরে হওয়া উচিত
একটি অযৌক্তিক অ্যালার্ম ব্যবহার করুন। বিশেষত, কল set()
ব্যবহারকারী-নির্দিষ্ট ক্রিয়া যা একটি নির্দিষ্ট সময় উইন্ডোর মধ্যে ঘটতে পারে
একটি অযৌক্তিক অ্যালার্ম ব্যবহার করুন। বিশেষ করে, setWindow() কল করুন। মনে রাখবেন, যদি আপনার অ্যাপটি Android 12 বা উচ্চতরকে লক্ষ্য করে, তাহলে সবচেয়ে ছোট অনুমোদিত উইন্ডোর দৈর্ঘ্য 10 মিনিট।

একটি সঠিক অ্যালার্ম সেট করার উপায়

আপনার অ্যাপ নিম্নলিখিত পদ্ধতিগুলির মধ্যে একটি ব্যবহার করে সঠিক অ্যালার্ম সেট করতে পারে৷ এই পদ্ধতিগুলি এমনভাবে অর্ডার করা হয়েছে যে তালিকার নীচের কাছাকাছি থাকাগুলি আরও সময়-সমালোচনামূলক কাজগুলি পরিবেশন করে তবে আরও সিস্টেম সংস্থানগুলির দাবি করে৷

setExact()

ভবিষ্যতে প্রায় সুনির্দিষ্ট সময়ে একটি অ্যালার্ম চালু করুন, যতক্ষণ না অন্যান্য ব্যাটারি-সংরক্ষণ ব্যবস্থা কার্যকর না হয়।

সঠিক অ্যালার্ম সেট করতে এই পদ্ধতিটি ব্যবহার করুন, যদি না আপনার অ্যাপের কাজ ব্যবহারকারীর জন্য সময়-গুরুত্বপূর্ণ হয়।

setExactAndAllowWhileIdle()

ভবিষ্যতে প্রায় সুনির্দিষ্ট সময়ে একটি অ্যালার্ম আহ্বান করুন, এমনকি যদি ব্যাটারি-সংরক্ষণ ব্যবস্থা কার্যকর হয়।

setAlarmClock()

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

সিস্টেম সম্পদ খরচ

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

এটি অত্যন্ত সুপারিশ করা হয় যে আপনি যখনই সম্ভব একটি অযৌক্তিক অ্যালার্ম তৈরি করুন৷ দীর্ঘ কাজ সম্পাদন করতে, আপনার অ্যালার্মের BroadcastReceiver থেকে WorkManager বা JobScheduler ব্যবহার করে সময়সূচী করুন। ডিভাইসটি ডোজে থাকা অবস্থায় কাজ করতে, setAndAllowWhileIdle() ব্যবহার করে একটি অযৌক্তিক অ্যালার্ম তৈরি করুন এবং অ্যালার্ম থেকে একটি কাজ শুরু করুন।

উপযুক্ত সঠিক অ্যালার্ম অনুমতি ঘোষণা করুন

যদি আপনার অ্যাপটি Android 12 বা তার বেশির দিকে লক্ষ্য করে, তাহলে আপনাকে অবশ্যই "অ্যালার্ম এবং রিমাইন্ডার" বিশেষ অ্যাপ অ্যাক্সেস পেতে হবে। এটি করতে, নিম্নলিখিত কোড স্নিপেটে দেখানো হিসাবে আপনার অ্যাপের ম্যানিফেস্ট ফাইলে SCHEDULE_EXACT_ALARM অনুমতি ঘোষণা করুন:

<manifest ...>
    <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
    <application ...>
        ...
    </application>
</manifest>

যদি আপনার অ্যাপটি Android 13 (API স্তর 33) বা উচ্চতরকে লক্ষ্য করে, তাহলে আপনার কাছে SCHEDULE_EXACT_ALARM বা USE_EXACT_ALARM অনুমতি ঘোষণা করার বিকল্প রয়েছে।

<manifest ...>
    <uses-permission android:name="android.permission.USE_EXACT_ALARM"/>
    <application ...>
        ...
    </application>
</manifest>

যদিও SCHEDULE_EXACT_ALARM এবং USE_EXACT_ALARM উভয় অনুমতিই একই ক্ষমতার সংকেত দেয়, সেগুলি আলাদাভাবে দেওয়া হয় এবং বিভিন্ন ব্যবহারের ক্ষেত্রে সমর্থন করে। আপনার অ্যাপের সঠিক অ্যালার্ম ব্যবহার করা উচিত এবং SCHEDULE_EXACT_ALARM বা USE_EXACT_ALARM অনুমতি ঘোষণা করা উচিত, শুধুমাত্র তখনই যদি আপনার অ্যাপে ব্যবহারকারী-মুখী ফাংশনের জন্য সঠিকভাবে সময়মতো পদক্ষেপের প্রয়োজন হয়।

USE_EXACT_ALARM

SCHEDULE_EXACT_ALARM

  • ব্যবহারকারী দ্বারা মঞ্জুর
  • ব্যবহারের ক্ষেত্রে বিস্তৃত সেট
  • অ্যাপগুলিকে নিশ্চিত করা উচিত যে অনুমতি প্রত্যাহার করা হয়নি

SCHEDULE_EXACT_ALARM অনুমতিটি Android 13 (API স্তর 33) এবং উচ্চতর টার্গেট করা অ্যাপগুলির নতুন ইনস্টলের জন্য পূর্ব-মঞ্জুর করা হয় না। যদি কোনও ব্যবহারকারী ব্যাকআপ-এন্ড-রিস্টোর অপারেশনের মাধ্যমে Android 14 চালিত কোনও ডিভাইসে অ্যাপ ডেটা স্থানান্তর করে, তাহলে নতুন ডিভাইসে SCHEDULE_EXACT_ALARM অনুমতি অস্বীকার করা হবে। যাইহোক, যদি একটি বিদ্যমান অ্যাপ ইতিমধ্যেই এই অনুমতি থাকে, তবে ডিভাইসটি Android 14 এ আপগ্রেড করার সময় এটি পূর্ব-মঞ্জুর করা হবে।

দ্রষ্টব্য : যদি সঠিক অ্যালার্মটি একটি OnAlarmListener অবজেক্ট ব্যবহার করে সেট করা হয়, যেমন setExact API সহ, SCHEDULE_EXACT_ALARM অনুমতির প্রয়োজন হয় না৷

SCHEDULE_EXACT_ALARM অনুমতি ব্যবহার করে৷

USE_EXACT_ALARM বিপরীতে, SCHEDULE_EXACT_ALARM অনুমতি অবশ্যই ব্যবহারকারীকে দিতে হবে। ব্যবহারকারী এবং সিস্টেম উভয়ই SCHEDULE_EXACT_ALARM অনুমতি প্রত্যাহার করতে পারে৷

আপনার অ্যাপে অনুমতি দেওয়া হয়েছে কিনা তা পরীক্ষা করতে, সঠিক অ্যালার্ম সেট করার চেষ্টা করার আগে canScheduleExactAlarms() কল করুন। যখন আপনার অ্যাপ্লিকেশানের জন্য SCHEDULE_EXACT_ALARM অনুমতি প্রত্যাহার করা হয়, তখন আপনার অ্যাপ্লিকেশান বন্ধ হয়ে যায় এবং ভবিষ্যতের সমস্ত সঠিক অ্যালার্ম বাতিল হয়ে যায়৷ এর মানে হল canScheduleExactAlarms() দ্বারা প্রত্যাবর্তিত মান আপনার অ্যাপের সমগ্র জীবনচক্রের জন্য বৈধ থাকে।

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

  1. নিশ্চিত করে যে আপনার অ্যাপে এখনও বিশেষ অ্যাপ অ্যাক্সেস আছে। এটি করতে, canScheduleExactAlarms() কল করুন। এই চেকটি আপনার অ্যাপটিকে সেই ক্ষেত্রে থেকে রক্ষা করে যেখানে ব্যবহারকারী আপনার অ্যাপটিকে অনুমতি দেয়, তারপর প্রায় সঙ্গে সঙ্গেই এটি প্রত্যাহার করে।
  2. আপনার অ্যাপ্লিকেশানের বর্তমান অবস্থার উপর ভিত্তি করে প্রয়োজনীয় যেকোনও সঠিক অ্যালার্মগুলি পুনঃনির্ধারণ করে৷ এই যুক্তিটি ACTION_BOOT_COMPLETED সম্প্রচার গ্রহণ করার সময় আপনার অ্যাপ যা করে তার অনুরূপ হওয়া উচিত।

ব্যবহারকারীদেরকে SCHEDULE_EXACT_ALARM অনুমতি দিতে বলুন

বিকল্পটিকে বলা হয় 'অ্যালার্ম এবং রিমাইন্ডার সেট করার অনুমতি দিন'
চিত্র 1. সিস্টেম সেটিংসে "অ্যালার্ম এবং রিমাইন্ডার" বিশেষ অ্যাপ অ্যাক্সেস পৃষ্ঠা, যেখানে ব্যবহারকারীরা আপনার অ্যাপকে সঠিক অ্যালার্ম সেট করার অনুমতি দিতে পারে।

প্রয়োজনে, আপনি ব্যবহারকারীদের সিস্টেম সেটিংসে অ্যালার্ম এবং অনুস্মারক স্ক্রিনে পাঠাতে পারেন, যেমন চিত্র 1 এ দেখানো হয়েছে। এটি করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন:

  1. আপনার অ্যাপের UI-তে, ব্যবহারকারীকে ব্যাখ্যা করুন কেন আপনার অ্যাপকে সঠিক অ্যালার্ম নির্ধারণ করতে হবে।
  2. ACTION_REQUEST_SCHEDULE_EXACT_ALARM অভিপ্রায় ক্রিয়া অন্তর্ভুক্ত এমন একটি অভিপ্রায় আহ্বান করুন৷

একটি পুনরাবৃত্তি অ্যালার্ম সেট করুন

পুনরাবৃত্ত অ্যালার্ম সিস্টেমকে আপনার অ্যাপকে একটি পুনরাবৃত্ত সময়সূচীতে জানানোর অনুমতি দেয়।

একটি খারাপভাবে ডিজাইন করা অ্যালার্ম ব্যাটারি নিষ্কাশনের কারণ হতে পারে এবং সার্ভারে একটি উল্লেখযোগ্য লোড রাখতে পারে। এই কারণে, Android 4.4 (API স্তর 19) এবং উচ্চতর, সমস্ত পুনরাবৃত্তি করা অ্যালার্মগুলি অযৌক্তিক অ্যালার্ম

একটি পুনরাবৃত্তি অ্যালার্মের নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

  • একটি অ্যালার্ম টাইপ। আরও আলোচনার জন্য, একটি অ্যালার্ম টাইপ চয়ন করুন দেখুন।

  • একটি ট্রিগার সময়. আপনার উল্লেখ করা ট্রিগার সময় অতীতে থাকলে, অ্যালার্ম অবিলম্বে ট্রিগার হয়।

  • অ্যালার্মের ব্যবধান। উদাহরণস্বরূপ, দিনে একবার, প্রতি ঘন্টায়, বা প্রতি 5 মিনিটে।

  • একটি মুলতুবি অভিপ্রায় যেটি যখন অ্যালার্ম ট্রিগার হয় তখন ফায়ার হয়৷ আপনি যখন একই মুলতুবি থাকা অভিপ্রায় ব্যবহার করে একটি দ্বিতীয় অ্যালার্ম সেট করেন, তখন এটি আসল অ্যালার্মকে প্রতিস্থাপন করে।

একটি PendingIntent() বাতিল করতে, অভিপ্রায়ের একটি উদাহরণ পেতে PendingIntent.getService()FLAG_NO_CREATE পাস করুন (যদি এটি বিদ্যমান থাকে), তারপর সেই অভিপ্রায়টি AlarmManager.cancel() এ পাস করুন

কোটলিন

val alarmManager =
    context.getSystemService(Context.ALARM_SERVICE) as? AlarmManager
val pendingIntent =
    PendingIntent.getService(context, requestId, intent,
                                PendingIntent.FLAG_NO_CREATE)
if (pendingIntent != null && alarmManager != null) {
  alarmManager.cancel(pendingIntent)
}

জাভা

AlarmManager alarmManager =
    (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent =
    PendingIntent.getService(context, requestId, intent,
                                PendingIntent.FLAG_NO_CREATE);
if (pendingIntent != null && alarmManager != null) {
  alarmManager.cancel(pendingIntent);
}

একটি অ্যালার্ম টাইপ চয়ন করুন

একটি পুনরাবৃত্তি অ্যালার্ম ব্যবহার করার ক্ষেত্রে প্রথম বিবেচ্য বিষয়গুলির মধ্যে একটি হল এর ধরনটি কী হওয়া উচিত৷

অ্যালার্মের জন্য দুটি সাধারণ ঘড়ির ধরন রয়েছে: "বিগত রিয়েল টাইম" এবং "রিয়েল টাইম ক্লক" (RTC)। অতিবাহিত রিয়েল টাইম একটি রেফারেন্স হিসাবে "সিস্টেম বুট থেকে সময়" ব্যবহার করে এবং বাস্তব সময় ঘড়ি UTC (ওয়াল ঘড়ি) সময় ব্যবহার করে। এর মানে হল যে অতিবাহিত বাস্তব সময় সময় অতিবাহিত হওয়ার উপর ভিত্তি করে একটি অ্যালার্ম সেট করার জন্য উপযুক্ত (উদাহরণস্বরূপ, একটি অ্যালার্ম যা প্রতি 30 সেকেন্ডে ফায়ার হয়) কারণ এটি সময় অঞ্চল বা লোকেল দ্বারা প্রভাবিত হয় না। রিয়েল টাইম ঘড়ির ধরন বর্তমান লোকেলের উপর নির্ভরশীল অ্যালার্মগুলির জন্য আরও উপযুক্ত।

উভয় প্রকারের একটি "ওয়েকআপ" সংস্করণ রয়েছে, যা স্ক্রীন বন্ধ থাকলে ডিভাইসের CPU কে ​​জাগিয়ে তুলতে বলে। এটি নিশ্চিত করে যে অ্যালার্ম নির্ধারিত সময়ে বাজবে। আপনার অ্যাপের সময় নির্ভরতা থাকলে এটি কার্যকর। উদাহরণস্বরূপ, যদি একটি নির্দিষ্ট অপারেশন করার জন্য এটির একটি সীমিত উইন্ডো থাকে। আপনি যদি আপনার অ্যালার্ম প্রকারের ওয়েকআপ সংস্করণটি ব্যবহার না করেন, তাহলে আপনার ডিভাইসটি পরবর্তী জেগে উঠলে সমস্ত পুনরাবৃত্তি করা অ্যালার্মগুলি ফায়ার হবে৷

আপনি যদি একটি নির্দিষ্ট ব্যবধানে (উদাহরণস্বরূপ, প্রতি আধ ঘন্টা) আপনার অ্যালার্ম বাজানোর প্রয়োজন হয়, তাহলে অতিবাহিত রিয়েল টাইম প্রকারগুলির একটি ব্যবহার করুন। সাধারণভাবে, এটিই ভাল পছন্দ।

দিনের একটি নির্দিষ্ট সময়ে আপনার অ্যালার্ম ফায়ার করার প্রয়োজন হলে, ঘড়ি-ভিত্তিক রিয়েল টাইম ঘড়ির ধরনগুলির মধ্যে একটি বেছে নিন। উল্লেখ্য, যাইহোক, এই পদ্ধতির কিছু ত্রুটি থাকতে পারে। অ্যাপটি অন্য লোকেলে ভালোভাবে অনুবাদ নাও করতে পারে এবং ব্যবহারকারী যদি ডিভাইসের সময় সেটিং পরিবর্তন করে, তাহলে এটি আপনার অ্যাপে অপ্রত্যাশিত আচরণের কারণ হতে পারে। একটি রিয়েল টাইম ঘড়ি অ্যালার্ম টাইপ ব্যবহার করাও ভালভাবে পরিমাপ করে না, যেমন উপরে আলোচনা করা হয়েছে। আমরা সুপারিশ করি যে আপনি যদি পারেন তাহলে একটি "বিগত রিয়েল টাইম" অ্যালার্ম ব্যবহার করুন৷

এখানে প্রকারের তালিকা রয়েছে:

  • ELAPSED_REALTIME : ডিভাইসটি বুট হওয়ার পর থেকে কত সময়ের জন্য মুলতুবি থাকা অভিপ্রায়কে ফায়ার করে, কিন্তু ডিভাইসটিকে জাগিয়ে তোলে না। অতিবাহিত সময়ের মধ্যে ডিভাইসটি ঘুমিয়ে থাকা যেকোনো সময় অন্তর্ভুক্ত।

  • ELAPSED_REALTIME_WAKEUP : ডিভাইস বুট হওয়ার পর থেকে নির্দিষ্ট সময় অতিবাহিত হওয়ার পরে ডিভাইসটিকে জাগিয়ে তোলে এবং মুলতুবি থাকা অভিপ্রায়কে ফায়ার করে।

  • RTC : নির্দিষ্ট সময়ে মুলতুবি অভিপ্রায় ফায়ার করে কিন্তু ডিভাইসটিকে জাগিয়ে তোলে না।

  • RTC_WAKEUP : নির্দিষ্ট সময়ে মুলতুবি থাকা উদ্দেশ্য ফায়ার করতে ডিভাইসটিকে জাগিয়ে তোলে।

অতিবাহিত রিয়েল টাইম অ্যালার্মের উদাহরণ

এখানে ELAPSED_REALTIME_WAKEUP ব্যবহারের কিছু উদাহরণ রয়েছে৷

30 মিনিটের মধ্যে অ্যালার্ম ফায়ার করার জন্য ডিভাইসটিকে জাগিয়ে দিন এবং তার পরে প্রতি 30 মিনিটে:

কোটলিন

// Hopefully your alarm will have a lower frequency than this!
alarmMgr?.setInexactRepeating(
        AlarmManager.ELAPSED_REALTIME_WAKEUP,
        SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_HALF_HOUR,
        AlarmManager.INTERVAL_HALF_HOUR,
        alarmIntent
)

জাভা

// Hopefully your alarm will have a lower frequency than this!
alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
        SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_HALF_HOUR,
        AlarmManager.INTERVAL_HALF_HOUR, alarmIntent);

এক মিনিটের মধ্যে একটি ওয়ান-টাইম (পুনরাবৃত্তি না হওয়া) অ্যালার্ম ফায়ার করতে ডিভাইসটিকে জাগাও:

কোটলিন

private var alarmMgr: AlarmManager? = null
private lateinit var alarmIntent: PendingIntent
...
alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmIntent = Intent(context, AlarmReceiver::class.java).let { intent ->
    PendingIntent.getBroadcast(context, 0, intent, 0)
}

alarmMgr?.set(
        AlarmManager.ELAPSED_REALTIME_WAKEUP,
        SystemClock.elapsedRealtime() + 60 * 1000,
        alarmIntent
)

জাভা

private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
...
alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
        SystemClock.elapsedRealtime() +
        60 * 1000, alarmIntent);

বাস্তব সময় ঘড়ি অ্যালার্ম উদাহরণ

এখানে RTC_WAKEUP ব্যবহারের কিছু উদাহরণ রয়েছে।

আনুমানিক 2:00 pm এ অ্যালার্ম ফায়ার করার জন্য ডিভাইসটিকে জাগিয়ে দিন এবং একই সময়ে দিনে একবার পুনরাবৃত্তি করুন:

কোটলিন

// Set the alarm to start at approximately 2:00 p.m.
val calendar: Calendar = Calendar.getInstance().apply {
    timeInMillis = System.currentTimeMillis()
    set(Calendar.HOUR_OF_DAY, 14)
}

// With setInexactRepeating(), you have to use one of the AlarmManager interval
// constants--in this case, AlarmManager.INTERVAL_DAY.
alarmMgr?.setInexactRepeating(
        AlarmManager.RTC_WAKEUP,
        calendar.timeInMillis,
        AlarmManager.INTERVAL_DAY,
        alarmIntent
)

জাভা

// Set the alarm to start at approximately 2:00 p.m.
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 14);

// With setInexactRepeating(), you have to use one of the AlarmManager interval
// constants--in this case, AlarmManager.INTERVAL_DAY.
alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
        AlarmManager.INTERVAL_DAY, alarmIntent);

ঠিক সকাল ৮:৩০ মিনিটে এবং তার পর প্রতি ২০ মিনিটে অ্যালার্ম বাজানোর জন্য ডিভাইসটিকে জাগাও:

কোটলিন

private var alarmMgr: AlarmManager? = null
private lateinit var alarmIntent: PendingIntent
...
alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmIntent = Intent(context, AlarmReceiver::class.java).let { intent ->
    PendingIntent.getBroadcast(context, 0, intent, 0)
}

// Set the alarm to start at 8:30 a.m.
val calendar: Calendar = Calendar.getInstance().apply {
    timeInMillis = System.currentTimeMillis()
    set(Calendar.HOUR_OF_DAY, 8)
    set(Calendar.MINUTE, 30)
}

// setRepeating() lets you specify a precise custom interval--in this case,
// 20 minutes.
alarmMgr?.setRepeating(
        AlarmManager.RTC_WAKEUP,
        calendar.timeInMillis,
        1000 * 60 * 20,
        alarmIntent
)

জাভা

private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
...
alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

// Set the alarm to start at 8:30 a.m.
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 30);

// setRepeating() lets you specify a precise custom interval--in this case,
// 20 minutes.
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
        1000 * 60 * 20, alarmIntent);

আপনার অ্যালার্ম কতটা সুনির্দিষ্ট হওয়া দরকার তা নির্ধারণ করুন

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

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

setInexactRepeating() এর সাথে, আপনি setRepeating() এর সাথে যেভাবে পারেন একটি কাস্টম ব্যবধান নির্দিষ্ট করতে পারবেন না। আপনাকে একটি ব্যবধান ধ্রুবক ব্যবহার করতে হবে, যেমন INTERVAL_FIFTEEN_MINUTES , INTERVAL_DAY , এবং আরও অনেক কিছু৷ সম্পূর্ণ তালিকার জন্য AlarmManager দেখুন।

একটি অ্যালার্ম বাতিল করুন

আপনার অ্যাপের উপর নির্ভর করে, আপনি অ্যালার্ম বাতিল করার ক্ষমতা অন্তর্ভুক্ত করতে চাইতে পারেন। একটি অ্যালার্ম বাতিল করতে, অ্যালার্ম ম্যানেজারে cancel() কল করুন, PendingIntent এ পাস করে আপনি আর ফায়ার করতে চান না। যেমন:

কোটলিন

// If the alarm has been set, cancel it.
alarmMgr?.cancel(alarmIntent)

জাভা

// If the alarm has been set, cancel it.
if (alarmMgr!= null) {
    alarmMgr.cancel(alarmIntent);
}

ডিভাইস পুনরায় চালু হলে একটি অ্যালার্ম শুরু করুন

ডিফল্টরূপে, একটি ডিভাইস বন্ধ হয়ে গেলে সমস্ত অ্যালার্ম বাতিল হয়ে যায়। এটি যাতে না ঘটে তার জন্য, ব্যবহারকারী যদি ডিভাইসটি পুনরায় বুট করে তবে আপনি একটি পুনরাবৃত্তি অ্যালার্ম স্বয়ংক্রিয়ভাবে পুনরায় চালু করার জন্য আপনার অ্যাপ্লিকেশনটি ডিজাইন করতে পারেন। এটি নিশ্চিত করে যে AlarmManager ব্যবহারকারীকে ম্যানুয়ালি অ্যালার্ম পুনরায় চালু করার প্রয়োজন ছাড়াই তার কাজটি চালিয়ে যাবে।

এখানে পদক্ষেপগুলি রয়েছে:

  1. আপনার অ্যাপ্লিকেশনের ম্যানিফেস্টে RECEIVE_BOOT_COMPLETED অনুমতি সেট করুন। এটি আপনার অ্যাপ্লিকেশানটিকে ACTION_BOOT_COMPLETED পাওয়ার অনুমতি দেয় যা সিস্টেম বুট করা শেষ হওয়ার পরে সম্প্রচারিত হয় (এটি শুধুমাত্র তখনই কাজ করে যদি ব্যবহারকারীরা অন্তত একবার অ্যাপটি চালু করে থাকেন):

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
  2. সম্প্রচার গ্রহণের জন্য একটি BroadcastReceiver প্রয়োগ করুন:

    কোটলিন

    class SampleBootReceiver : BroadcastReceiver() {
    
        override fun onReceive(context: Context, intent: Intent) {
            if (intent.action == "android.intent.action.BOOT_COMPLETED") {
                // Set the alarm here.
            }
        }
    }
    

    জাভা

    public class SampleBootReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
                // Set the alarm here.
            }
        }
    }
    
  3. ACTION_BOOT_COMPLETED অ্যাকশনে ফিল্টার করে এমন একটি অভিপ্রায় ফিল্টার সহ আপনার অ্যাপের ম্যানিফেস্ট ফাইলে রিসিভার যোগ করুন:

    <receiver android:name=".SampleBootReceiver"
            android:enabled="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"></action>
        </intent-filter>
    </receiver>

    লক্ষ্য করুন যে ম্যানিফেস্টে, বুট রিসিভার সেট করা আছে android:enabled="false" । এর মানে হল যে আবেদনটি স্পষ্টভাবে এটি সক্ষম না করলে রিসিভারকে কল করা হবে না। এটি বুট রিসিভারকে অপ্রয়োজনীয়ভাবে কল করা থেকে বাধা দেয়। আপনি একটি রিসিভার সক্ষম করতে পারেন (উদাহরণস্বরূপ, যদি ব্যবহারকারী একটি অ্যালার্ম সেট করে) নিম্নরূপ:

    কোটলিন

    val receiver = ComponentName(context, SampleBootReceiver::class.java)
    
    context.packageManager.setComponentEnabledSetting(
            receiver,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP
    )
    

    জাভা

    ComponentName receiver = new ComponentName(context, SampleBootReceiver.class);
    PackageManager pm = context.getPackageManager();
    
    pm.setComponentEnabledSetting(receiver,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);
    

    একবার আপনি এইভাবে রিসিভার সক্ষম করলে, ব্যবহারকারী ডিভাইসটি পুনরায় বুট করলেও এটি সক্রিয় থাকবে। অন্য কথায়, প্রোগ্রাম্যাটিকভাবে রিসিভার সক্রিয় করা ম্যানিফেস্ট সেটিংকে ওভাররাইড করে, এমনকি রিবুট জুড়েও। আপনার অ্যাপটি নিষ্ক্রিয় না করা পর্যন্ত রিসিভারটি সক্রিয় থাকবে। আপনি একটি রিসিভার অক্ষম করতে পারেন (উদাহরণস্বরূপ, যদি ব্যবহারকারী একটি অ্যালার্ম বাতিল করে) নিম্নরূপ:

    কোটলিন

    val receiver = ComponentName(context, SampleBootReceiver::class.java)
    
    context.packageManager.setComponentEnabledSetting(
            receiver,
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
            PackageManager.DONT_KILL_APP
    )
    

    জাভা

    ComponentName receiver = new ComponentName(context, SampleBootReceiver.class);
    PackageManager pm = context.getPackageManager();
    
    pm.setComponentEnabledSetting(receiver,
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
            PackageManager.DONT_KILL_APP);
    

ডিভাইসটি ডোজ মোডে থাকা অবস্থায় অ্যালার্ম চালু করুন

Android 6.0 (API লেভেল 23) চালিত ডিভাইসগুলি Doze মোড সমর্থন করে, যা ডিভাইসের ব্যাটারির আয়ু বাড়াতে সাহায্য করে। ডিভাইসটি ডোজ মোডে থাকা অবস্থায় অ্যালার্ম ফায়ার হয় না যতক্ষণ না ডিভাইসটি ডোজ থেকে বের হয় ততক্ষণ পর্যন্ত যে কোনো নির্ধারিত অ্যালার্ম স্থগিত করা হয়। ডিভাইসটি নিষ্ক্রিয় থাকা সত্ত্বেও আপনি যদি কাজটি সম্পূর্ণ করতে চান তবে বেশ কয়েকটি বিকল্প উপলব্ধ রয়েছে:

  • একটি সঠিক অ্যালার্ম সেট করুন।

  • WorkManager API ব্যবহার করুন, যা ব্যাকগ্রাউন্ডের কাজ সম্পাদন করার জন্য তৈরি করা হয়েছে। আপনি নির্দেশ করতে পারেন যে সিস্টেমটি আপনার কাজকে ত্বরান্বিত করবে যাতে কাজটি যত তাড়াতাড়ি সম্ভব শেষ হয়। আরও তথ্যের জন্য, WorkManager-এর সাথে কাজের সময়সূচী দেখুন

সর্বোত্তম অনুশীলন

আপনার পুনরাবৃত্ত অ্যালার্ম ডিজাইন করার ক্ষেত্রে আপনার করা প্রতিটি পছন্দ আপনার অ্যাপ কীভাবে সিস্টেম রিসোর্স ব্যবহার করে (বা অপব্যবহার করে) তার ফলাফল হতে পারে। উদাহরণস্বরূপ, একটি জনপ্রিয় অ্যাপ কল্পনা করুন যা একটি সার্ভারের সাথে সিঙ্ক করে। যদি সিঙ্ক অপারেশন ঘড়ির সময়ের উপর ভিত্তি করে হয় এবং অ্যাপের প্রতিটি ঘটনা রাত 11:00 টায় সিঙ্ক হয়, সার্ভারে লোডের ফলে উচ্চ বিলম্ব বা এমনকি "পরিষেবা অস্বীকার" হতে পারে। অ্যালার্ম ব্যবহার করার জন্য এই সেরা অনুশীলনগুলি অনুসরণ করুন:

  • যেকোন নেটওয়ার্ক অনুরোধে এলোমেলোতা (জিটার) যোগ করুন যা পুনরাবৃত্তি করা অ্যালার্মের ফলে ট্রিগার করে:

    • অ্যালার্ম ট্রিগার হলে স্থানীয় কোনো কাজ করুন। "স্থানীয় কাজ" মানে এমন কিছু যা সার্ভারে আঘাত করে না বা সার্ভার থেকে ডেটার প্রয়োজন হয় না।

    • একই সময়ে, কিছু এলোমেলো সময়ে ফায়ার করার জন্য নেটওয়ার্ক অনুরোধ ধারণ করে এমন অ্যালার্মের সময় নির্ধারণ করুন।

  • আপনার অ্যালার্ম ফ্রিকোয়েন্সি সর্বনিম্ন রাখুন।

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

  • আপনার অ্যালার্মের ট্রিগার সময়কে যতটা প্রয়োজন তার চেয়ে বেশি সুনির্দিষ্ট করবেন না।

    setRepeating setInexactRepeating() setRepeating() ব্যবহার করুন। আপনি যখন setInexactRepeating() ব্যবহার করেন, তখন Android একাধিক অ্যাপ্লিকেশান থেকে পুনরাবৃত্তি করা অ্যালার্ম সিঙ্ক্রোনাইজ করে এবং একই সময়ে সেগুলিকে ফায়ার করে। এটি সিস্টেমটিকে ডিভাইসটিকে জাগ্রত করার মোট সংখ্যা হ্রাস করে, এইভাবে ব্যাটারির ড্রেন হ্রাস করে৷ অ্যান্ড্রয়েড 4.4 (এপিআই লেভেল 19) অনুসারে, সমস্ত পুনরাবৃত্তি করা অ্যালার্মগুলি অযৌক্তিক অ্যালার্ম । মনে রাখবেন যে setInexactRepeating() setRepeating() তুলনায় একটি উন্নতি, এটি এখনও একটি সার্ভারকে অভিভূত করতে পারে যদি একটি অ্যাপের প্রতিটি ঘটনা একই সময়ে সার্ভারে আঘাত করে। অতএব, নেটওয়ার্ক অনুরোধের জন্য, আপনার অ্যালার্মে কিছু এলোমেলোতা যোগ করুন, যেমনটি পূর্বে আলোচনা করা হয়েছে।

  • সম্ভব হলে ঘড়ির সময় আপনার অ্যালার্ম এড়িয়ে চলুন।

    একটি সুনির্দিষ্ট ট্রিগার সময়ের উপর ভিত্তি করে পুনরাবৃত্তি করা অ্যালার্মগুলি ভালভাবে পরিমাপ করে না। আপনি যদি পারেন ELAPSED_REALTIME ব্যবহার করুন। বিভিন্ন অ্যালার্মের ধরনগুলি নিম্নলিখিত বিভাগে আরও বিশদে বর্ণনা করা হয়েছে।