Android Alarm Manager с широковещательным приемником, зарегистрированным в коде, а не в манифесте

Я хочу использовать будильник для запуска кода в определенное время. Я успешно реализовал тревогу с приемником вещания, зарегистрированным в манифесте, но, насколько я понимаю, этот метод использует отдельный класс для приемника вещания.

Я могу использовать этот метод для запуска другого действия, но я не могу использовать его для запуска метода в своем основном действии?

(как я могу уведомить о текущей активности из широковещательный приемник?)

Итак, я пытался зарегистрировать свой широковещательный приемник в своей основной деятельности, как описано в ответе выше.

private BroadcastReceiver receiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "hello", Toast.LENGTH_SHORT).show();
        uploadDB();         
    }
};    

public void onResume() {
    super.onResume();

    IntentFilter filter = new IntentFilter();
    filter.addAction(null);

    this.registerReceiver(this.receiver, filter);
}

public void onPause() {
    super.onPause();

    this.unregisterReceiver(this.receiver);
}

Однако мне не удалось заставить это работать с диспетчером тревог, я не уверен, как мне связать намерение тревоги с широковещательным приемником. Может ли кто-нибудь указать мне пример динамической регистрации широковещательного приемника диспетчера аварийных сигналов в действии? Или объясните, как мне это сделать?


person Shane    schedule 10.08.2010    source источник


Ответы (2)


Как насчет этого?

Intent startIntent = new Intent("WhatEverYouWant");
PendingIntent startPIntent = PendingIntent.getBroadcast(context, 0, startIntent, 0);
AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarm.set(AlarmManager.RTC_WAKEUP, triggerTime, startPIntent);

А затем в вашем файле Manifest.xml:

<receiver android:name="com.package.YourOnReceiver">
   <intent-filter>
       <action android:name="WhatEverYouWant" />
   </intent-filter>
</receiver>

Насколько я знаю, вам все равно нужно объявить получателя в манифесте. Я не уверен, что вы можете установить его в частный экземпляр внутри своей деятельности. Вы можете объявить onReceive внутри своей активности и вызвать это (если у BroadcastReceiver есть интерфейс. Я не знаю, есть ли он).

person user123321    schedule 15.08.2011
comment
Круто, мне удалось заставить его работать, хотя мне не нужно было добавлять код в манифест. Только что зарегистрировал широковещательный приемник прогамически с одноименным фильтром намерений. - person serenskye; 17.08.2012
comment
@serenskye Мой код не работает без регистрации в манифесте. Как вы отделались от этого? - person Shubham Agrawal; 20.07.2020

Запустите намерение будильника с того места, где вы хотите запустить будильник. напишите ниже код, с которого вы хотите начать прослушивание будильника

Intent myIntent = new Intent(getBaseContext(), **AlarmReceiver**.class);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, myIntent, 0);
                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
                Calendar calendar = Calendar.getInstance();
                calendar.setTimeInMillis(System.currentTimeMillis());
                calendar.add(Calendar.MINUTE, shpref.getInt("timeoutint", 30));
                alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

И в широковещательном приемнике напишите код, который хотите получить. И в манифесте напишите ниже

<receiver android:name=".AlarmReceiver" android:process=":remote"/>

Вы также можете поставить повторяющийся будильник. Надеюсь, это поможет!

person Dhrupal    schedule 16.08.2012