অ্যান্ড্রয়েডে সমস্ত নতুন সীমাবদ্ধতার পরে একটি সঠিক সময়ে নির্ধারিত হওয়ার জন্য কীভাবে একটি অ্যালার্ম সেট করা যায়?


27

নোট: আমি বিভিন্ন সমাধান যে (উদাহরণস্বরূপ 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 ডিভাইস (স্টক) উভয়ই।

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

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

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

আমি কি চেষ্টা করেছি

প্রকৃতপক্ষে অ্যালার্মটি কাজ করে কিনা তা পরীক্ষা করতে, এখন থেকে এক মিনিটের মধ্যে অ্যালার্মটি ট্রিগার করার চেষ্টা করার পরে আমি প্রথমবার অ্যাপটি ইনস্টল করার পরে, ডিভাইসটি পিসির সাথে সংযুক্ত থাকাকালীন (লগগুলি দেখতে) এই পরীক্ষাগুলি সম্পাদন করি:

  1. অ্যাপ্লিকেশনটি অগ্রভাগে থাকা অবস্থায় ব্যবহারকারীর কাছে দৃশ্যমান Test - 1-2 মিনিট সময় লাগল।
  2. অ্যাপটি ব্যাকগ্রাউন্ডে প্রেরণ করা হয়েছিল তা পরীক্ষা করুন (উদাহরণস্বরূপ হোম বোতামটি ব্যবহার করে) - প্রায় 1 মিনিট সময় নিয়েছিল
  3. অ্যাপের কার্যটি সাম্প্রতিক কার্যগুলি থেকে সরানো হলে পরীক্ষা করুন। - আমি 20 মিনিটেরও বেশি অপেক্ষা করেছি এবং অ্যালার্মটি ট্রিগার হতে দেখিনি, লগগুলিতে লিখিত।
  4. # 3 টি পছন্দ করুন তবে পর্দাটি বন্ধ করুন। এটি সম্ভবত আরও খারাপ হবে ...

আমি পরবর্তী জিনিসগুলি ব্যবহার করার চেষ্টা করেছি, সমস্ত কাজ করে না:

  1. alarmManager.setAlarmClock(AlarmManager.AlarmClockInfo(timeToTrigger, pendingIntent), pendingIntent)

  2. alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)

  3. AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)

  4. উপরের যে কোনওটির সংমিশ্রণ:

    if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) alarmManager.setWindow(AlarmManager.RTC_WAKEUP, 0, 60 * 1000L, pendingIntent)

  5. ব্রডকাস্টরসিভারের পরিবর্তে কোনও পরিষেবা ব্যবহার করার চেষ্টা করেছিল। এছাড়াও একটি পৃথক প্রক্রিয়া চেষ্টা।

  6. অ্যাপটিকে ব্যাটারি অপ্টিমাইজেশন (সহায়তা করে না) থেকে উপেক্ষা করার চেষ্টা করা হয়েছে, তবে যেহেতু অন্যান্য অ্যাপ্লিকেশনগুলির এটির প্রয়োজন নেই, তাই আমারও এটি ব্যবহার করা উচিত নয়।

  7. এটি ব্যবহার করার চেষ্টা করা হয়েছে:

            if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP)
                alarmManager.setAlarmClock(AlarmManager.AlarmClockInfo(timeToTrigger, pendingIntent), pendingIntent)
            AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
  1. সেখানে অ্যালার্মটির পুনরায় সময়সূচী তৈরি করার জন্য অন ​​টাস্ক রেমোভেডের একটি ট্রিগার থাকবে এমন একটি পরিষেবা থাকার চেষ্টা করা হয়েছিল, তবে এটিও সাহায্য করেনি (পরিষেবাটি যদিও ভালভাবে কাজ করেছিল)।

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

এটি ত্রুটির মতো বলে মনে হচ্ছে, সমস্যাটি দেখানোর জন্য একটি নমুনা প্রকল্প এবং ভিডিও সহ আমি এখানে এটি সম্পর্কে রিপোর্ট করেছি ।

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

