অ্যান্ড্রয়েড অ্যালার্ম ম্যানেজার - আরটিসি_ডাক


87

কেউ আমাকে মধ্যে পার্থক্য ব্যাখ্যা করতে পারবেন AlarmManager.RTC_WAKEUPএবং AlarmManager.ELAPSED_REALTIME_WAKEUP? আমি ডকুমেন্টেশনটি পড়েছি তবে এখনও অন্যটির উপরের ব্যবহারের বোঝাটি বুঝতে পারি না।

উদাহরণ কোড:

    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
                     scheduledAlarmTime, 
                     pendingIntent);

    alarmManager.set(AlarmManager.RTC_WAKEUP, 
                     scheduledAlarmTime, 
                     pendingIntent);

দুই লাইনের কোড কার্যকর করা কতটা পৃথক হবে? এই দুটি লাইনের কোড কখন একে অপরের সাথে সম্পর্কিত হবে?

আমি তোমার সাহায্য কে সাধুবাদ জানাই.

উত্তর:


141

AlarmManager.ELAPSED_REALTIME_WAKEUP টাইপটি বুটের সময় থেকে অ্যালার্মকে ট্রিগার করতে ব্যবহৃত হয়:

alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 600000, pendingIntent);

ডিভাইস বুট হওয়ার 10 মিনিটের পরে অ্যালার্মটি আসলে বন্ধ করে দেবে ।

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

যদিও, AlarmManager.RTC_WAKEUPঘড়ির সময় অনুযায়ী অ্যালার্মটি ট্রিগার করবে। উদাহরণস্বরূপ:

long thirtySecondsFromNow = System.currentTimeMillis() + 30 * 1000;
alarmManager.set(AlarmManager.RTC_WAKEUP, thirtySecondsFromNow , pendingIntent);

অন্যদিকে এটি এখন থেকে 30 সেকেন্ড পরে অ্যালার্মটি ট্রিগার করবে ।

AlarmManager.ELAPSED_REALTIME_WAKEUPটাইপ তুলনায় খুব কমই ব্যবহৃত হয় AlarmManager.RTC_WAKEUP


4
আমি যা ভেবেছিলাম. আমার শুধু কিছু কনফার্মেশন দরকার ছিল। সুতরাং যদি আমি এটির মতো কিছু করি: অ্যালার্ম ম্যানেজআরসেট (অ্যালার্ম ম্যানেজ। অদ্ভুত জিনিসগুলি ঘটতে পারে (যা আমি যতক্ষণ না লক্ষ্য করেছিলাম যে এটি ভেবেছিল ঠিক তেমন কাজ করছে না
কেমিল স্যাভিগনি

4
দয়া করে মনে রাখবেন যে কোডটি :) এর System.currentTimeMillis()পরিবর্তে হওয়া উচিত:System.currentTimeMills()
হাসানআবোশাল্লি

17
"অ্যালার্ম ম্যানেজ.এলাপসইডিআলএলপিআইএমএলটিআইএমএইচএসইউপি টাইপ খুব কমই অ্যালার্ম ম্যানেজ.আরটিসি_ওয়াকআপের তুলনায় ব্যবহৃত হয়।" এটি জল্পনা এবং খারাপ পরামর্শ। ডকুমেন্টেশন অনুসারে: " ডেভেলপার.অ্যান্ড্রয়েড / ট্রেনিং / এসচুলেডিং / আলআরএমএস एचটিএমএল" যদি আপনার কোনও নির্দিষ্ট বিরতিতে উদাহরণস্বরূপ আপনার অ্যালার্মের প্রয়োজন হয় (উদাহরণস্বরূপ, প্রতি অর্ধ ঘন্টা), অতিবাহিত রিয়েল টাইম ধরণের একটি ব্যবহার করুন In সাধারণ, এটি আরও ভাল পছন্দ। "
জ্যারেড কেলস

4
@ mborsuk এর উত্তর ভাল এবং এই উত্তরটি সংশোধন হল: আপনি ব্যায়িত সময় জন্য আরটিসি ব্যবহার করা উচিত নয় মত thirtySecondsFromNow
মিচা এফ।

4
খুব ভাল ব্যাখ্যা :)! আমি একটি গুরুত্বপূর্ণ মন্তব্য যুক্ত করতে চাই: অ্যান্ড্রয়েড থেকে অফিসিয়াল ডকুমেন্ট সম্পর্কে, "AlarmManager.ELAPSED_REALTIME_WAKEUP" ব্যবহার করা যখন আকর্ষণীয় কিছু হতে পারে যখন কোনও অ্যাপ্লিকেশন আসে যা কোনও সার্ভারে এইচটিটিপি অনুরোধ চালায় এবং আপনি কোনও উত্পন্ন করতে চান না আপনার ওয়েব সার্ভারে লোড করুন। হাজার হাজার অ্যান্ড্রয়েড ডিভাইসগুলির বিষয়ে চিন্তা করুন, কোনও ওয়েব সার্ভারগুলিতে জিইটি সম্পাদন করে, সকাল সাড়ে দশটায়: "ডিভাইসের বুট সময় ধরে কাজ করার কারণে," অ্যালার্ম ম্যানেজ। একই সময়ে, বোঝা এড়ানো :)।
ivanleoncz

