Мое приложение должно сделать тост, когда пользователь разблокирует экран, поэтому я зарегистрировал BroadcastReceiver
чтобы забрать намерение ACTION_USER_PRESENT
в манифесте, например:
<receiver android:name=".ScreenReceiver" > <intent-filter> <action android:name="android.intent.action.USER_PRESENT"/> </intent-filter> </receiver>
И тогда я определил класс следующим образом:
package com.patmahoneyjr.toastr; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class ScreenReceiver extends BroadcastReceiver { private boolean screenOn; private static final String TAG = "Screen Receiver"; @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)) { screenOn = true; Intent i = new Intent(context, toastrService.class); i.putExtra("screen_state", screenOn); context.startService(i); Log.d(TAG, " The screen turned on!"); } else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { screenOn = false; } } }
Но по какой-то причине оператор журнала печатается дважды, а мой сервис делает два тоста вместо одного. Кто-нибудь знает, почему это может произойти, и что я могу сделать, чтобы остановить его? Я не замечаю что-то глупое?
EDIT: Мне очень жаль всех, но я сам нашел проблему … ошибка заключалась в том, что в классе обслуживания, который должен был получить трансляцию, я создал экземпляр нового ScreenReceiver, и он тоже собирал намерение. Я неправильно понял класс и подумал, что для получения намерения я должен был иметь его там, но после удаления этого блока я получаю только одно намерение. Android не отправлял намерение дважды, он просто собирался дважды … Спасибо за вашу помощь всем!
Попробуй это:
1. Просто создайте приемник вещания.
BroadcastReceiver reciever_ob = new BroadcastReceiver( @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(action.equals(Intent.ACTION_USER_PRESENT)){ //DO YOUR WORK HERE } } }
2. Зарегистрируйте ваш ресивер перед отправкой трансляции с помощью вышеперечисленного объекта вещания. Вы также можете добавить несколько действий.
IntentFilter actions = new IntentFilter(Intent.ACTION_USER_PRESENT); registerReciever(reciever_ob, actions);
3. Отправить трансляцию
Intent intent = new Intent(Intent.ACTION_USER_PRESENT); SendBroadcast(intent);
Теперь вы можете удалить все свои материалы, которые вы указали в файле xml-manifest, который я точно не знаю, но я думаю, что он должен работать.