AlarmManager ক্লাসের উপর ভিত্তি করে) আপনাকে আপনার অ্যাপ্লিকেশনের জীবনকালের বাইরে সময়-ভিত্তিক অপারেশন সম্পাদন করার একটি উপায় দেয়। উদাহরণস্বরূপ, আপনি একটি দীর্ঘমেয়াদী অপারেশন শুরু করতে অ্যালার্ম ব্যবহার করতে পারেন, যেমন দিনে একবার আবহাওয়ার পূর্বাভাস ডাউনলোড করার জন্য একটি সার্ভিস চালু করা।অ্যালার্মগুলোর এই বৈশিষ্ট্যগুলো রয়েছে:
এগুলো আপনাকে নির্দিষ্ট সময়ে এবং/অথবা বিরতিতে ইনটেন্ট ফায়ার করার সুযোগ দেয়।
অন্যান্য অপারেশন সম্পাদনের জন্য জব বা ওয়ার্করিকোয়েস্ট শিডিউল করতে আপনি এগুলো ব্রডকাস্ট রিসিভারের সাথে একত্রে ব্যবহার করতে পারেন।
এগুলো আপনার অ্যাপ্লিকেশনের বাইরে কাজ করে, তাই আপনার অ্যাপ চালু না থাকলেও, এমনকি ডিভাইসটি স্লিপ মোডে থাকলেও, আপনি এগুলো ব্যবহার করে বিভিন্ন ইভেন্ট বা অ্যাকশন ট্রিগার করতে পারেন।
এগুলো আপনার অ্যাপের রিসোর্সের প্রয়োজনীয়তা কমাতে সাহায্য করে। আপনি টাইমার বা অবিরাম চলমান সার্ভিসের উপর নির্ভর না করেই অপারেশনগুলোর সময়সূচী নির্ধারণ করতে পারেন।
একটি অনির্দিষ্ট অ্যালার্ম সেট করুন
যখন কোনো অ্যাপ একটি অনির্দিষ্ট অ্যালার্ম সেট করে, তখন সিস্টেমটি ভবিষ্যতে কোনো এক সময়ে অ্যালার্মটি প্রদান করে। অনির্দিষ্ট অ্যালার্মগুলো ডোজ (Doze)- এর মতো ব্যাটারি-সাশ্রয়ী সীমাবদ্ধতাগুলো মেনে চলার পাশাপাশি অ্যালার্ম প্রদানের সময় সম্পর্কে কিছু নিশ্চয়তা প্রদান করে।
ডেভেলপাররা অনির্দিষ্ট অ্যালার্ম ডেলিভারির সময় কাস্টমাইজ করতে নিম্নলিখিত এপিআই গ্যারান্টিগুলো ব্যবহার করতে পারেন।
একটি নির্দিষ্ট সময় পর অ্যালার্ম দিন
যদি আপনার অ্যাপ set() , setInexactRepeating() , বা setAndAllowWhileIdle() কল করে, তাহলে অ্যালার্মটি প্রদত্ত ট্রিগার সময়ের আগে কখনোই বাজে না।
অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) এবং এর পরবর্তী সংস্করণগুলোতে, সিস্টেম প্রদত্ত ট্রিগার সময়ের এক ঘণ্টার মধ্যে অ্যালার্মটি চালু করে, যদি না ব্যাটারি সেভার বা ডোজ-এর মতো কোনো ব্যাটারি-সাশ্রয়ী সীমাবদ্ধতা কার্যকর থাকে।
একটি নির্দিষ্ট সময়সীমার মধ্যে অ্যালার্ম প্রদান করুন।
আপনার অ্যাপ যদি setWindow() কল করে, তাহলে অ্যালার্মটি প্রদত্ত ট্রিগার সময়ের আগে কখনোই বাজে না। ব্যাটারি সাশ্রয়ের কোনো বিধিনিষেধ কার্যকর না থাকলে, প্রদত্ত ট্রিগার সময় থেকে শুরু করে অ্যালার্মটি নির্দিষ্ট সময়সীমার মধ্যে বেজে ওঠে।
আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১২ বা তার উচ্চতর সংস্করণকে টার্গেট করে, তাহলে সিস্টেম একটি নির্দিষ্ট সময়সীমার মধ্যে ঘটা অনির্দিষ্ট অ্যালার্মের চালু হওয়াকে কমপক্ষে ১০ মিনিট পর্যন্ত বিলম্বিত করতে পারে। এই কারণে, windowLengthMillis প্যারামিটারের 600000 এর কম মানগুলোকে 600000 এ সীমাবদ্ধ করে দেওয়া হয়।
মোটামুটি নিয়মিত বিরতিতে একটি পুনরাবৃত্তিমূলক অ্যালার্ম প্রদান করুন
যদি আপনার অ্যাপ setInexactRepeating() কল করে, তাহলে সিস্টেম একাধিক অ্যালার্ম চালু করে:
- প্রদত্ত ট্রিগার সময় থেকে শুরু করে, প্রথম অ্যালার্মটি নির্দিষ্ট সময়সীমার মধ্যে বেজে ওঠে।
- পরবর্তী অ্যালার্মগুলো সাধারণত নির্দিষ্ট সময়সীমা অতিবাহিত হওয়ার পর বেজে ওঠে। পরপর দুইবার অ্যালার্ম বাজার মধ্যবর্তী সময় ভিন্ন হতে পারে।
সঠিক অ্যালার্ম সেট করুন
সিস্টেমটি ভবিষ্যতে একটি নির্দিষ্ট মুহূর্তে একটি সুনির্দিষ্ট অ্যালার্ম বাজায়।
বেশিরভাগ অ্যাপই বিভিন্ন সাধারণ কাজ সম্পন্ন করার জন্য অনির্দিষ্ট অ্যালার্ম ব্যবহার করে টাস্ক ও ইভেন্ট শিডিউল করতে পারে। যদি আপনার অ্যাপের মূল কার্যকারিতা একটি সুনির্দিষ্ট সময়ের অ্যালার্মের উপর নির্ভর করে—যেমন কোনো অ্যালার্ম ক্লক অ্যাপ বা ক্যালেন্ডার অ্যাপের ক্ষেত্রে—তাহলে এর পরিবর্তে একটি নির্দিষ্ট সময়ের অ্যালার্ম ব্যবহার করা যেতে পারে।
ব্যবহারের ক্ষেত্র যেখানে সুনির্দিষ্ট অ্যালার্মের প্রয়োজন নাও হতে পারে
নিম্নলিখিত তালিকাটি সাধারণ কর্মপ্রবাহগুলি দেখায় যেগুলির জন্য একটি সুনির্দিষ্ট অ্যালার্মের প্রয়োজন নাও হতে পারে:
- আপনার অ্যাপের জীবনকাল জুড়ে অপারেশনগুলোর সময়সূচী নির্ধারণ করা
- আপনার অ্যাপ চালু থাকা অবস্থায়, প্রতি n সেকেন্ডে কিছু কাজ করার মতো টাইমিং অপারেশনগুলো পরিচালনা করার জন্য
Handlerক্লাসে কয়েকটি ভালো মেথড রয়েছে:postAtTime()এবংpostDelayed()। মনে রাখবেন যে, এই API-গুলো রিয়েল টাইমের উপর নয়, বরং সিস্টেম আপটাইমের উপর নির্ভর করে। - নির্ধারিত ব্যাকগ্রাউন্ড কাজ, যেমন আপনার অ্যাপ আপডেট করা এবং লগ আপলোড করা
-
WorkManagerসময়-সংবেদনশীল পর্যায়ক্রমিক কাজের সময়সূচী নির্ধারণের একটি উপায় প্রদান করে। আপনি কাজের জন্য সুনির্দিষ্ট কার্যকাল নির্ধারণ করতে একটি পুনরাবৃত্তি ব্যবধান এবংflexInterval(সর্বনিম্ন ১৫ মিনিট) প্রদান করতে পারেন। - ব্যবহারকারী-নির্দিষ্ট কাজ যা একটি নির্দিষ্ট সময় পরে হওয়া উচিত (সিস্টেম নিষ্ক্রিয় অবস্থায় থাকলেও)
- একটি অনির্দিষ্ট অ্যালার্ম ব্যবহার করুন। বিশেষত,
setAndAllowWhileIdle()কল করুন। - ব্যবহারকারী-নির্দিষ্ট কাজ যা একটি নির্দিষ্ট সময়ের পরে হওয়া উচিত।
- একটি অনির্দিষ্ট অ্যালার্ম ব্যবহার করুন। বিশেষত,
set()কল করুন। - ব্যবহারকারী-নির্দিষ্ট ক্রিয়া যা একটি নির্দিষ্ট সময়সীমার মধ্যে ঘটতে পারে।
- একটি অনির্দিষ্ট অ্যালার্ম ব্যবহার করুন। নির্দিষ্টভাবে,
setWindow()কল করুন। মনে রাখবেন, যদি আপনার অ্যাপটি অ্যান্ড্রয়েড ১২ বা তার উচ্চতর সংস্করণকে টার্গেট করে, তবে সর্বনিম্ন অনুমোদিত উইন্ডোর দৈর্ঘ্য হলো ১০ মিনিট।
সঠিক অ্যালার্ম সেট করার উপায়
আপনার অ্যাপ নিম্নলিখিত পদ্ধতিগুলোর যেকোনো একটি ব্যবহার করে সুনির্দিষ্ট অ্যালার্ম সেট করতে পারে। এই পদ্ধতিগুলো এমনভাবে সাজানো হয়েছে যে, তালিকার নিচের দিকের পদ্ধতিগুলো অধিক সময়-সংবেদনশীল কাজ সম্পাদন করে, কিন্তু এগুলোর জন্য বেশি সিস্টেম রিসোর্সের প্রয়োজন হয়।
-
setExact() অন্য কোনো ব্যাটারি সাশ্রয়ী ব্যবস্থা চালু না থাকলে, ভবিষ্যতের প্রায় একটি নির্দিষ্ট সময়ে অ্যালার্ম চালু করুন।
সুনির্দিষ্ট অ্যালার্ম সেট করতে এই পদ্ধতিটি ব্যবহার করুন, যদি না আপনার অ্যাপের কাজটি ব্যবহারকারীর জন্য সময়-সংবেদনশীল হয়।
-
setExactAndAllowWhileIdle() ব্যাটারি সাশ্রয়ের ব্যবস্থা চালু থাকলেও, ভবিষ্যতের প্রায় একটি সুনির্দিষ্ট সময়ে অ্যালার্ম বাজান।
-
setAlarmClock() ভবিষ্যতে একটি নির্দিষ্ট সময়ে অ্যালার্ম চালু করুন। যেহেতু এই অ্যালার্মগুলো ব্যবহারকারীদের কাছে অত্যন্ত দৃশ্যমান, তাই সিস্টেম এগুলোর প্রচারের সময় কখনো পরিবর্তন করে না। সিস্টেম এই অ্যালার্মগুলোকে সবচেয়ে গুরুত্বপূর্ণ হিসেবে চিহ্নিত করে এবং প্রয়োজনে অ্যালার্মগুলো প্রচারের জন্য লো-পাওয়ার মোড থেকে বেরিয়ে আসে।
সিস্টেম রিসোর্স ব্যবহার
যখন সিস্টেম আপনার অ্যাপের সেট করা নির্দিষ্ট অ্যালার্মগুলো চালু করে, তখন ডিভাইসটি প্রচুর পরিমাণে রিসোর্স, যেমন ব্যাটারি, খরচ করে, বিশেষ করে যদি এটি পাওয়ার-সেভিং মোডে থাকে। তাছাড়া, রিসোর্স আরও দক্ষতার সাথে ব্যবহার করার জন্য সিস্টেম এই অনুরোধগুলোকে সহজে একসাথে সম্পন্ন করতে পারে না।
যখনই সম্ভব, একটি অনির্দিষ্ট অ্যালার্ম তৈরি করার জন্য জোরালোভাবে সুপারিশ করা হচ্ছে। দীর্ঘ সময় ধরে কাজ করার জন্য, আপনার অ্যালার্মের BroadcastReceiver থেকে WorkManager বা JobScheduler ব্যবহার করে কাজটি শিডিউল করুন। ডিভাইসটি Doze মোডে থাকা অবস্থায় কাজ করার জন্য, setAndAllowWhileIdle() ব্যবহার করে একটি অনির্দিষ্ট অ্যালার্ম তৈরি করুন এবং সেই অ্যালার্ম থেকে একটি জব শুরু করুন।
যথাযথ সঠিক অ্যালার্ম অনুমতি ঘোষণা করুন।
আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১২ বা তার উচ্চতর সংস্করণকে টার্গেট করে, তবে আপনাকে অবশ্যই "Alarms & reminders" নামক বিশেষ অ্যাপ অ্যাক্সেসটি নিতে হবে। এটি করার জন্য, আপনার অ্যাপের ম্যানিফেস্ট ফাইলে SCHEDULE_EXACT_ALARM পারমিশনটি ডিক্লেয়ার করুন, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে:
<manifest ...> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/> <application ...> ... </application> </manifest>
আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১৩ (এপিআই লেভেল ৩৩) বা তার উচ্চতর সংস্করণকে টার্গেট করে, তাহলে আপনার কাছে 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 পারমিশনটি আগে থেকে দেওয়া থাকে না। যদি কোনো ব্যবহারকারী ব্যাকআপ-রিস্টোর অপারেশনের মাধ্যমে অ্যান্ড্রয়েড ১৪ চালিত কোনো ডিভাইসে অ্যাপ ডেটা স্থানান্তর করেন, তাহলে নতুন ডিভাইসটিতে SCHEDULE_EXACT_ALARM পারমিশনটি বাতিল হয়ে যাবে। তবে, যদি কোনো বিদ্যমান অ্যাপের এই পারমিশনটি আগে থেকেই থাকে, তাহলে ডিভাইসটি অ্যান্ড্রয়েড ১৪-এ আপগ্রেড করার সময় এটি আগে থেকেই মঞ্জুর করা হবে।
দ্রষ্টব্য : যদি setExact API-এর মতো কোনো OnAlarmListener অবজেক্ট ব্যবহার করে নির্দিষ্ট অ্যালার্ম সেট করা হয়, তাহলে 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 ব্রডকাস্টটি পাঠায়। আপনার অ্যাপে এমন একটি ব্রডকাস্ট রিসিভার ইমপ্লিমেন্ট করা উচিত যা নিম্নলিখিত কাজগুলো করে:
- এটি নিশ্চিত করে যে আপনার অ্যাপের এখনও বিশেষ অ্যাপ অ্যাক্সেস আছে। তা করার জন্য,
canScheduleExactAlarms()কল করুন। এই যাচাইকরণটি আপনার অ্যাপকে এমন পরিস্থিতি থেকে রক্ষা করে, যেখানে ব্যবহারকারী আপনার অ্যাপকে অনুমতি দেওয়ার প্রায় সাথে সাথেই তা প্রত্যাহার করে নেয়। - আপনার অ্যাপের বর্তমান অবস্থার উপর ভিত্তি করে, এর প্রয়োজনীয় নির্দিষ্ট অ্যালার্মগুলোর সময়সূচী পরিবর্তন করে। এই কার্যপ্রণালীটি আপনার অ্যাপ
ACTION_BOOT_COMPLETEDব্রডকাস্টটি গ্রহণ করার পর যা করে, তার অনুরূপ হওয়া উচিত।
ব্যবহারকারীদের SCHEDULE_EXACT_ALARM অনুমতিটি মঞ্জুর করতে বলুন।
প্রয়োজনে, আপনি ব্যবহারকারীদের সিস্টেম সেটিংস-এর অ্যালার্ম ও রিমাইন্ডার স্ক্রিনে পাঠাতে পারেন, যেমনটি চিত্র ১-এ দেখানো হয়েছে। এটি করার জন্য, নিম্নলিখিত ধাপগুলো সম্পন্ন করুন:
- আপনার অ্যাপের ইউজার ইন্টারফেসে ব্যবহারকারীকে ব্যাখ্যা করুন, কেন আপনার অ্যাপের নির্দিষ্ট সময়ে অ্যালার্ম নির্ধারণ করার প্রয়োজন রয়েছে।
- এমন একটি ইন্টেন্ট চালু করুন যাতে
ACTION_REQUEST_SCHEDULE_EXACT_ALARMইন্টেন্ট অ্যাকশনটি অন্তর্ভুক্ত রয়েছে।
একটি পুনরাবৃত্তিমূলক অ্যালার্ম সেট করুন
পুনরাবৃত্তিমূলক অ্যালার্ম সিস্টেমকে একটি নির্দিষ্ট সময়সূচী অনুযায়ী আপনার অ্যাপে বিজ্ঞপ্তি পাঠাতে সাহায্য করে।
ত্রুটিপূর্ণভাবে ডিজাইন করা অ্যালার্ম ব্যাটারির চার্জ দ্রুত শেষ করে দিতে পারে এবং সার্ভারগুলোর উপর উল্লেখযোগ্য চাপ সৃষ্টি করতে পারে। এই কারণে, অ্যান্ড্রয়েড ৪.৪ (এপিআই লেভেল ১৯) এবং এর পরবর্তী সংস্করণগুলোতে, সমস্ত পুনরাবৃত্তিমূলক অ্যালার্মই হলো অনির্দিষ্ট অ্যালার্ম ।
একটি পুনরাবৃত্তিমূলক অ্যালার্মের নিম্নলিখিত বৈশিষ্ট্য রয়েছে:
একটি অ্যালার্মের ধরণ। আরও আলোচনার জন্য, ‘অ্যালার্মের ধরণ নির্বাচন করুন ’ দেখুন।
একটি ট্রিগার সময়। আপনার নির্দিষ্ট করা ট্রিগার সময়টি যদি অতীতের হয়, তাহলে অ্যালার্মটি সঙ্গে সঙ্গে বেজে ওঠে।
অ্যালার্মের বিরতি। যেমন, দিনে একবার, প্রতি ঘণ্টায়, বা প্রতি ৫ মিনিটে।
একটি পেন্ডিং ইন্টেন্ট যা অ্যালার্ম ট্রিগার হলে সক্রিয় হয়। আপনি যখন একই পেন্ডিং ইন্টেন্ট ব্যবহার করে দ্বিতীয় একটি অ্যালার্ম সেট করেন, তখন এটি মূল অ্যালার্মটিকে প্রতিস্থাপন করে।
একটি 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 (ওয়াল ক্লক) সময় ব্যবহার করে। এর মানে হলো, সময়ের প্রবাহের উপর ভিত্তি করে অ্যালার্ম সেট করার জন্য (উদাহরণস্বরূপ, একটি অ্যালার্ম যা প্রতি ৩০ সেকেন্ডে বাজে) এলাপসড রিয়েল টাইম বেশি উপযুক্ত, কারণ এটি টাইম জোন বা লোকেল দ্বারা প্রভাবিত হয় না। যে অ্যালার্মগুলো বর্তমান লোকেলের উপর নির্ভরশীল, সেগুলোর জন্য রিয়েল টাইম ক্লক বেশি উপযোগী।
উভয় প্রকারেরই একটি "ওয়েকআপ" সংস্করণ রয়েছে, যা স্ক্রিন বন্ধ থাকলে ডিভাইসের সিপিইউকে জাগিয়ে তোলে। এটি নিশ্চিত করে যে অ্যালার্মটি নির্ধারিত সময়ে বাজবে। আপনার অ্যাপের যদি সময়ের উপর নির্ভরতা থাকে, তবে এটি কার্যকর। উদাহরণস্বরূপ, যদি কোনো নির্দিষ্ট কাজ করার জন্য অ্যাপটির একটি সীমিত সময় থাকে। আপনি যদি আপনার অ্যালার্মের ওয়েকআপ সংস্করণটি ব্যবহার না করেন, তাহলে সমস্ত পুনরাবৃত্তিমূলক অ্যালার্ম আপনার ডিভাইসটি পরবর্তীবার চালু হলে বেজে উঠবে।
আপনার যদি কেবল একটি নির্দিষ্ট বিরতিতে (উদাহরণস্বরূপ, প্রতি আধ ঘণ্টা পর পর) অ্যালার্ম বাজার প্রয়োজন হয়, তাহলে অতিবাহিত রিয়েল টাইম টাইপগুলোর মধ্যে একটি ব্যবহার করুন। সাধারণভাবে, এটিই উত্তম বিকল্প।
দিনের একটি নির্দিষ্ট সময়ে আপনার অ্যালার্ম বাজার প্রয়োজন হলে, ঘড়ি-ভিত্তিক রিয়েল টাইম ক্লক টাইপগুলোর মধ্যে একটি বেছে নিন। তবে মনে রাখবেন, এই পদ্ধতির কিছু অসুবিধা থাকতে পারে। অ্যাপটি অন্যান্য লোকাল-এ ভালোভাবে কাজ নাও করতে পারে, এবং ব্যবহারকারী যদি ডিভাইসের সময় সেটিং পরিবর্তন করেন, তবে তা আপনার অ্যাপে অপ্রত্যাশিত আচরণ ঘটাতে পারে। উপরে যেমন আলোচনা করা হয়েছে, রিয়েল টাইম ক্লক অ্যালার্ম টাইপ ব্যবহার করা স্কেল করার ক্ষেত্রেও সুবিধাজনক নয়। সম্ভব হলে আমরা আপনাকে একটি "এল্যাপসড রিয়েল টাইম" অ্যালার্ম ব্যবহার করার পরামর্শ দিই।
এখানে প্রকারগুলোর তালিকা দেওয়া হলো:
ELAPSED_REALTIME: ডিভাইসটি বুট হওয়ার পর থেকে অতিবাহিত সময়ের উপর ভিত্তি করে পেন্ডিং ইন্টেন্টটি ফায়ার করে, কিন্তু ডিভাইসটিকে জাগিয়ে তোলে না। এই অতিবাহিত সময়ের মধ্যে ডিভাইসটি স্লিপ মোডে থাকা যেকোনো সময়ও অন্তর্ভুক্ত থাকে।ELAPSED_REALTIME_WAKEUP: ডিভাইস বুট হওয়ার পর নির্দিষ্ট সময় অতিবাহিত হলে ডিভাইসটিকে জাগিয়ে তোলে এবং অপেক্ষাধীন ইন্টেন্টটি কার্যকর করে।RTC: নির্দিষ্ট সময়ে অপেক্ষারত ইন্টেন্টটি সক্রিয় করে, কিন্তু ডিভাইসটিকে জাগিয়ে তোলে না।RTC_WAKEUP: নির্দিষ্ট সময়ে অপেক্ষমান ইন্টেন্টটি কার্যকর করার জন্য ডিভাইসটিকে জাগিয়ে তোলে।
অতিক্রান্ত রিয়েল টাইম অ্যালার্মের উদাহরণ
ELAPSED_REALTIME_WAKEUP ব্যবহারের কিছু উদাহরণ নিচে দেওয়া হলো।
৩০ মিনিট পর এবং এরপর প্রতি ৩০ মিনিট পর পর অ্যালার্ম বাজানোর জন্য ডিভাইসটি চালু করুন:
কোটলিন
// 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 ব্যবহারের কিছু উদাহরণ নিচে দেওয়া হলো।
আনুমানিক দুপুর ২:০০ টায় অ্যালার্ম বাজানোর জন্য ডিভাইসটি চালু করুন এবং প্রতিদিন একই সময়ে একবার এর পুনরাবৃত্তি করুন:
কোটলিন
// 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() হলো সঠিক পছন্দ। আপনি যখন এই পদ্ধতিটি ব্যবহার করেন, অ্যান্ড্রয়েড একাধিক ইনএকজ্যাক্ট রিপিটিং অ্যালার্মকে সিঙ্ক্রোনাইজ করে এবং সেগুলোকে একই সময়ে চালু করে। এতে ব্যাটারির ব্যবহার কমে যায়।
সম্ভব হলে সুনির্দিষ্ট অ্যালার্ম ব্যবহার করা এড়িয়ে চলুন। তবে, এমন কিছু বিরল অ্যাপের ক্ষেত্রে যেখানে কঠোর সময়ের বাধ্যবাধকতা থাকে, সেখানে আপনি 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 তার কাজ চালিয়ে যাবে।
ধাপগুলো হলো:
আপনার অ্যাপ্লিকেশনের ম্যানিফেস্টে
RECEIVE_BOOT_COMPLETEDপারমিশনটি সেট করুন। এটি আপনার অ্যাপকে সিস্টেমের বুটিং শেষ হওয়ার পরে সম্প্রচারিতACTION_BOOT_COMPLETEDগ্রহণ করার সুযোগ দেয় (এটি কেবল তখনই কাজ করে যদি অ্যাপটি ব্যবহারকারী দ্বারা ইতিমধ্যে অন্তত একবার চালু করা হয়ে থাকে):<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>ব্রডকাস্ট গ্রহণ করার জন্য একটি
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. } } }
আপনার অ্যাপের ম্যানিফেস্ট ফাইলে
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);
ডিভাইসটি ডোজ মোডে থাকাকালীন অ্যালার্ম চালু করুন।
অ্যান্ড্রয়েড ৬.০ (এপিআই লেভেল ২৩) চালিত ডিভাইসগুলো ডোজ মোড সমর্থন করে, যা ডিভাইসের ব্যাটারির আয়ু বাড়াতে সাহায্য করে। ডিভাইসটি ডোজ মোডে থাকলে কোনো অ্যালার্ম বাজে না। ডিভাইসটি ডোজ মোড থেকে বেরিয়ে না আসা পর্যন্ত যেকোনো নির্ধারিত অ্যালার্ম স্থগিত থাকে। ডিভাইসটি নিষ্ক্রিয় থাকা অবস্থাতেও যদি আপনার কাজ শেষ করার প্রয়োজন হয়, তবে বেশ কিছু বিকল্প রয়েছে:
একটি সঠিক অ্যালার্ম সেট করুন।
ব্যাকগ্রাউন্ডে কাজ করার জন্য তৈরি WorkManager API ব্যবহার করুন। আপনি সিস্টেমকে আপনার কাজ দ্রুত সম্পন্ন করার নির্দেশ দিতে পারেন, যাতে কাজটি যত তাড়াতাড়ি সম্ভব শেষ হয়। আরও তথ্যের জন্য, WorkManager দিয়ে টাস্ক শিডিউল করুন দেখুন।
সর্বোত্তম অনুশীলন
আপনার রিপিটিং অ্যালার্ম ডিজাইন করার ক্ষেত্রে আপনার প্রতিটি সিদ্ধান্তের প্রভাব পড়তে পারে যে আপনার অ্যাপ কীভাবে সিস্টেম রিসোর্স ব্যবহার (বা অপব্যবহার) করে। উদাহরণস্বরূপ, একটি জনপ্রিয় অ্যাপের কথা ভাবুন যা একটি সার্ভারের সাথে সিঙ্ক করে। যদি সিঙ্ক প্রক্রিয়াটি ঘড়ির সময়ের উপর ভিত্তি করে হয় এবং অ্যাপটির প্রতিটি ইনস্ট্যান্স রাত ১১:০০ টায় সিঙ্ক করে, তাহলে সার্ভারের উপর অতিরিক্ত চাপের ফলে উচ্চ ল্যাটেন্সি বা এমনকি "ডিনায়াল অফ সার্ভিস" হতে পারে। অ্যালার্ম ব্যবহারের ক্ষেত্রে এই সেরা অনুশীলনগুলো অনুসরণ করুন:
পুনরাবৃত্ত অ্যালার্মের ফলে ট্রিগার হওয়া যেকোনো নেটওয়ার্ক অনুরোধে এলোমেলোভাব (জিটার) যোগ করুন:
অ্যালার্ম বেজে উঠলে যেকোনো স্থানীয় কাজ করুন। "স্থানীয় কাজ" বলতে এমন যেকোনো কিছু বোঝায় যা কোনো সার্ভারকে অ্যাক্সেস করে না বা সার্ভার থেকে ডেটার প্রয়োজন হয় না।
একই সাথে, নেটওয়ার্ক অনুরোধগুলো সম্বলিত অ্যালার্মটি একটি এলোমেলো সময়ে বেজে ওঠার জন্য সময়সূচী নির্ধারণ করুন।
আপনার অ্যালার্মের পুনরাবৃত্তি সর্বনিম্ন রাখুন।
অপ্রয়োজনে ডিভাইসটি চালু করবেন না (এই আচরণটি অ্যালার্মের ধরন দ্বারা নির্ধারিত হয়, যেমনটি "অ্যালার্মের ধরন নির্বাচন করুন " অংশে বর্ণনা করা হয়েছে)।
আপনার অ্যালার্ম বাজার সময়কে যতটা না হলেই নয়, তার চেয়ে বেশি সুনির্দিষ্ট করবেন না।
setRepeating()setInexactRepeating()ব্যবহার করুন। আপনি যখনsetInexactRepeating()ব্যবহার করেন, তখন অ্যান্ড্রয়েড একাধিক অ্যাপের পুনরাবৃত্তিমূলক অ্যালার্মগুলোকে সিঙ্ক্রোনাইজ করে এবং একই সময়ে সেগুলোকে বাজায়। এর ফলে সিস্টেমকে ডিভাইসটিকে জাগিয়ে তোলার মোট সংখ্যা কমে যায়, যার ফলে ব্যাটারির চার্জ কম খরচ হয়। অ্যান্ড্রয়েড ৪.৪ (এপিআই লেভেল ১৯) থেকে, সমস্ত পুনরাবৃত্তিমূলক অ্যালার্মই ইনএকজ্যাক্ট অ্যালার্ম (inexact alarm ) হিসেবে গণ্য হয়। মনে রাখবেন যে, যদিওsetInexactRepeating()হলোsetRepeating()এর চেয়ে একটি উন্নত সংস্করণ, তবুও যদি কোনো অ্যাপের প্রতিটি ইনস্ট্যান্স প্রায় একই সময়ে সার্ভারে হিট করে, তবে এটি সার্ভারকে ওভারলোড করতে পারে। তাই, নেটওয়ার্ক রিকোয়েস্টের জন্য, পূর্বে আলোচিত পদ্ধতি অনুযায়ী আপনার অ্যালার্মগুলোতে কিছুটা র্যান্ডমনেস (randomness) যোগ করুন।সম্ভব হলে ঘড়ির সময় অনুযায়ী অ্যালার্ম দেওয়া এড়িয়ে চলুন।
একটি সুনির্দিষ্ট ট্রিগার সময়ের উপর ভিত্তি করে পুনরাবৃত্তিমূলক অ্যালার্মগুলো স্কেল করার ক্ষেত্রে ভালোভাবে কাজ করে না। সম্ভব হলে
ELAPSED_REALTIMEব্যবহার করুন। বিভিন্ন ধরনের অ্যালার্ম সম্পর্কে পরবর্তী বিভাগে আরও বিস্তারিতভাবে বর্ণনা করা হয়েছে।