প্রশ্নসমুহ

  1. আজকাল তুলনামূলক সঠিক সময়ে আমরা কীভাবে কোনও ট্রিগার হওয়ার জন্য সেট করব?

  2. উপরের সমাধানগুলি কীভাবে কাজ করবে না? আমি কি কিছু মিস করছি? অনুমতি? এর পরিবর্তে আমার কোনও কর্মী ব্যবহার করার কথা? কিন্তু তারপরে কি এর অর্থ হবেনা যে এটি সময়মতো মোটেই ট্রিগার হতে পারে না?

  3. গুগল "ক্লক" অ্যাপ কীভাবে এই সমস্তটি কাটিয়ে উঠেছে এবং ঠিক এক মিনিট আগে এটি ট্রিগার করা হলেও যথাযথ সময়ে যেকোনভাবে ট্রিগার করে? এটি কেবলমাত্র একটি সিস্টেম অ্যাপ্লিকেশন কারণেই? যদি এটি কোনও বিল্ট-ইন না থাকে এমন কোনও ডিভাইসে কোনও ব্যবহারকারী অ্যাপ হিসাবে ইনস্টল হয়ে যায় তবে কী হবে?

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

সম্পাদনা: এখানে ধারণাগুলি চেষ্টা করার জন্য একটি ছোট গিথুব সংগ্রহশালা তৈরি করেছেন ।


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


এটি অনেক দিন ধরে আমি পরিষেবাতে কাজ করেছি (আমি প্রস্তাব দেওয়ার পক্ষেও প্রো প্রো বিকাশকারী নই) তবে আমি আপনাকে পরামর্শ দিতে পারি যে আপনি 5 মিনিটের নীচে অ্যালার্ম সেট করতে চান, অ্যান্ড্রয়েড বিধিনিষেধের কারণে অ্যান্ড্রয়েড বিধিনিষেধের কারণে কিউজ চলমান সময় পরে ব্যাকএন্ডে এটি প্রতি 5 মিনিটের পরে বা তার চেয়ে কম 5 মিনিটের পরে কল হয়। পরিবর্তে, আমি হ্যান্ডলার ব্যবহার করেছি। এবং আমার পরিষেবা চালনার জন্য আমি যে পটভূমিতে উল্লেখ করেছি তা অব্যাহত রয়েছে [ github.com/fabcira/neverEndingAndroidService]
ব্লু

তাহলে সঠিক বাধা কী? একটি ট্রিগার তুলনামূলকভাবে সুনির্দিষ্ট সময় দেওয়ার জন্য কাজ করবে এমন গ্যারান্টিযুক্ত ন্যূনতম সময়টি কী?
অ্যান্ড্রয়েড বিকাশকারী

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

আমি জানি আপনি অ্যান্ড্রয়েড কিউ এর ব্যাকগ্রাউন্ড থেকে ক্রিয়াকলাপ শুরু করতে পারবেন না, তবে এটি আপনার ক্ষেত্রে দেখায় না।
মার্চিনজ

@ greeble31 আমি এখন চেষ্টা করেছি। আপনি কোন সমাধানটির কাজ দেখছেন? কিছু কারণে আমি এখনও এটি কাজ করে না। আমি অ্যালার্ম সেট করেছি, সাম্প্রতিক কাজগুলি থেকে আমি অ্যাপটি সরিয়েছি এবং স্ক্রিনটি চালু থাকা এবং ডিভাইসটি একটি চার্জারের সাথে সংযুক্ত থাকা সত্ত্বেও আমি অ্যালার্মটি ট্রিগার হতে দেখছি না। এটি একটি আসল ডিভাইস (অ্যান্ড্রয়েড 10 সহ পিক্সেল 4) এবং এমুলেটরটিতে (উদাহরণস্বরূপ API 27) উভয়তেই ঘটে happens এটা কি তোমার জন্য কাজ করে? আপনি কি পুরো কোডটি শেয়ার করতে পারেন? গিথুবে হয়তো?
অ্যান্ড্রয়েড বিকাশকারী

