অ্যালার্ম ম্যানেজারের ইতিমধ্যে একটি অ্যালার্ম সেট আছে কিনা তা কীভাবে পরীক্ষা করবেন?


231

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


4
আপনার সমস্যাটির সমাধান করা উত্তরটি বৈধ করুন বা আপনার নিজের সমাধান পোস্ট করুন।
আনিস

উত্তর:


322

পোস্ট করা মন্তব্য রন অনুসরণ করে, এখানে বিস্তারিত সমাধান। ধরা যাক আপনি এই জাতীয় মুলতুবি রেখে পুনরাবৃত্তি এলার্মটি নিবন্ধভুক্ত করেছেন:

Intent intent = new Intent("com.my.package.MY_UNIQUE_ACTION");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, 
                                      intent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.MINUTE, 1);

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60, pendingIntent);

এটি সক্রিয় রয়েছে কিনা তা পরীক্ষা করার জন্য আপনি যেভাবে যাচ্ছেন তা হ'ল:

boolean alarmUp = (PendingIntent.getBroadcast(context, 0, 
        new Intent("com.my.package.MY_UNIQUE_ACTION"), 
        PendingIntent.FLAG_NO_CREATE) != null);

if (alarmUp)
{
    Log.d("myTag", "Alarm is already active");
}

FLAG_NO_CREATEজাভাডোকে বর্ণিত হিসাবে এখানে কীটি হ'ল: if the described PendingIntent **does not** already exists, then simply return null(একটি নতুন তৈরির পরিবর্তে)


9
এটি কি কেবল একটি অ্যাকশন স্ট্রিং সহ অভিপ্রায় ব্যবহার করতে হবে? আমি একটি ক্লাস, নতুন ইনটেন্ট (প্রসঙ্গ, মাইক্লাস.ক্লাস) নির্দিষ্ট করার চেষ্টা করেছি তবে এটি কাজ করছে বলে মনে হচ্ছে না। অ্যালার্ম চলমান অবস্থায়ও এটি সর্বদা শূন্য হয়।
toc777

5
toc777, এটির কোনও স্ট্রিং হওয়ার দরকার নেই যা আপনার ম্যানিফেস্ট.এক্সএমএল-এ আপনার অভিপ্রায়-ফিল্টারটিতে ঘোষিত ক্রিয়াটির সাথে মেলে
ক্রিস নাইট

4
ক্রিস, এটি আমার সমস্যা সৃষ্টি করছিল এমন আরও একটি সমস্যা ছিল। আমি উপরে উল্লিখিত অভিপ্রায়টি আসলে কাজ করে :)
toc777

41
মনে রাখবেন আপনি উভয় কল করতে হবে alarmManager.cancel(pendingIntent)এবং pendingIntent.cancel()রিটার্ন মিথ্যাতে এই সমাধান জন্য যাতে।
কেভিন কুপার

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

114

অন্যদের জন্য যাদের এটির প্রয়োজন হতে পারে তাদের জন্য এখানে একটি উত্তর।

ব্যবহার adb shell dumpsys alarm

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


36
ওপি-তে আসলে প্রোগ্রামিক উত্তর নয়, একটি দুর্দান্ত টিপ। জেনে খুব ভাল লাগছে।
জাস্টসমেগুই 6:38

2
অ্যালার্মের সাধারণত দীর্ঘ তালিকাকে ফিল্টার করার জন্য একটি গ্রেপ সংযোজন করুন: adb shell dumpsys alarm | grep <e.g. package name of your app>এছাড়াও নতুন উইন্ডোজ সিস্টেমগুলিতে কাজ করে (আমি
উইন

3
গ্রেপ আপনার পিসি নয়, মোবাইল ডিভাইসে কার্যকর করা হয়। সুতরাং যদি গ্রেপ কাজ করে তবে অ্যান্ড্রয়েড ওএসের উপর নির্ভর করে। পুরানো ফোনগুলি গ্রেপ সহ আসে না।
হেনিং

53

রিসিভারের সাথে কাজ করার উদাহরণ (শীর্ষ উত্তরটি কেবল ক্রিয়া সহ ছিল)।

//starting
AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(getActivity(), MyReceiver.class);
intent.setAction(MyReceiver.ACTION_ALARM_RECEIVER);//my custom string action name
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 1001, intent, PendingIntent.FLAG_CANCEL_CURRENT);//used unique ID as 1001
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), aroundInterval, pendingIntent);//first start will start asap

