سؤال

أحتاج إلى تشغيل كتلة من التعليمات البرمجية بعد 20 دقيقة من AlarmManager يجري تعيين.

هل يمكن لأي شخص أن يظهر لي نموذج التعليمات البرمجية حول كيفية استخدام AlarmManager في أندرويد؟

لقد كنت ألعب مع بعض الكود لبضعة أيام ولن أعمل فقط.

هل كانت مفيدة؟

المحلول

"بعض رمز العينة" ليس بهذه السهولة عندما يتعلق الأمر AlarmManager.

هنا مقتطف تبين إعداد AlarmManager:

AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i=new Intent(context, OnAlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);

mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), PERIOD, pi);

في هذا المثال، أنا أستخدم setRepeating(). وبعد إذا كنت تريد إنذار طلقة واحدة، فستستخدم فقط set(). وبعد تأكد من إعطاء الوقت للإنذار للبدء في نفس قاعدة الوقت كما كنت تستخدم في المعلمة الأولية ل set(). وبعد في مثالي أعلاه، أنا أستخدم AlarmManager.ELAPSED_REALTIME_WAKEUP, ، لذلك قاعدة وقتك هي SystemClock.elapsedRealtime().

هنا مشروع نموذج أكبر تظهر هذه التقنية.

نصائح أخرى

هناك بعض الأمثلة الجيدة في رمز نموذج أندرويد

. Android-SDK Samples Android-10 Apidemos SRC SRC com سبيل المثال android apis app

تلك التي يجب التحقق منها هي:

  • إنذار navcontroller.java.
  • oneshotalarm.java.

أولا، تحتاج إلى جهاز استقبال، شيء يمكنه الاستماع إلى إنذارك عند تشغيله. أضف ما يلي إلى ملف Androidmanifest.xml

<receiver android:name=".MyAlarmReceiver" />

ثم، قم بإنشاء الفصل التالي

public class MyAlarmReceiver extends BroadcastReceiver { 
     @Override
     public void onReceive(Context context, Intent intent) {
         Toast.makeText(context, "Alarm went off", Toast.LENGTH_SHORT).show();
     }
}

ثم، لتشغيل المنبه، استخدم ما يلي (على سبيل المثال في نشاطك الرئيسي):

AlarmManager alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, MyAlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
Calendar time = Calendar.getInstance();
time.setTimeInMillis(System.currentTimeMillis());
time.add(Calendar.SECOND, 30);
alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pendingIntent);

.


أو، الأفضل من ذلك، اصنع فئة تعالج كل شيء واستخدامه مثل هذا

Bundle bundle = new Bundle();
// add extras here..
MyAlarm alarm = new MyAlarm(this, bundle, 30);

بهذه الطريقة، لديك كل شيء في مكان واحد (لا تنس تحرير AndroidManifest.xml)

public class MyAlarm extends BroadcastReceiver {
    private final String REMINDER_BUNDLE = "MyReminderBundle"; 

    // this constructor is called by the alarm manager.
    public MyAlarm(){ }

    // you can use this constructor to create the alarm. 
    //  Just pass in the main activity as the context, 
    //  any extras you'd like to get later when triggered 
    //  and the timeout
     public MyAlarm(Context context, Bundle extras, int timeoutInSeconds){
         AlarmManager alarmMgr = 
             (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
         Intent intent = new Intent(context, MyAlarm.class);
         intent.putExtra(REMINDER_BUNDLE, extras);
         PendingIntent pendingIntent =
             PendingIntent.getBroadcast(context, 0, intent, 
             PendingIntent.FLAG_UPDATE_CURRENT);
         Calendar time = Calendar.getInstance();
         time.setTimeInMillis(System.currentTimeMillis());
         time.add(Calendar.SECOND, timeoutInSeconds);
         alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(),
                      pendingIntent);
     }

      @Override
     public void onReceive(Context context, Intent intent) {
         // here you can get the extras you passed in when creating the alarm
         //intent.getBundleExtra(REMINDER_BUNDLE));

         Toast.makeText(context, "Alarm went off", Toast.LENGTH_SHORT).show();
     }
}

ما عليك القيام به هو أولا إنشاء النية التي تحتاج إلى جدولة. ثم الحصول على رينفاندي من تلك النية. يمكنك جدولة الأنشطة والخدمات والبث. لجدولة نشاط، على سبيل المثال myactivity:

  Intent i = new Intent(getApplicationContext(), MyActivity.class);
  PendingIntent pi = PendingIntent.getActivity(getApplicationContext(),3333,i,
  PendingIntent.FLAG_CANCEL_CURRENT);

امنح هذا على الانتقال إلى AlarmManager:

  //getting current time and add 5 seconds in it
  Calendar cal = Calendar.getInstance();
  cal.add(Calendar.SECOND, 5);
  //registering our pending intent with alarmmanager
  AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
  am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), pi);

الآن سوف يكون myactivity تم إطلاقه بعد 5 ثوان من بدء التطبيق، بغض النظر عن توقف تطبيقك أو جهازك في حالة النوم (بسبب خيار rtc_wakeup). يمكنك قراءة رمز المثال الكامل جدولة الأنشطة والخدمات والبث #Android

أردت التعليق ولكن <50 مندوب، لذلك هنا يذهب. تذكير ودية أنه إذا كنت تعمل على 5.1 أو أعلى وتستخدم فاصل زمني أقل من دقيقة، فحدث هذا:

Suspiciously short interval 5000 millis; expanding to 60 seconds

يرى هنا.

بعض التعليمات البرمجية عينة عندما تريد استدعاء خدمة من InformManager:

PendingIntent pi;
AlarmManager mgr;
mgr = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(DataCollectionActivity.this, HUJIDataCollectionService.class);    
pi = PendingIntent.getService(DataCollectionActivity.this, 0, i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() , 1000, pi);

ليس عليك أن تسأل Upermermissions.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top