107

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

এলআরএমইডিএলএলএলপিআইএমএলটিআইএম.ইউইকিইউপি ব্যবহার করে অ্যালার্মম্যানেজার বুট সময় থেকে শুরু করে একঘেয়ে ঘড়ির উপর নির্ভর করবে " এবং সিপিইউ পাওয়ার সাশ্রয়ী মোডে থাকা অবস্থায়ও টিক দেওয়া অবিরত থাকবে, তাই সাধারণ উদ্দেশ্য ব্যবস্থার সময়কালের জন্য প্রস্তাবিত ভিত্তি "। সুতরাং,

alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()
                 + 60*1000, pendingIntent);

আপনার মুলতুবিকরণের আগুনটি 1 মিনিটে (60 * 1000 মিলিসেকেন্ড) তৈরি করবে।

অন্যদিকে, অ্যালার্ম ম্যানেজ.আরটিসি_ওয়াকইউপি যুগের পর থেকে মিলি সেকেন্ডে স্ট্যান্ডার্ড "ওয়াল" সময়ের জন্য। সুতরাং,

alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()
                 + 60*10000, pendingIntent);

এছাড়াও এখন থেকে 60 সেকেন্ড পরে অ্যালার্মটি ট্রিগার করতে পারে তবে নির্ভরযোগ্যভাবে নয়, কারণ সিস্টেমক্লক ডকুমেন্টেশনে উল্লিখিত হয়েছে :

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

এছাড়াও, প্রশ্ন কেবলমাত্র শুধুমাত্র * _WAKEUP এলার্ম রেফারেন্সড কিন্তু দেখতে AlarmManager যে ডকুমেন্টেশন নিশ্চিত করুন যে আপনি বুঝতে ওয়েকআপ বনাম অ ওয়েকআপ এলার্ম কি প্রদান করা।


আপনার প্রতিক্রিয়া দুর্দান্ত, তবে আমার আবেদনে আমাকে এমন অ্যালার্ম সেট করা দরকার যা এখনকার from০ সেকেন্ডের মতো নয়, আসল বিশ্বের তারিখ / সময়গুলির সাথে মিলে যায়। সেক্ষেত্রে আরটিসি_ওয়াকইইপি ​​আমার পক্ষে সেরা সমাধান।
ক্যামিল স্যাভিগনি

8
এটি ঠিক আছে তবে এটি প্রশ্নের আরও সঠিক উত্তর এবং বর্তমানে গৃহীত উত্তরে জিনিসগুলি সংশোধন করে।
mborsuk

এই তথ্য কিন্তু মনে রাখবেন যে জন্য +1 elapsedRealtime()অধীনে SystemClockপরিবর্তে System। সম্পাদনা: ... দৈনিক ভোটের সীমা পৌঁছেছে ...
জোর্হে ফুয়েন্তেস গঞ্জালেজ

এটি সেখানে ইস্যুতে সেরা উত্তরগুলির মধ্যে একটি। আমি একটি 50 মি উচ্চ উঁচু খড়ের সন্ধানে (যেমন "আমার কোডের একটি বাগ!") অনুসন্ধান করছি এবং আপনার উত্তর আমাকে সোজা সুইতে নিয়ে গেছে!
অ্যালেক্সড্রয়েডদেভ

17

শুধু একটি নোট. আপনি আপটাইম মিলিস কলিং করতে পারেন:

long uptimeMillis =  SystemClock.elapsedRealtime();

সুতরাং আপনি যদি এখন থেকে ৩০ সেকেন্ড পরে অ্যালার্মটি চালাতে চান এবং আপনি সাধারণ ঘড়ির পরিবর্তে আপটাইম ক্লকটি ব্যবহার করতে চান তবে আপনি এটি করতে পারেন:

long thirtySecondsFromNow =  SystemClock.elapsedRealtime() + 30 * 1000;
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, thirtySecondsFromNow, pendingIntent);

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


4
"যখনই আপনি অতিবাহিত সময়ের জন্য চেক করতে চান" ব্যবহার করতে ইঙ্গিত করার জন্য +1। পুরোপুরি জ্ঞান করে তোলে।
সোলাই

আবার কেবল চাপ দেওয়ার জন্য: আমার বোঝা হ'ল ডিভাইসটি বন্ধ হয়ে যাওয়ার মতো কিছু না ঘটলে এটি এখন থেকে 30 সেকেন্ডের মধ্যে অবশ্যই ছড়িয়ে পড়বে। দৃc়ভাবে, আমি মনে করি আরটিসি_ওয়াকইউপি ব্যবহারের সাথে সমস্যাটি হ'ল অক্টোবরের শেষের দিকে কোনও শনিবার 1am এর মতো কিছু হয়ে যায় এবং সিস্টেমের ঘড়িটি 1 ঘন্টা পিছনে ফিরে যায় (মার্কিন যুক্তরাষ্ট্রে এবং বেশিরভাগ অংশে) ইউরোপ, কমপক্ষে), সুতরাং অ্যালার্মটি সেট হওয়ার পরে 1 ঘন্টা 30 সেকেন্ড পর্যন্ত আসলে ট্রিগার করে না।
ইয়্যানিক