//and stopping
Intent intent = new Intent(getActivity(), MyReceiver.class);//the same as up
intent.setAction(MyReceiver.ACTION_ALARM_RECEIVER);//the same as up
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 1001, intent, PendingIntent.FLAG_CANCEL_CURRENT);//the same as up
alarmManager.cancel(pendingIntent);//important
pendingIntent.cancel();//important

//checking if alarm is working with pendingIntent
Intent intent = new Intent(getActivity(), MyReceiver.class);//the same as up
intent.setAction(MyReceiver.ACTION_ALARM_RECEIVER);//the same as up
boolean isWorking = (PendingIntent.getBroadcast(getActivity(), 1001, intent, PendingIntent.FLAG_NO_CREATE) != null);//just changed the flag
Log.d(TAG, "alarm is " + (isWorking ? "" : "not") + " working...");

এটি উল্লেখ করার মতো:

যদি পরে অ্যাপ্লিকেশন তৈরি করা (প্রক্রিয়া) একই ধরণের পেন্ডিং ইন্টেন্ট (একই ক্রিয়াকলাপ , একই উদ্দেশ্য - ক্রিয়াকলাপ, ডেটা, বিভাগ, উপাদানগুলি, পতাকাগুলি ) পুনরায় পুনরুদ্ধার করে তবে এটি যদি বৈধ হয় তবে একই টোকেনকে উপস্থাপন করে একটি পেন্ডিংইন্টেন্ট পাবেন এবং এবং এটি মুছে ফেলার জন্য এইভাবে কল করতে পারেন ()।

সংক্ষেপে, আপনার পেন্ডিং ইন্টেন্টের নিয়ন্ত্রণ নিতে একই বৈশিষ্ট্য (অপারেশন এবং অভিপ্রায়গুলির কাঠামো) থাকা উচিত।


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

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

দুর্দান্ত কাজ করে। ধন্যবাদ!
আম্ব্রান

1
দুর্দান্ত উদাহরণ তবে আমি সেখানে 1001 ব্যক্তিগত অনুরোধ কোড হিসাবে ব্যবহার করব না। উদাহরণটি আরও সুস্পষ্ট করতে কেবল 0।
ক্রিস

1
দয়া করে "শীর্ষ উত্তর" ইত্যাদি ব্যবহার থেকে বিরত থাকুন Instead পরিবর্তে উত্তরের একটি লিঙ্ক সরবরাহ করুন। কারণ উত্তরগুলি জনপ্রিয়তার ভিত্তিতে পৃষ্ঠায় অবস্থান পরিবর্তন করতে পারে।
কাঠির

44

অ্যালার্ম ম্যানেজারের সেট পদ্ধতির জন্য ডক্স থেকে এই উদ্ধৃতিটি নোট করুন:

যদি এই ইন্টেন্টটি নির্ধারিত জন্য ইতিমধ্যে একটি অ্যালার্ম থাকে (দুটি অভিপ্রায়ের সামঞ্জস্যতার সাথে ইনটেন্ট.ফিল্টারএকুয়ালস দ্বারা সংজ্ঞায়িত করা হয়), তবে এটি সরানো হবে এবং এটি দ্বারা প্রতিস্থাপন করা হবে।

আপনি যদি জানেন যে আপনি অ্যালার্ম সেটটি চান, তবে এটি ইতিমধ্যে বিদ্যমান কিনা তা খতিয়ে দেখার দরকার নেই। আপনার অ্যাপ্লিকেশন বুট করার সময় এটি কেবল তৈরি করুন। আপনি একই সাথে কোনও অতীত অ্যালার্ম প্রতিস্থাপন করবেন Intent

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


2
আমার মতে এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। যদি না
কোনও ওপিতে