উত্তর:


4

আমাদের কিছু করার নেই।

একবার আপনার অ্যাপটিকে শ্বেত তালিকাভুক্ত না করা হলে এটি সর্বদা সাম্প্রতিক-অ্যাপ্লিকেশনগুলি থেকে সরানোর পরে নিহত হবে।

কারণ অরিজিনাল সরঞ্জাম প্রস্তুতকারক (ওএমই) অবিচ্ছিন্নভাবে অ্যান্ড্রয়েড সম্মতি লঙ্ঘন করে

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

আপনি এখানে আচরণের সাথে ডিভাইসের একটি তালিকা পেতে পারেন তবে আপনি কোনও পার্শ্ব-সমাধানও পেতে পারেন, তবে এটি ভাল কাজ করবে না।


আমি চাইনিজ OEM এর এই সমস্যাটি সম্পর্কে ভালভাবে অবগত। তবে আমি যেমন লিখেছি, এটি এমুলেটর এবং পিক্সেল 4 ডিভাইসেও ঘটে। এটি এমন কোনও চীনা ওএম নয় যা এটিকে তৈরি করে। অনুগ্রহ করে এমুলেটর এবং / অথবা পিক্সেল ডিভাইসটি পরীক্ষা করুন। বিষয়টিও সেখানে বিদ্যমান। একটি অ্যালার্ম সেট করুন, সাম্প্রতিক কাজগুলি থেকে অ্যাপটি সরিয়ে ফেলুন এবং দেখুন যে অ্যালার্মটি ট্রিগার হয়নি। আমি এটিকে একটি বাগ হিসাবে দেখছি এবং এখানে প্রতিবেদন করেছি (এটিতে একটি ভিডিও এবং যদি আপনি চেষ্টা করতে চান তবে একটি নমুনা প্রকল্প অন্তর্ভুক্ত করা হয়েছে): ইস্যুয়েট্রেকার জিআর / বিএসইউ / 149556385। আমি আমার প্রশ্নটি এটি পরিষ্কার করার জন্য আপডেট করেছি। কিছু অ্যাপ কীভাবে সফল হয়েছিল তা প্রশ্ন।
অ্যান্ড্রয়েড বিকাশকারী

@ অ্যান্ড্রয়েড ডেভেলপার আমার বিশ্বাস এমুলেটরটিতে এটি কাজ করা উচিত .. আপনার কোন ইমুলেটর রয়েছে?
ইব্রাহিম আলী

আমি বিশ্বাসও করেছি, যতক্ষণ না আমি চেষ্টা করেছি। উদাহরণস্বরূপ, এপিআই 29 এ এটি ব্যবহার করে দেখুন, Android স্টুডিও কী অফার করে। আমি নিশ্চিত যে এটি বেশ কয়েকটি পুরানো সংস্করণেও ঘটবে।
অ্যান্ড্রয়েড বিকাশকারী

4

একটি অদ্ভুত পরিশ্রমের সন্ধান পেয়েছে ( এখানে নমুনা ) যা অ্যান্ড্রয়েড আর সহ সমস্ত সংস্করণে কাজ করে বলে মনে হচ্ছে:

  1. ম্যানিফেস্টে অনুমতি এসইউ অনুমতিটি ঘোষণা করুন:
      <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

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

  1. একটি পরিষেবা রয়েছে যা সনাক্ত করবে যখন কার্যগুলি সরিয়ে ফেলা হয়েছিল এবং যখন এটি হয়ে যায় তখন একটি নকল ক্রিয়াকলাপ খুলুন যা এটি যা করে তা হ'ল নিজেকে বন্ধ করে দেওয়া:
