Android-будильник не работает - PullRequest
10 голосов
/ 11 января 2011

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

public class HelloAndroid2 extends Activity {  


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);   

    Intent intent = new Intent(this, AlarmReceiver.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
    intent, PendingIntent.FLAG_ONE_SHOT);

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent);
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();

}

 public final class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();

    }
 }

}

Ответы [ 3 ]

36 голосов
/ 11 января 2011

На самом деле вам не нужно указывать действие, так как вы используете класс AlarmReceiver.class в намерении.

В вашем AndroidManifest.xml убедитесь, что у вас есть определение получателя в тегах <application>, что-токак:

<receiver android:name="AlarmReceiver">

Редактировать: Хорошо, есть 2 способа использования вашего вещательного приемника.

1) Из предоставленного вами кода, AlarmReceiver.java, который будетсодержит:

public final class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();

    }
 }

и HelloAndroid2.java:

public class HelloAndroid2 extends Activity {  


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);   

    Intent intent = new Intent(this, AlarmReceiver.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
    intent, PendingIntent.FLAG_ONE_SHOT);

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent);
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();

}

}

Таким образом, вы можете настроить приемник вещания на работу с AndroidManifest.xml и тегом <receiver ...>

2) 2-й способ.Таким образом, вы можете использовать только 1 файл HelloWorld2.java:

. В своей деятельности создайте приемник и зарегистрируйте его.

public class HelloWorld2 extends Activity {
    private SharedPreferences prefs;
    private String mName;


    BroadcastReceiver alarmReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "Alarm worked", Toast.LENGTH_LONG).show();          
        }
    };


    public static final String ACTION_NAME = "com.helloworld.MYACTION";
    private IntentFilter myFilter = new IntentFilter(ACTION_NAME);


    @Override
    protected void onPause() {
        unregisterReceiver(alarmReceiver);
        super.onPause();
    }

    @Override
    protected void onResume() {
        registerReceiver(alarmReceiver, myFilter);
        super.onResume();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        registerReceiver(alarmReceiver, myFilter);

        Intent intent = new Intent(ACTION_NAME);        

        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
        intent, PendingIntent.FLAG_ONE_SHOT);

        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent);
        Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();


    }
11 голосов
/ 31 января 2013

У меня была такая же проблема, пока я не обнаружил, что я поместил свой Broadcast Receiver в другой пакет, а не в общий пакет.

Просто изменено:

<receiver android:name=".AndroidAlarmService" android:enabled="true" >

для:

<receiver android:name="com.MyCompany.MyPackage.AndroidAlarmService" android:enabled="true" >
0 голосов
/ 14 июля 2017

Если приведенный выше ответ не работает для вас, тогда есть другой способ не получать любые обратные вызовы, когда AlarmManager срабатывает с истекшим сроком тревоги. Вам просто нужно проверить это: , отправив неправильный Intent при создании экземпляра PendingIntent. Например, вы хотели получить вызов onReceive на один из ваших получателей, но вы создали PendingIntent через getActivity или getService, но на самом деле вы имели в виду getReceiver.

При создании экземпляра PendingIntent существует много способов его создания (getService, getActivity, getReceiver, getForegroundService:

если вы хотите Activity получатель намерения, то вы:

PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*);

если хотите BroadcastReceiver получатель намерения:

PendingIntent.getReceiver(this, 0, intent, PendingIntent.FLAG_*);

если вы хотите передний план Service получатель намерения:

PendingIntent.getForegroundService(this, 0, intent, PendingIntent.FLAG_*);

если вы хотите Service получатель намерения:

PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_*);

Кроме того, убедитесь, что вы намерены указывать на правильный класс. (например, создание намерений для деятельности, обслуживания и т. д.). Вы будете не получать любые вызовы, если вы передадите ошибочно, как это:

Intent intent = new Intent(this, MyReceiver.class); // You wanted receiver

// PendingIntent was created in such a way 
// you wanted this to be received by an activity. 
// you will not receive any call if you set it up like this.
PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*); 

Я также опубликовал аналогичный ответ здесь .

НТН

...