আমার ক্ষেত্রে, আমি জানতে চাই যে অ্যালার্মটি ইতিমধ্যে সেট আছে কিনা এবং যদি তাই হয় তবে আমি নতুন একটি তৈরি করতে বা বিদ্যমান অ্যালার্মটি পুনরায় সেট করতে চাই না।
ইমরান আসলাম

2
চমত্কার উত্তর। ওপি কেন একেবারে চেক করল না? আপনার কিছু করার দরকার নেই।
বিজয় কুমার কান্ত

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

10

আমার কাছে 2 টি অ্যালার্ম রয়েছে। আমি ইভেন্টগুলি সনাক্ত করতে অ্যাকশনের পরিবর্তে অতিরিক্তগুলির সাথে অভিপ্রায় ব্যবহার করছি:

Intent i = new Intent(context, AppReciever.class);
i.putExtra("timer", "timer1");

জিনিসটি হ'ল ডিফের অতিরিক্তগুলির সাথে অভিপ্রায়টি (এবং অ্যালার্ম) অনন্য হবে না। সুতরাং কোন অ্যালার্মটি সক্রিয় রয়েছে বা না তা সনাক্ত করতে, আমাকে requestCodeডিফ-এস সংজ্ঞা দিতে হয়েছিল :

boolean alarmUp = (PendingIntent.getBroadcast(context, MyApp.TIMER_1, i, 
                    PendingIntent.FLAG_NO_CREATE) != null);

এবং এখানে কীভাবে অ্যালার্ম তৈরি হয়েছিল:

public static final int TIMER_1 = 1;
public static final int TIMER_2 = 2;

PendingIntent pending = PendingIntent.getBroadcast(context, TIMER_1, i,
            PendingIntent.FLAG_CANCEL_CURRENT);
setInexactRepeating(AlarmManager.RTC_WAKEUP,
            cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pending);
pending = PendingIntent.getBroadcast(context, TIMER_2, i,
            PendingIntent.FLAG_CANCEL_CURRENT);
setInexactRepeating(AlarmManager.RTC_WAKEUP,
            cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pending);

অভিপ্রায় অতিরিক্ত ব্যবহার করে এবং এই সমাধানটি আমার পক্ষে কাজ করে। কেবলমাত্র একটি পরিবর্তন আমি পরিষেবাটি ব্যবহার করছি তাই আমি এটিকে পরিবর্তন করেছিPendingIntent.getService
পঙ্কজ

8

সবেমাত্র আরেকটি সমাধান খুঁজে পেয়েছি, মনে হচ্ছে এটি আমার পক্ষে কাজ করে

Intent myIntent = new Intent(MainActivity.this, MyReceiver.class);

boolean isWorking = (PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, PendingIntent.FLAG_NO_CREATE) != null);
if (isWorking) {Log.d("alarm", "is working");} else {Log.d("alarm", "is not working");}

if(!isWorking) {
    pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent,    PendingIntent.FLAG_UPDATE_CURRENT);
    alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    int timeNotif = 5 * 60 * 1000;//time in ms, 7*24*60*60*1000 for 1 week
    Log.d("Notif", "Notification every (ms): " + timeNotif);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), timeNotif, pendingIntent);
    }

কখনও কখনও, মার্শমেলোতে, আপনি কোনও অ্যাপ্লিকেশনটিকে জোর করে থামানোর পরে, getBroadcast () অ-নাল ফিরে আসবে, তবে অ্যালার্ম সেট করা হয়নি।
হোপিয়া

6

যদিও এখানকার প্রায় প্রত্যেকেই সঠিক উত্তর দিয়েছেন, কোন ভিত্তিতে অ্যালার্মের কাজ কী তা ব্যাখ্যা করা হয়নি

আপনি এখানেAlarmManager এবং এর কাজ সম্পর্কে প্রকৃতপক্ষে আরও শিখতে পারেন । তবে এখানে দ্রুত উত্তর দেওয়া হল

আপনি ভবিষ্যতে AlarmManagerমূলত একটি সময়সূচী দেখুন PendingIntent। সুতরাং নির্ধারিত অ্যালার্ম বাতিল করার জন্য আপনাকে অবশ্যই বাতিল করতে হবে PendingIntent