class OnTaskRemovedDetectorService : Service() {
    override fun onBind(intent: Intent?) = null

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int) = START_STICKY

    override fun onTaskRemoved(rootIntent: Intent?) {
        super.onTaskRemoved(rootIntent)
        Log.e("AppLog", "onTaskRemoved")
        applicationContext.startActivity(Intent(this, FakeActivity::class.java).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
        stopSelf()
    }

}

FakeActivity.kt

class FakeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d("AppLog", "FakeActivity")
        finish()
    }
}

আপনি এই থিমটি ব্যবহার করে ব্যবহারকারীর কাছে এই কার্যকলাপটিও প্রায় অদৃশ্য করতে পারেন:

    <style name="AppTheme.Translucent" parent="@style/Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>

দুঃখের বিষয়, এটি একটি অদ্ভুত কাজ। আমি এটি একটি ভাল কাজ খুঁজে পেতে আশা করি।

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

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

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

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


সম্পাদনা: দেখে মনে হচ্ছে এটি অ্যান্ড্রয়েড স্টুডিওতে একটি বাগ ( সংস্করণের তুলনায় ভিডিওগুলি সহ এখানে রিপোর্ট করা হয়েছে )। আমি চেষ্টা করেছি এমন সমস্যাযুক্ত সংস্করণ থেকে আপনি যখন অ্যাপ্লিকেশনটি চালু করবেন তখন এটি অ্যালার্মগুলি সাফ হওয়ার কারণ হতে পারে।

আপনি যদি লঞ্চারটি থেকে অ্যাপটি চালু করেন তবে এটি দুর্দান্ত কাজ করে।

অ্যালার্ম সেট করার জন্য এটিই বর্তমান কোড:

        val timeToTrigger = System.currentTimeMillis() + 10 * 1000
        val pendingShowList = PendingIntent.getActivity(this, 1, Intent(this, SomeActivity::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
        val pendingIntent = PendingIntent.getBroadcast(this, 1, Intent(this, AlarmReceiver::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
        manager.setAlarmClock(AlarmManager.AlarmClockInfo(timeToTrigger, pendingShowList), pendingIntent)

এমনকি আমাকে "পেন্ডিংশোলিস্ট" ব্যবহার করতে হবে না। নাল ব্যবহার করাও ঠিক আছে।


আমি কেবল অ্যানড্রইডকিউ-তে রিসিপ () এ একটি ক্রিয়াকলাপ শুরু করতে চাই। SYSTEM_ALERT_WINDOWঅনুমতি ব্যতিরেকে কি এর জন্য কোনও কর্মসীমা আছে ?
ডক্ট্রামাম

2
গুগল কেন সবসময় অ্যান্ড্রয়েড বিকাশকারীদের জীবনকে সাধারণ স্টাফের তুলনায় একটি জীবন্ত নরক করে তোলে ?!
ডক্ট্রামাম

@ ডক্টররম হ্যাঁ, এটি বিভিন্ন ব্যতিক্রম সম্পর্কে ডক্সে লিখিত আছে: বিকাশকারী.আ্যান্ড্রয়েড / গুইড / কম্পোনেন্টস / অ্যাক্টিভিটিস /… । আমি কেবলমাত্র SYSTEM_ALERT_WINDOW বেছে নিয়েছি কারণ এটি পরীক্ষা করা সবচেয়ে সহজ।
অ্যান্ড্রয়েড বিকাশকারী

আপনার শেষ সম্পাদনা থেকে, আপনি কি বোঝাতে চেয়েছেন যে অ্যাপটি সাম্প্রতিক তালিকা থেকে সরানোর পরে আপনি অ্যালার্মগুলি ধরে রাখার জন্য উল্লেখ করেছেন এমন কোনও কাজের ঘাঁটি ব্যবহার করার দরকার নেই ??
প্রদীপ কুমার রেড্ডি

অ্যাপটি সাম্প্রতিক তালিকা থেকে সরানো হলেও আমি ব্যাকগ্রাউন্ডে প্রতিদিন সকাল 6 টা থেকে 7 টার মধ্যে একটি কোডের টুকরো চালাতে চাই run আমার ওয়ার্ক ম্যানেজার বা অ্যালার্ম ম্যানেজার ব্যবহার করা উচিত ?? আমার ব্যবহারের জন্য নীচের কোডটি চেষ্টা করেছিলাম এবং এটি কার্যকর হয়নি। নীচের কোডে সমস্যা কী? calendar.setTimeInMillis (System.currentTimeMillis ()); ক্যালেন্ডার.সেট (ক্যালেন্ডার। HOUR_OF_DAY, 6); অ্যালার্ম ম্যানেজ.সেটআইনেক্স্যাক্ট রিপিটিং (অ্যালার্ম ম্যানেজ.আরটিসি_ওয়াকইউপি, ক্যালেন্ডার.সেটটাইমইনমিলিস (), অ্যালার্ম ম্যানেজ.আইএনটারওয়াল_ডিএ, পেন্ডিং ইন্টেন্ট);
প্রদীপ কুমার রেড্ডি

1
  1. নিশ্চিত করুন যে আপনি সম্প্রচারিত উদ্দেশ্যটি স্পষ্ট এবং Intent.FLAG_RECEIVER_FOREGROUNDপতাকা রয়েছে and

https://developer.android.com/about/versions/oreo/background#broadcasts

Intent intent = new Intent(context, Receiver.class);
intent.setAction(action);
...
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);

PendingIntent operation = PendingIntent.getBroadcast(context, 0, intent, flags);
  1. setExactAndAllowWhileIdle()23 ++ এপিআই লক্ষ্য করে ব্যবহার করুন ।
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, operation);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, time, operation);
} else {
    alarmManager.set(AlarmManager.RTC_WAKEUP, time, operation);
}
  1. অগ্রভাগ পরিষেবা হিসাবে আপনার অ্যালার্মটি শুরু করুন:

