নোট: আমি বিভিন্ন সমাধান যে (উদাহরণস্বরূপ Stackoverflow এখানে সম্পর্কে লেখা হয় চেষ্টা এখানে )। আপনি যা লিখেছেন তা থেকে নীচের লিখিত পরীক্ষার সাহায্যে আপনার সমাধান কাজ করে কিনা তা পরীক্ষা করে দেখে দয়া করে এটি বন্ধ করবেন না।
পটভূমি
অ্যাপটিতে একটি প্রয়োজনীয়তা রয়েছে যে ব্যবহারকারী নির্দিষ্ট সময় নির্ধারিত হওয়ার জন্য একটি অনুস্মারক সেট করে, তাই যখন অ্যাপটি এই মুহুর্তে ট্রিগার হয়ে যায়, তখন এটি ব্যাকগ্রাউন্ডে ছোট কিছু করে (কিছু ডিবি ক্যোয়ারী অপারেশন), এবং একটি প্রদর্শন করে সহজ বিজ্ঞপ্তি, অনুস্মারক সম্পর্কে বলতে।
অতীতে, আমি তুলনামূলকভাবে নির্দিষ্ট সময়ে নির্ধারিত কিছু সেট করার জন্য একটি সাধারণ কোড ব্যবহার করেছি:
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val pendingIntent = PendingIntent.getBroadcast(context, requestId, Intent(context, AlarmReceiver::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
when {
VERSION.SDK_INT >= VERSION_CODES.KITKAT -> alarmManager.setExact(AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
else -> alarmManager.set(AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
}
class AlarmReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.d("AppLog", "AlarmReceiver onReceive")
//do something in the real app
}
}
ব্যবহার:
val timeToTrigger = System.currentTimeMillis() + java.util.concurrent.TimeUnit.MINUTES.toMillis(1)
setAlarm(this, timeToTrigger, 1)
সমস্যাটি
আমি এখন এই কোডটি নতুন অ্যান্ড্রয়েড সংস্করণে এবং অ্যান্ড্রয়েড 10 এর সাথে পিক্সেল 4 এ পরীক্ষিত করেছি এবং এটি ট্রিগার বলে মনে হচ্ছে না, বা আমি যা সরবরাহ করি তা এটি দীর্ঘকাল পরে ট্রিগার করে। সাম্প্রতিক কাজগুলি থেকে কিছু ওএমএস অ্যাপ্লিকেশন সরানোর জন্য যে ভয়াবহ আচরণ যুক্ত করেছে সে সম্পর্কে আমি ভালভাবে অবগত রয়েছি , তবে এটি ইমুলেটর এবং পিক্সেল 4 ডিভাইস (স্টক) উভয়ই।
আমি অ্যালার্ম সেট করার বিষয়ে ডক্সে পড়েছি , এটি অ্যাপগুলির জন্য সীমাবদ্ধ হয়ে পড়ে যাতে এটি প্রায়শই ঘটে না তবে এটি নির্দিষ্ট সময়ে কীভাবে অ্যালার্ম সেট করবেন তা ব্যাখ্যা করে না এবং এটি ব্যাখ্যা করে না কিভাবে আসা গুগলের ঘড়ি অ্যাপ্লিকেশানটিকে সফল এরকম।
কেবল তা-ই নয়, তবে যা আমি বুঝতে পেরেছি তা অনুসারে, এটি বলেছে বিশেষত ডিভাইসের স্বল্প বিদ্যুতের জন্য বিধিনিষেধগুলি প্রয়োগ করা উচিত, তবে আমার ক্ষেত্রে, ডিভাইস এবং অনুকরণকারী উভয় ক্ষেত্রেই আমার এই অবস্থা ছিল না। আমি এখন থেকে প্রায় এক মিনিটের মধ্যে অ্যালার্মগুলি ট্রিগার করার জন্য সেট করেছি।
অনেক অ্যালার্ম ক্লক অ্যাপ্লিকেশনগুলি আগের মতো কাজ করে না তা দেখে, আমার মনে হয় ডক্সে কিছু অনুপস্থিত রয়েছে। এই জাতীয় অ্যাপ্লিকেশনগুলির উদাহরণ হ'ল জনপ্রিয় সময়োচিত অ্যাপ্লিকেশন যা গুগল কিনেছিল কিন্তু নতুন বিধিনিষেধগুলি হ্যান্ডেল করার জন্য কখনও নতুন আপডেট পেল না এবং এখন ব্যবহারকারীরা এটি আবার চান। । যাইহোক, কিছু জনপ্রিয় অ্যাপস যেমন কাজ জরিমানা না এই এক ।
আমি কি চেষ্টা করেছি
প্রকৃতপক্ষে অ্যালার্মটি কাজ করে কিনা তা পরীক্ষা করতে, এখন থেকে এক মিনিটের মধ্যে অ্যালার্মটি ট্রিগার করার চেষ্টা করার পরে আমি প্রথমবার অ্যাপটি ইনস্টল করার পরে, ডিভাইসটি পিসির সাথে সংযুক্ত থাকাকালীন (লগগুলি দেখতে) এই পরীক্ষাগুলি সম্পাদন করি:
- অ্যাপ্লিকেশনটি অগ্রভাগে থাকা অবস্থায় ব্যবহারকারীর কাছে দৃশ্যমান Test - 1-2 মিনিট সময় লাগল।
- অ্যাপটি ব্যাকগ্রাউন্ডে প্রেরণ করা হয়েছিল তা পরীক্ষা করুন (উদাহরণস্বরূপ হোম বোতামটি ব্যবহার করে) - প্রায় 1 মিনিট সময় নিয়েছিল
- অ্যাপের কার্যটি সাম্প্রতিক কার্যগুলি থেকে সরানো হলে পরীক্ষা করুন। - আমি 20 মিনিটেরও বেশি অপেক্ষা করেছি এবং অ্যালার্মটি ট্রিগার হতে দেখিনি, লগগুলিতে লিখিত।
- # 3 টি পছন্দ করুন তবে পর্দাটি বন্ধ করুন। এটি সম্ভবত আরও খারাপ হবে ...
আমি পরবর্তী জিনিসগুলি ব্যবহার করার চেষ্টা করেছি, সমস্ত কাজ করে না:
alarmManager.setAlarmClock(AlarmManager.AlarmClockInfo(timeToTrigger, pendingIntent), pendingIntent)
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
উপরের যে কোনওটির সংমিশ্রণ:
if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) alarmManager.setWindow(AlarmManager.RTC_WAKEUP, 0, 60 * 1000L, pendingIntent)
ব্রডকাস্টরসিভারের পরিবর্তে কোনও পরিষেবা ব্যবহার করার চেষ্টা করেছিল। এছাড়াও একটি পৃথক প্রক্রিয়া চেষ্টা।
অ্যাপটিকে ব্যাটারি অপ্টিমাইজেশন (সহায়তা করে না) থেকে উপেক্ষা করার চেষ্টা করা হয়েছে, তবে যেহেতু অন্যান্য অ্যাপ্লিকেশনগুলির এটির প্রয়োজন নেই, তাই আমারও এটি ব্যবহার করা উচিত নয়।
এটি ব্যবহার করার চেষ্টা করা হয়েছে:
if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP)
alarmManager.setAlarmClock(AlarmManager.AlarmClockInfo(timeToTrigger, pendingIntent), pendingIntent)
AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
- সেখানে অ্যালার্মটির পুনরায় সময়সূচী তৈরি করার জন্য অন টাস্ক রেমোভেডের একটি ট্রিগার থাকবে এমন একটি পরিষেবা থাকার চেষ্টা করা হয়েছিল, তবে এটিও সাহায্য করেনি (পরিষেবাটি যদিও ভালভাবে কাজ করেছিল)।
গুগলের ক্লক অ্যাপ্লিকেশন হিসাবে, আমি এটি সম্পর্কে বিশেষ কিছু দেখতে পাইনি এটি ব্যতীত এটি ট্রিগার হওয়ার আগে একটি বিজ্ঞপ্তি দেখায় এবং আমি এটি ব্যাটারি-অপ্টিমাইজেশন সেটিংস স্ক্রিনের "অনুকূলিত নয়" বিভাগেও দেখতে পাই না।
এটি ত্রুটির মতো বলে মনে হচ্ছে, সমস্যাটি দেখানোর জন্য একটি নমুনা প্রকল্প এবং ভিডিও সহ আমি এখানে এটি সম্পর্কে রিপোর্ট করেছি ।
আমি এমুলেটরটির একাধিক সংস্করণ পরীক্ষা করেছি এবং দেখে মনে হচ্ছে যে এই আচরণটি API 27 থেকে শুরু হয়েছিল (অ্যান্ড্রয়েড 8.1 - ওরিও)। খুঁজছি ডক্সে , আমি দেখতে পাই না AlarmManager উল্লেখ, কিন্তু এর পরিবর্তে, এটা বিভিন্ন পটভূমি কাজ সম্পর্কে লেখা হয়েছিল।
প্রশ্নসমুহ
আজকাল তুলনামূলক সঠিক সময়ে আমরা কীভাবে কোনও ট্রিগার হওয়ার জন্য সেট করব?
উপরের সমাধানগুলি কীভাবে কাজ করবে না? আমি কি কিছু মিস করছি? অনুমতি? এর পরিবর্তে আমার কোনও কর্মী ব্যবহার করার কথা? কিন্তু তারপরে কি এর অর্থ হবেনা যে এটি সময়মতো মোটেই ট্রিগার হতে পারে না?
গুগল "ক্লক" অ্যাপ কীভাবে এই সমস্তটি কাটিয়ে উঠেছে এবং ঠিক এক মিনিট আগে এটি ট্রিগার করা হলেও যথাযথ সময়ে যেকোনভাবে ট্রিগার করে? এটি কেবলমাত্র একটি সিস্টেম অ্যাপ্লিকেশন কারণেই? যদি এটি কোনও বিল্ট-ইন না থাকে এমন কোনও ডিভাইসে কোনও ব্যবহারকারী অ্যাপ হিসাবে ইনস্টল হয়ে যায় তবে কী হবে?
তুমি যদি বল যে এটা একটি সিস্টেম অ্যাপ্লিকেশন কারণ, আমি অন্য অ্যাপ্লিকেশন যে একটি অ্যালার্ম 2 মিনিট দুবার আরম্ভ করতে পারেন পেয়েছি এখানে যদিও আমার মনে হয় এটা কখনও কখনও একটি ফোরগ্রাউন্ড পরিষেবা ব্যবহার করতে পারে,।
সম্পাদনা: এখানে ধারণাগুলি চেষ্টা করার জন্য একটি ছোট গিথুব সংগ্রহশালা তৈরি করেছেন ।
সম্পাদনা: অবশেষে এমন একটি নমুনা খুঁজে পেয়েছে যা উভয়ই উন্মুক্ত উত্সযুক্ত এবং এই সমস্যাটি নেই। দুঃখের বিষয় এটি অত্যন্ত জটিল এবং আমি এখনও এটি কীভাবে এত আলাদা করে তোলে তা নির্ধারণ করার চেষ্টা করি (এবং সর্বনিম্ন কোডটি যা আমার পিওসি-তে যুক্ত করা উচিত) এটি অ্যালার্মগুলিকে সাম্প্রতিক কাজগুলি থেকে অ্যাপ সরিয়ে দেওয়ার পরে নির্ধারিত থাকতে দেয়