তৈরির সময় সর্বদা দুটি জিনিস মনে রাখবেন PendingIntent

PendingIntent.getBroadcast(context,REQUEST_CODE,intent, PendingIntent.FLAG_UPDATE_CURRENT);
  • অনুরোধ কোড - অনন্য সনাক্তকারী হিসাবে কাজ করে Acts
  • পতাকা - এর আচরণ সংজ্ঞায়িত করে PendingIntent

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

PendingIntent pendingIntent=PendingIntent.getBroadcast(this,REQUEST_CODE,intent,PendingIntent.FLAG_NO_CREATE);

if (pendingIntent!=null)
   alarmManager.cancel(pendingIntent);

সঙ্গে FLAG_NO_CREATEএটা ফিরে আসবে nullযদি PendingIntentইতিমধ্যে বিদ্যমান নয়। এটি ইতিমধ্যে বিদ্যমান থাকলে এটি বিদ্যমান রেফারেন্স প্রদান করে returnsPendingIntent


যদি অনুরোধ কোডটি শনাক্তকারী হয় তবে ম্যাচিং অ্যাকশনের সাথে ইন্টেন্টটি পাস করা কি গুরুত্বপূর্ণ?
সেকুলা 1991

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

4

আমি একটি সাধারণ (বোকা বা না) বাশ স্ক্রিপ্ট তৈরি করেছি, এটি অ্যাডবি শেল থেকে লম্বা এক্সট্রাক্ট করে, টাইমস্ট্যাম্পগুলিতে রূপান্তর করে এবং এটি লাল দেখায়।

echo "Please set a search filter"
read search

adb shell dumpsys alarm | grep $search | (while read i; do echo $i; _DT=$(echo $i | grep -Eo 'when\s+([0-9]{10})' | tr -d '[[:alpha:][:space:]]'); if [ $_DT ]; then echo -e "\e[31m$(date -d @$_DT)\e[0m"; fi; done;)

এটি চেষ্টা করুন;)


1
    Intent intent = new Intent("com.my.package.MY_UNIQUE_ACTION");
            PendingIntent pendingIntent = PendingIntent.getBroadcast(
                    sqlitewraper.context, 0, intent,
                    PendingIntent.FLAG_NO_CREATE);

FLAG_NO_CREATE মুলতুবি থাকা উদ্দেশ্য তৈরি করে না যাতে এটি বুলিয়ান মানকে মিথ্যা দেয়।

            boolean alarmUp = (PendingIntent.getBroadcast(sqlitewraper.context, 0,
                    new Intent("com.my.package.MY_UNIQUE_ACTION"),
                    PendingIntent.FLAG_NO_CREATE) != null);

            if (alarmUp) {
                System.out.print("k");

            }

            AlarmManager alarmManager = (AlarmManager) sqlitewraper.context
                    .getSystemService(Context.ALARM_SERVICE);
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                    System.currentTimeMillis(), 1000 * 60, pendingIntent);

অ্যালার্ম ম্যানেজারটি মুলতুবি থাকা ইন্টেন্টের মানটি যাচাই করার পরে এটি সত্য দেয় কারণ অ্যালার্ম ম্যানেজারটি মুলতুবি ইন্টেন্টের পতাকাটি আপডেট করে।

            boolean alarmUp1 = (PendingIntent.getBroadcast(sqlitewraper.context, 0,
                    new Intent("com.my.package.MY_UNIQUE_ACTION"),
                    PendingIntent.FLAG_UPDATE_CURRENT) != null);
            if (alarmUp1) {
                System.out.print("k");

            }

0

আমি মনে করি যে এটি করার কোনও উপায় নেই, তবে এটি দুর্দান্ত হবে।

আপনি অ্যালার্ম_স্টাল_সেট_টাইম কোথাও রেকর্ড করে এবং অন_বুট_ স্টার্টার ব্রডকাস্টার রিসিভার: BOOT_COMPLETED কিন্ডা জিনিস রেখে একইরকম ফলাফল অর্জন করতে পারেন।

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