https://developer.android.com/about/versions/oreo/background#migration

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService(intent);
} else {
    context.startService(intent);
}
  1. এবং অনুমতিগুলি ভুলে যাবেন না:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

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

@ অ্যান্ড্রয়েড ডেভেলপার উত্তরটি আপডেট করেছেন।
মাকসিম ইভানভ

এখনও কাজ বলে মনে হচ্ছে না। এখানে একটি নমুনা প্রকল্প রয়েছে: ufile.io/6qrsor7o । দয়া করে অ্যান্ড্রয়েড 10 এ চেষ্টা করুন (এমুলেটরটিও ঠিক আছে), অ্যালার্ম সেট করুন এবং সাম্প্রতিক কাজগুলি থেকে অ্যাপটিকে সরিয়ে দিন। আপনি সাম্প্রতিক কাজগুলি থেকে সরিয়ে না নিলে এটি দুর্দান্ত কাজ করে এবং 10 সেকেন্ড পরে ট্রিগার হয়।
অ্যান্ড্রয়েড বিকাশকারী

আমি একটি বাগের প্রতিবেদনের একটি লিঙ্ক থাকতে প্রশ্নটি আপডেট করেছি যাতে একটি নমুনা প্রকল্প এবং ভিডিও রয়েছে, কারণ আমি মনে করি এটি একটি ত্রুটি কারণ আমি এটি হওয়ার অন্য কোনও কারণ দেখতে পাচ্ছি না।
অ্যান্ড্রয়েড বিকাশকারী

0

আমি জানি এটি দক্ষ নয় তবে এটি 60 সেকেন্ডের যথার্থতার সাথে আরও সামঞ্জস্য হতে পারে।

https://developer.android.com/reference/android/content/Intent#ACTION_TIME_TICK

যদি এই ব্রডকাস্ট রিসিভারটি অগ্রভাগের পরিষেবাটিতে ব্যবহার করা হয় তবে আপনি প্রতি মিনিটে সময়টি পরীক্ষা করতে পারেন এবং কোনও পদক্ষেপ নেওয়ার বিষয়ে সিদ্ধান্ত নিতে পারেন।