2

আমি আমার নিজের প্রকল্পে এই সমস্যাটি প্রোগ্রাম করেছিলাম। নীচে কোড আমি ব্যবহার করছি

AlarmManager.ELAPSED_REALTIME_WAKEUP

একটি নির্দিষ্ট সময়ে অ্যালার্ম সেট করতে। ভেরিয়েবল 'ইন্টেন্টনাম' এই অ্যালার্মটি রিসিভার করতে ইন্টেন্টফিল্টারে ব্যবহৃত হয়। কারণ আমি এই ধরণের অনেক অ্যালার্ম ফায়ার করছি। যখন আমি সমস্ত অ্যালার্ম বাতিল করি। আমি বাতিল পদ্ধতি ব্যবহার। নীচে দেওয়া

// এলার্ম রাখা এবং যখন প্রয়োজন বাতিল করতে

     public static ArrayList<String> alarmIntens = new ArrayList<String>();

//

    public static String setAlarm(int hour, int minutes, long repeatInterval,
        final Context c) {
    /*
     * to use elapsed realTime monotonic clock, and fire alarm at a specific time
     * we need to know the span between current time and the time of alarm.
     * then we can add this span to 'elapsedRealTime' to fire the alarm at that time
     * this way we can get alarms even when device is in sleep mood
    */
    Time nowTime = new Time();
    nowTime.setToNow();
    Time startTime = new Time(nowTime);
    startTime.hour = hour;
    startTime.minute = minutes;
    //get the span from current time to alarm time 'startTime'
    long spanToStart = TimeUtils.spanInMillis(nowTime, startTime);
    //
    intentName = "AlarmBroadcast_" + nowTime.toString();
    Intent intent = new Intent(intentName);
    alarmIntens.add(intentName);
    PendingIntent pi = PendingIntent.getBroadcast(c, alarms++, intent,
            PendingIntent.FLAG_UPDATE_CURRENT);
    //
    AlarmManager am = (AlarmManager) c
            .getSystemService(Context.ALARM_SERVICE);
    //adding span to elapsedRealTime
    long elapsedRealTime = SystemClock.elapsedRealtime();
    Time t1 = new Time();
    t1.set(elapsedRealTime);
    t1.second=0;//cut inexact timings, seconds etc
    elapsedRealTime = t1.toMillis(true);

    if (!(repeatInterval == -1))
        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                elapsedRealTime + spanToStart, repeatInterval, pi);
    else
        am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, elapsedRealTime
                + spanToStart, pi);

স্প্যান ফাংশনটি এটি যেখানে:

 public static long spanInMillis(Time startTime, Time endTime) {
    long diff = endTime.toMillis(true) - startTime.toMillis(true);
    if (diff >= 0)
        return diff;
    else
        return AlarmManager.INTERVAL_DAY - Math.abs(diff);
}

অ্যালার্ম বাতিল ফাংশন এটি।

public static void cancel(Context c) {
    AlarmManager am = (AlarmManager) c
            .getSystemService(Context.ALARM_SERVICE);
    // cancel all alarms
    for (Iterator<String> iterator = alarmIntens.iterator(); iterator
            .hasNext();) {
        String intentName = (String) iterator.next();
        // cancel
        Intent intent = new Intent(intentName);
        PendingIntent pi = PendingIntent.getBroadcast(c, 0, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        am.cancel(pi);
        //
        iterator.remove();
    }
}

1

কোন অ্যালার্মটি ব্যবহার করবেন তা চয়ন করার সময় কয়েকটি গুরুত্বপূর্ণ নোট : (যার জন্য ইতিমধ্যে উন্নত ভোট পড়েছেন)

RTC_WAKEUP ডেথ ভ্যালি - সময় পরিবর্তন:
ব্যবহারকারী বিপদাশঙ্কা গত ম্যানুয়ালি পরিবর্তন সময় বন্ধ যেতে হবে না, এবং ভবিষ্যতে বিপদাশঙ্কা গত যদি তা অবিলম্বে বন্ধ করার কারণ হবে তাহলে RTCটাইমস্ট্যাম্প।
করো নাকোনও ক্লায়েন্টের পাশ যাচাই / গুরুত্বপূর্ণ কাজ করতে এই অ্যালার্মটি ব্যবহার কারণ এতে ব্যর্থ হওয়ার সুযোগ রয়েছে।

WAKEUP অর্থ (Marshmallow এ এবং পরবর্তী)
সাধারণভাবে - অনেক না। ডিভাইস যখন ওয়েকআপ করবে না idleবা সময় dozeযে জন্য, alarmManager.setExactAndAllowWhileIdleবা alarmManager.setAndAllowWhileIdle( Doze এর & নিষ্ক্রিয় )

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