AlarmManager ক্লাসের উপর ভিত্তি করে) আপনাকে আপনার অ্যাপ্লিকেশনের জীবনকালের বাইরে সময়-ভিত্তিক ক্রিয়াকলাপ সম্পাদন করার একটি উপায় দেয়। উদাহরণস্বরূপ, আপনি দীর্ঘমেয়াদী ক্রিয়াকলাপ শুরু করার জন্য একটি অ্যালার্ম ব্যবহার করতে পারেন, যেমন আবহাওয়ার পূর্বাভাস ডাউনলোড করার জন্য দিনে একবার পরিষেবা শুরু করা।অ্যালার্মগুলির নিম্নলিখিত বৈশিষ্ট্য রয়েছে:
তারা আপনাকে নির্দিষ্ট সময় এবং/অথবা বিরতিতে Intents চালু করতে দেয়।
আপনি এগুলিকে ব্রডকাস্ট রিসিভারের সাথে কাজ নির্ধারণের জন্য অথবা অন্যান্য ক্রিয়াকলাপ সম্পাদনের জন্য WorkRequests-এর সাথে ব্যবহার করতে পারেন।
এগুলি আপনার অ্যাপ্লিকেশনের বাইরে কাজ করে, তাই আপনার অ্যাপটি চলমান না থাকলেও এবং ডিভাইসটি ঘুমন্ত অবস্থায় থাকলেও আপনি ইভেন্ট বা অ্যাকশন ট্রিগার করতে এগুলি ব্যবহার করতে পারেন।
এগুলো আপনার অ্যাপের রিসোর্সের প্রয়োজনীয়তা কমাতে সাহায্য করে। টাইমার বা ক্রমাগত পরিষেবা চালানোর উপর নির্ভর না করেই আপনি অপারেশনের সময়সূচী নির্ধারণ করতে পারেন।
একটি অযৌক্তিক অ্যালার্ম সেট করুন
যখন কোনও অ্যাপ একটি ভুল অ্যালার্ম সেট করে, তখন সিস্টেমটি ভবিষ্যতের কোনও এক সময়ে অ্যালার্মটি সরবরাহ করে। ভুল অ্যালার্মগুলি Doze এর মতো ব্যাটারি-সাশ্রয়ী বিধিনিষেধগুলিকে সম্মান করে অ্যালার্ম সরবরাহের সময় সম্পর্কে কিছু গ্যারান্টি প্রদান করে।
ডেভেলপাররা অযৌক্তিক অ্যালার্ম ডেলিভারির সময় কাস্টমাইজ করার জন্য নিম্নলিখিত API গ্যারান্টিগুলি ব্যবহার করতে পারেন।
নির্দিষ্ট সময়ের পরে একটি অ্যালার্ম সরবরাহ করুন
যদি আপনার অ্যাপটি set() , setInexactRepeating() , অথবা setAndAllowWhileIdle() কল করে, তাহলে সরবরাহিত ট্রিগার সময়ের আগে অ্যালার্ম কখনই বন্ধ হয় না।
অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) এবং তার উচ্চতর সংস্করণে, সিস্টেমটি সরবরাহিত ট্রিগার সময়ের এক ঘন্টার মধ্যে অ্যালার্ম চালু করে, যদি না ব্যাটারি সেভার বা ডোজের মতো কোনও ব্যাটারি-সাশ্রয়ী বিধিনিষেধ কার্যকর থাকে।
নির্দিষ্ট সময়সীমার মধ্যে একটি অ্যালার্ম সরবরাহ করুন
যদি আপনার অ্যাপটি setWindow() কল করে, তাহলে সরবরাহিত ট্রিগার সময়ের আগে অ্যালার্ম কখনই বন্ধ হয় না। যদি না কোনও ব্যাটারি-সাশ্রয়ী বিধিনিষেধ কার্যকর থাকে, তাহলে অ্যালার্মটি নির্দিষ্ট সময় উইন্ডোর মধ্যে সরবরাহ করা হয়, প্রদত্ত ট্রিগার সময় থেকে শুরু করে।
যদি আপনার অ্যাপটি Android 12 বা তার পরবর্তী ভার্সনকে টার্গেট করে, তাহলে সিস্টেমটি টাইম-উইন্ডোড ইনএক্সাক্ট অ্যালার্মের আওতা কমপক্ষে 10 মিনিট বিলম্বিত করতে পারে। এই কারণে, windowLengthMillis প্যারামিটারের মান 600000 এর নিচে 600000 এ ক্লিপ করা হয়।
মোটামুটি নিয়মিত বিরতিতে একটি পুনরাবৃত্তিমূলক অ্যালার্ম সরবরাহ করুন
যদি আপনার অ্যাপটি setInexactRepeating() কল করে, তাহলে সিস্টেমটি একাধিক অ্যালার্ম চালু করবে:
- প্রথম অ্যালার্মটি নির্দিষ্ট সময়সীমার মধ্যে বেজে ওঠে, প্রদত্ত ট্রিগার সময় থেকে শুরু করে।
- পরবর্তী অ্যালার্মগুলি সাধারণত নির্দিষ্ট সময়সীমা পার হওয়ার পরে বন্ধ হয়ে যায়। অ্যালার্মের পরপর দুটি আহ্বানের মধ্যে সময় পরিবর্তিত হতে পারে।
একটি সঠিক অ্যালার্ম সেট করুন
ভবিষ্যতের একটি নির্দিষ্ট মুহূর্তে সিস্টেমটি একটি সঠিক অ্যালার্ম ডেকে আনে।
বেশিরভাগ অ্যাপই বেশ কিছু সাধারণ ব্যবহারের ক্ষেত্রে সঠিক অ্যালার্ম ব্যবহার করে কাজ এবং ইভেন্টের সময়সূচী নির্ধারণ করতে পারে। যদি আপনার অ্যাপের মূল কার্যকারিতা একটি নির্দিষ্ট সময়ের অ্যালার্মের উপর নির্ভর করে—যেমন একটি অ্যালার্ম ঘড়ি অ্যাপ বা একটি ক্যালেন্ডার অ্যাপের জন্য—তাহলে পরিবর্তে একটি সঠিক অ্যালার্ম ব্যবহার করা ঠিক আছে।
এমন কেস ব্যবহার করুন যেখানে সঠিক অ্যালার্মের প্রয়োজন নাও হতে পারে
নিম্নলিখিত তালিকাটি এমন সাধারণ কর্মপ্রবাহ দেখায় যার জন্য সঠিক অ্যালার্মের প্রয়োজন নাও হতে পারে:
- আপনার অ্যাপের জীবদ্দশায় সময় নির্ধারণের সময় নির্ধারণ করা
-
Handlerক্লাসে টাইমিং অপারেশন পরিচালনা করার জন্য বেশ কয়েকটি ভালো পদ্ধতি রয়েছে, যেমন আপনার অ্যাপটি সক্রিয় থাকাকালীন প্রতি n সেকেন্ডে কিছু কাজ করা:postAtTime()এবংpostDelayed()। মনে রাখবেন যে এই APIগুলি রিয়েল টাইমের উপর নয় বরং সিস্টেম আপটাইমের উপর নির্ভর করে। - নির্ধারিত ব্যাকগ্রাউন্ড কাজ, যেমন আপনার অ্যাপ আপডেট করা এবং লগ আপলোড করা
-
WorkManagerসময়-সংবেদনশীল পর্যায়ক্রমিক কাজের সময়সূচী নির্ধারণের একটি উপায় প্রদান করে। কাজের জন্য গ্রানুলার রানটাইম নির্ধারণ করতে আপনি একটি পুনরাবৃত্তি ব্যবধান এবংflexInterval(সর্বনিম্ন 15 মিনিট) প্রদান করতে পারেন। - ব্যবহারকারী-নির্দিষ্ট ক্রিয়া যা একটি নির্দিষ্ট সময়ের পরে হওয়া উচিত (যদিও সিস্টেমটি নিষ্ক্রিয় অবস্থায় থাকে)
- একটি অস্পষ্ট অ্যালার্ম ব্যবহার করুন। বিশেষ করে,
setAndAllowWhileIdle()কল করুন। - ব্যবহারকারী-নির্দিষ্ট ক্রিয়া যা একটি নির্দিষ্ট সময়ের পরে হওয়া উচিত
- একটি অযৌক্তিক অ্যালার্ম ব্যবহার করুন। বিশেষ করে, কল
set()। - ব্যবহারকারী-নির্দিষ্ট ক্রিয়া যা একটি নির্দিষ্ট সময়ের মধ্যে ঘটতে পারে
- একটি অস্পষ্ট অ্যালার্ম ব্যবহার করুন। বিশেষ করে,
setWindow()কল করুন। মনে রাখবেন, যদি আপনার অ্যাপটি Android 12 বা তার উচ্চতর ভার্সনকে টার্গেট করে, তাহলে সর্বনিম্ন অনুমোদিত উইন্ডো দৈর্ঘ্য হল 10 মিনিট।
সঠিক অ্যালার্ম সেট করার উপায়
আপনার অ্যাপটি নিম্নলিখিত পদ্ধতিগুলির মধ্যে একটি ব্যবহার করে সঠিক অ্যালার্ম সেট করতে পারে। এই পদ্ধতিগুলি এমনভাবে সাজানো হয়েছে যাতে তালিকার নীচের দিকের পদ্ধতিগুলি বেশি সময়সাপেক্ষ কাজ করে তবে আরও সিস্টেম রিসোর্সের প্রয়োজন হয়।
-
setExact() ভবিষ্যতে প্রায় সুনির্দিষ্ট সময়ে একটি অ্যালার্ম বাজান, যতক্ষণ না অন্যান্য ব্যাটারি-সাশ্রয়ী ব্যবস্থা কার্যকর হয়।
আপনার অ্যাপের কাজ ব্যবহারকারীর জন্য সময়-সমালোচনামূলক না হলে, সঠিক অ্যালার্ম সেট করতে এই পদ্ধতিটি ব্যবহার করুন।
-
setExactAndAllowWhileIdle() ভবিষ্যতে প্রায় সঠিক সময়ে একটি অ্যালার্ম বাজান, এমনকি যদি ব্যাটারি সাশ্রয়ের ব্যবস্থা কার্যকর থাকে।
-
setAlarmClock() ভবিষ্যতে একটি নির্দিষ্ট সময়ে একটি অ্যালার্ম চালু করুন। যেহেতু এই অ্যালার্মগুলি ব্যবহারকারীদের কাছে অত্যন্ত দৃশ্যমান, তাই সিস্টেম কখনই তাদের ডেলিভারি সময় সামঞ্জস্য করে না। সিস্টেম এই অ্যালার্মগুলিকে সবচেয়ে গুরুত্বপূর্ণ হিসাবে চিহ্নিত করে এবং প্রয়োজনে অ্যালার্মগুলি সরবরাহ করার জন্য কম-পাওয়ার মোড ছেড়ে দেয়।
সিস্টেম রিসোর্স খরচ
যখন সিস্টেমটি আপনার অ্যাপের সেট করা সঠিক অ্যালার্মগুলি ট্রিগার করে, তখন ডিভাইসটি প্রচুর পরিমাণে রিসোর্স খরচ করে, যেমন ব্যাটারি লাইফ, বিশেষ করে যদি এটি পাওয়ার-সেভিং মোডে থাকে। তদুপরি, রিসোর্সগুলিকে আরও দক্ষতার সাথে ব্যবহার করার জন্য সিস্টেমটি সহজেই এই অনুরোধগুলিকে ব্যাচ করতে পারে না।
যখনই সম্ভব একটি অযৌক্তিক অ্যালার্ম তৈরি করা অত্যন্ত বাঞ্ছনীয়। দীর্ঘ সময় ধরে কাজ করার জন্য, আপনার অ্যালার্মের BroadcastReceiver থেকে WorkManager বা JobScheduler ব্যবহার করে এটির সময়সূচী করুন। ডিভাইসটি Doze-এ থাকাকালীন কাজ করার জন্য, setAndAllowWhileIdle() ব্যবহার করে একটি অযৌক্তিক অ্যালার্ম তৈরি করুন এবং অ্যালার্ম থেকে একটি কাজ শুরু করুন।
যথাযথ সঠিক অ্যালার্ম অনুমতি ঘোষণা করুন
যদি আপনার অ্যাপটি অ্যান্ড্রয়েড ১২ বা তার পরবর্তী ভার্সনের জন্য উপযুক্ত হয়, তাহলে আপনাকে "অ্যালার্ম এবং রিমাইন্ডার" এর বিশেষ অ্যাপ অ্যাক্সেস পেতে হবে। এটি করার জন্য, আপনার অ্যাপের ম্যানিফেস্ট ফাইলে 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
- ব্যবহারকারী কর্তৃক অনুমোদিত
- ব্যবহারের বিস্তৃত পরিসর
- অ্যাপগুলিকে নিশ্চিত করতে হবে যে অনুমতি প্রত্যাহার করা হয়নি।
Android 13 (API লেভেল 33) এবং তার বেশি ভার্সনের জন্য নতুন করে ইনস্টল করা অ্যাপের ক্ষেত্রে SCHEDULE_EXACT_ALARM অনুমতি আগে থেকে দেওয়া হয় না। যদি কোনও ব্যবহারকারী ব্যাকআপ-এন্ড-রিস্টোর অপারেশনের মাধ্যমে 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 সম্প্রচার পাঠায়। আপনার অ্যাপের এমন একটি সম্প্রচার রিসিভার প্রয়োগ করা উচিত যা নিম্নলিখিত কাজগুলি করে:
- নিশ্চিত করে যে আপনার অ্যাপটিতে এখনও বিশেষ অ্যাপ অ্যাক্সেস আছে। এটি করার জন্য,
canScheduleExactAlarms()কল করুন। এই চেকটি আপনার অ্যাপটিকে সেই পরিস্থিতি থেকে রক্ষা করে যেখানে ব্যবহারকারী আপনার অ্যাপটিকে অনুমতি দেয় এবং তারপর প্রায় সাথে সাথেই তা প্রত্যাহার করে। - আপনার অ্যাপের বর্তমান অবস্থার উপর ভিত্তি করে, প্রয়োজনীয় যেকোনো সঠিক অ্যালার্ম পুনঃনির্ধারণ করে। এই লজিকটি
ACTION_BOOT_COMPLETEDসম্প্রচার গ্রহণ করার সময় আপনার অ্যাপ যা করে তার অনুরূপ হওয়া উচিত।
ব্যবহারকারীদের SCHEDULE_EXACT_ALARM অনুমতি দিতে বলুন।
প্রয়োজনে, আপনি ব্যবহারকারীদের সিস্টেম সেটিংসে অ্যালার্ম এবং রিমাইন্ডার স্ক্রিনে পাঠাতে পারেন, যেমনটি চিত্র ১-এ দেখানো হয়েছে। এটি করার জন্য, নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন:
- আপনার অ্যাপের UI-তে, ব্যবহারকারীকে ব্যাখ্যা করুন কেন আপনার অ্যাপকে সঠিক অ্যালার্ম নির্ধারণ করতে হবে।
-
ACTION_REQUEST_SCHEDULE_EXACT_ALARMইন্টেন্ট অ্যাকশন অন্তর্ভুক্ত এমন একটি ইন্টেন্ট চালু করুন।
পুনরাবৃত্তিমূলক অ্যালার্ম সেট করুন
পুনরাবৃত্তিমূলক অ্যালার্ম সিস্টেমকে আপনার অ্যাপকে একটি পুনরাবৃত্ত সময়সূচীতে অবহিত করার অনুমতি দেয়।
একটি খারাপভাবে ডিজাইন করা অ্যালার্ম ব্যাটারির চার্জ শেষ করে দিতে পারে এবং সার্ভারের উপর উল্লেখযোগ্য চাপ সৃষ্টি করতে পারে। এই কারণে, অ্যান্ড্রয়েড ৪.৪ (এপিআই লেভেল ১৯) এবং তার উচ্চতর সংস্করণে, সমস্ত পুনরাবৃত্তিমূলক অ্যালার্মই সঠিক অ্যালার্ম নয় ।
একটি পুনরাবৃত্ত অ্যালার্মের নিম্নলিখিত বৈশিষ্ট্যগুলি রয়েছে:
একটি অ্যালার্মের ধরণ। আরও আলোচনার জন্য, একটি অ্যালার্মের ধরণ চয়ন করুন দেখুন।
একটি ট্রিগার সময়। যদি আপনার নির্দিষ্ট করা ট্রিগার সময় অতীতের হয়, তাহলে অ্যালার্মটি অবিলম্বে ট্রিগার হবে।
অ্যালার্মের ব্যবধান। উদাহরণস্বরূপ, দিনে একবার, প্রতি ঘন্টায়, অথবা প্রতি ৫ মিনিটে।
একটি পেন্ডিং ইন্টেন্ট যা অ্যালার্ম ট্রিগার করার সময় চালু হয়। যখন আপনি একই পেন্ডিং ইন্টেন্ট ব্যবহার করে দ্বিতীয় অ্যালার্ম সেট করেন, তখন এটি মূল অ্যালার্মটি প্রতিস্থাপন করে।
একটি PendingIntent() বাতিল করতে, FLAG_NO_CREATE কে PendingIntent.getService() এ পাস করুন যাতে ইনটেন্টের একটি ইনস্ট্যান্স পাওয়া যায় (যদি এটি বিদ্যমান থাকে), তারপর সেই ইনটেন্টটি 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 সেকেন্ডে বাজানো একটি অ্যালার্ম) কারণ এটি সময় অঞ্চল বা লোকেল দ্বারা প্রভাবিত হয় না। রিয়েল টাইম ক্লক টাইপ বর্তমান লোকেলের উপর নির্ভরশীল অ্যালার্মগুলির জন্য আরও উপযুক্ত।
উভয় ধরণেরই একটি "ওয়েকআপ" সংস্করণ রয়েছে, যার অর্থ হল স্ক্রিন বন্ধ থাকলে ডিভাইসের সিপিইউ জাগিয়ে তোলা। এটি নিশ্চিত করে যে অ্যালার্ম নির্ধারিত সময়ে বাজবে। আপনার অ্যাপের সময় নির্ভরতা থাকলে এটি কার্যকর। উদাহরণস্বরূপ, যদি কোনও নির্দিষ্ট ক্রিয়াকলাপ সম্পাদনের জন্য এটির একটি সীমিত উইন্ডো থাকে। আপনি যদি আপনার অ্যালার্ম ধরণের ওয়েকআপ সংস্করণ ব্যবহার না করেন, তাহলে আপনার ডিভাইসটি পরবর্তী জাগানোর সময় সমস্ত পুনরাবৃত্তিমূলক অ্যালার্ম বাজবে।
যদি আপনার অ্যালার্মটি নির্দিষ্ট সময়ের ব্যবধানে (যেমন, প্রতি আধ ঘন্টা অন্তর) বাজতে হয়, তাহলে অতিবাহিত রিয়েল টাইম প্রকারগুলির মধ্যে একটি ব্যবহার করুন। সাধারণভাবে, এটিই ভালো পছন্দ।
যদি আপনার দিনের কোনও নির্দিষ্ট সময়ে অ্যালার্ম বাজানোর প্রয়োজন হয়, তাহলে ঘড়ি-ভিত্তিক রিয়েল টাইম ক্লক ধরণের যেকোনো একটি বেছে নিন। তবে মনে রাখবেন, এই পদ্ধতির কিছু অসুবিধা থাকতে পারে। অ্যাপটি অন্যান্য লোকেলে ভালোভাবে অনুবাদ নাও করতে পারে এবং ব্যবহারকারী যদি ডিভাইসের সময় সেটিং পরিবর্তন করে, তাহলে এটি আপনার অ্যাপে অপ্রত্যাশিত আচরণের কারণ হতে পারে। উপরে আলোচনা করা হয়েছে, রিয়েল টাইম ক্লক অ্যালার্ম টাইপ ব্যবহার করলেও ভালোভাবে স্কেল হয় না। আমরা সুপারিশ করছি যে আপনি যদি পারেন তাহলে "ইলাপসড রিয়েল টাইম" অ্যালার্ম ব্যবহার করুন।
এখানে প্রকারের তালিকা দেওয়া হল:
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() হল সঠিক পছন্দ। আপনি যখন এই পদ্ধতিটি ব্যবহার করেন, তখন 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 ব্যবহারকারীকে ম্যানুয়ালি অ্যালার্মটি পুনরায় চালু না করেই তার কাজ চালিয়ে যাবে।
এখানে পদক্ষেপগুলি দেওয়া হল:
আপনার অ্যাপ্লিকেশনের ম্যানিফেস্টে
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);
ডিভাইসটি Doze মোডে থাকাকালীন অ্যালার্ম চালু করুন
অ্যান্ড্রয়েড ৬.০ (এপিআই লেভেল ২৩) চালিত ডিভাইসগুলিতে ডোজ মোড সমর্থন করে, যা ডিভাইসের ব্যাটারির আয়ু বাড়াতে সাহায্য করে। ডিভাইসটি ডোজ মোডে থাকাকালীন অ্যালার্ম বাজে না। ডিভাইসটি ডোজ থেকে বেরিয়ে না আসা পর্যন্ত যেকোনো নির্ধারিত অ্যালার্ম স্থগিত রাখা হয়। ডিভাইসটি নিষ্ক্রিয় থাকা অবস্থায়ও যদি আপনার কাজ সম্পূর্ণ করার প্রয়োজন হয়, তাহলে বেশ কয়েকটি বিকল্প উপলব্ধ:
একটি সঠিক অ্যালার্ম সেট করুন।
WorkManager API ব্যবহার করুন, যা ব্যাকগ্রাউন্ডের কাজ সম্পাদনের জন্য তৈরি। আপনি নির্দেশ করতে পারেন যে সিস্টেমটি আপনার কাজ দ্রুততর করবে যাতে কাজটি যত তাড়াতাড়ি সম্ভব শেষ হয়। আরও তথ্যের জন্য, WorkManager দিয়ে কাজগুলি নির্ধারণ করুন দেখুন।
সেরা অনুশীলন
আপনার পুনরাবৃত্তিমূলক অ্যালার্ম ডিজাইন করার সময় আপনার প্রতিটি সিদ্ধান্তের ফলে আপনার অ্যাপটি কীভাবে সিস্টেম রিসোর্স ব্যবহার করে (অথবা অপব্যবহার করে) তার উপর প্রভাব পড়তে পারে। উদাহরণস্বরূপ, একটি জনপ্রিয় অ্যাপ কল্পনা করুন যা একটি সার্ভারের সাথে সিঙ্ক করে। যদি সিঙ্ক অপারেশনটি ঘড়ির সময়ের উপর ভিত্তি করে হয় এবং অ্যাপের প্রতিটি উদাহরণ রাত ১১:০০ টায় সিঙ্ক হয়, তাহলে সার্ভারে লোডের ফলে উচ্চ বিলম্ব বা এমনকি "পরিষেবা অস্বীকার" হতে পারে। অ্যালার্ম ব্যবহারের জন্য এই সেরা অনুশীলনগুলি অনুসরণ করুন:
পুনরাবৃত্তিমূলক অ্যালার্মের ফলে যে কোনও নেটওয়ার্ক অনুরোধ ট্রিগার হয় তাতে এলোমেলোতা (জিটার) যোগ করুন:
অ্যালার্ম বাজলে যেকোনো স্থানীয় কাজ করুন। "স্থানীয় কাজ" বলতে এমন যেকোনো কিছু বোঝায় যা সার্ভারে আঘাত করে না বা সার্ভার থেকে ডেটার প্রয়োজন হয় না।
একই সময়ে, নেটওয়ার্কের অনুরোধগুলি নির্দিষ্ট সময়ে বাজানোর জন্য অ্যালার্মটি নির্ধারণ করুন।
আপনার অ্যালার্মের ফ্রিকোয়েন্সি সর্বনিম্ন রাখুন।
অপ্রয়োজনীয়ভাবে ডিভাইসটি জাগিয়ে তুলবেন না (এই আচরণটি অ্যালার্মের ধরণ দ্বারা নির্ধারিত হয়, যেমনটি "একটি অ্যালার্মের ধরণ নির্বাচন করুন" বিভাগে বর্ণিত হয়েছে)।
আপনার অ্যালার্মের ট্রিগার সময়কে যতটা সুনির্দিষ্ট করা উচিত তার চেয়ে বেশি সুনির্দিষ্ট করবেন না।
setRepeating()এর পরিবর্তেsetInexactRepeating()ব্যবহার করুন। যখন আপনিsetInexactRepeating()ব্যবহার করেন, তখন Android একাধিক অ্যাপ থেকে পুনরাবৃত্তি হওয়া অ্যালার্মগুলিকে সিঙ্ক্রোনাইজ করে এবং একই সময়ে চালু করে। এটি সিস্টেমকে ডিভাইসটি জাগানোর জন্য প্রয়োজনীয় মোট সংখ্যা হ্রাস করে, ফলে ব্যাটারির খরচ কম হয়। Android 4.4 (API লেভেল 19) অনুসারে, সমস্ত পুনরাবৃত্তি হওয়া অ্যালার্মগুলি অযৌক্তিক অ্যালার্ম । মনে রাখবেন যেsetInexactRepeating()হলsetRepeating()তুলনায় একটি উন্নতি, তবে প্রতিটি অ্যাপ একই সময়ে সার্ভারে আঘাত করলে এটি সার্ভারকে অভিভূত করতে পারে। অতএব, নেটওয়ার্ক অনুরোধের জন্য, পূর্বে আলোচনা করা হিসাবে আপনার অ্যালার্মগুলিতে কিছু এলোমেলোতা যোগ করুন।সম্ভব হলে ঘড়ির সময়ের উপর ভিত্তি করে অ্যালার্ম বাজানো এড়িয়ে চলুন।
সুনির্দিষ্ট ট্রিগার সময়ের উপর ভিত্তি করে বারবার বাজানো অ্যালার্মগুলি ভালোভাবে স্কেল করে না। সম্ভব হলে
ELAPSED_REALTIMEব্যবহার করুন। বিভিন্ন ধরণের অ্যালার্ম নিম্নলিখিত বিভাগে আরও বিশদে বর্ণনা করা হয়েছে।