আমার যদি অগ্রভাগের পরিষেবা থাকে তবে আমার এটি কেন দরকার হবে? আমি চাইলে কেবল একটি হ্যান্ডলারের পোস্টপ্লেডেলেড বা অন্য কোনও অনুরূপ সমাধান ব্যবহার করতে পারি ...
অ্যান্ড্রয়েড বিকাশকারী

0

আমি মনে করি আপনি ব্যবহারকারীর অনুমতি নির্ধারণের জন্য অনুরোধ করতে পারেন যাতে এটি শক্তি-সঞ্চয়ীকরণ মোডটি অক্ষম করে এবং ব্যবহারকারীকে সতর্ক করে দেয় যে তিনি যদি এটি ব্যবহার না করেন তবে সঠিক সময় অর্জন করা যাবে না।

এটির অনুরোধ করার কোডটি এখানে:

PowerManager powerManager = (PowerManager) getApplicationContext().getSystemService(POWER_SERVICE);
            String packageName = "your Package name";
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                Intent i = new Intent();
                if (!powerManager.isIgnoringBatteryOptimizations(packageName)) {
                    i.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                    i.setData(Uri.parse("package:" + packageName));
                    startActivity(i);

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

0

আপনি আপনার প্রশ্নের ( সাধারণ অ্যালার্ম ক্লক) উল্লিখিত ওপেন সোর্স প্রকল্পের লেখক ।

আমি অবাক হয়েছি যে AlarmManager.setAlarmClock ব্যবহার করা আপনার পক্ষে কার্যকর হয়নি, কারণ আমার অ্যাপ্লিকেশনটি ঠিক এটি করে। কোডটি AlarmSetter.kt ফাইলটিতে রয়েছে। এখানে একটি স্নিপেট রয়েছে:

  val pendingAlarm = Intent(ACTION_FIRED)
                .apply {
                    setClass(mContext, AlarmsReceiver::class.java)
                    putExtra(EXTRA_ID, id)
                    putExtra(EXTRA_TYPE, typeName)
                }
                .let { PendingIntent.getBroadcast(mContext, pendingAlarmRequestCode, it, PendingIntent.FLAG_UPDATE_CURRENT) }

            val pendingShowList = PendingIntent.getActivity(
                    mContext,
                    100500,
                    Intent(mContext, AlarmsListActivity::class.java),
                    PendingIntent.FLAG_UPDATE_CURRENT
            )

            am.setAlarmClock(AlarmManager.AlarmClockInfo(calendar.timeInMillis, pendingShowList), pendingAlarm)

মূলত এটি বিশেষ কিছু নয়, কেবল নিশ্চিত করুন যে অভিপ্রায়টির একটি ক্রিয়া এবং একটি লক্ষ্য শ্রেণি রয়েছে, যা আমার ক্ষেত্রে একটি সম্প্রচারক গ্রহণকারী।


দুঃখজনকভাবে কাজ হয়নি। এটাই আমি চেষ্টা করেছি। ফাইলগুলি এখানে দেখুন: github.com/yuriykulikov/AlarmClock/issues/…
অ্যান্ড্রয়েড বিকাশকারী

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

আমি ইতিমধ্যে একাধিক বার দেখিয়েছি: সময় নির্ধারণের পরে যা করি তা হ'ল সাম্প্রতিক কাজগুলি থেকে সরিয়ে ফেলা। এবং আমি এটি এমুলেটর এবং পিক্সেল 4 উভয়ই করেছিলাম
অ্যান্ড্রয়েড বিকাশকারী

মুলতুবিশোলিস্ট ব্যবহার করে সমস্যাটি বাতিল করে কিনা তা দয়া করে পরীক্ষা করুন এবং হ্যাঁ, আমি উত্তরটি আপডেট করব। এটি কারও পক্ষে কাজে লাগবে।
ইউরি কুলিকভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.