2013-03-29 4 views
2

OnReceive метод не вызывается по какой-то причине
я не применял каких-либо фильтров или что-нибудь,Почему OnReceive не называется расширением BroadcastReceiver в Android

Вот класс:

import java.util.ArrayList; 
import java.util.Calendar; 

import android.content.BroadcastReceiver; 
import android.content.Intent; 
import android.content.Context; 
import android.util.Log; 

public class RegisterListener extends BroadcastReceiver { 
private final int DELAY_TIME = 5; 
private int m_seconds = 0; 
private int m_minutes = 0; 
private int m_hours = 0; 
static ArrayList<BroadcastReceiverListener> listeners = new ArrayList<BroadcastReceiverListener>(); 

@Override 
public void onReceive(Context context, Intent intent) { 

    Log.d("ScreenReceiver Action:",intent.getAction()); 

    Calendar c = Calendar.getInstance(); 
    m_seconds = c.get(Calendar.SECOND); 
    m_minutes = c.get(Calendar.MINUTE); 
    m_hours = c.get(Calendar.HOUR); 

    for (BroadcastReceiverListener listener:listeners){ 
      listener.onReceive(m_hours, m_minutes, m_seconds); 
     } 
} 


public static void addBroadcastReceiveListener (BroadcastReceiverListener listener){ 
    if(!listeners.contains(listener)){ 
     listeners.add(listener); 
    } 
} 

public void removeBroadcastReceiveListener (BroadcastReceiverListener listener){ 
    if(listeners.contains(listener)){ 
     listeners.remove(listener); 
    } 
} 

Вот заявление в манифесте (ребенок применения)

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

Edit: Это фильтр я пытался добавить (внутри OnReceive())

IntentFilter filter = new IntentFilter(Intent.ACTION_USER_PRESENT); 
    BroadcastReceiver mReceiver = new RegisterListener(); 
    registerReceiver(mReceiver, filter); 

Я получаю сообщение об ошибке:

The method registerReceiver(BroadcastReceiver, IntentFilter) is undefined for the type RegisterListener 
+1

Выглядит хорошо, как вы транслируете свои намерения? Отправьте этот код. – Sam

+0

Как насчет 'намеренного фильтра 'в декларации получателя; проверить http://www.vogella.com/articles/AndroidBroadcastReceiver/article.html – Trinimon

+0

Я хочу поймать 'ACTION_USER_PRESENT', прежде чем добавлять какие-либо фильтры, не должен ли я поймать никаких намерений без него? во всяком случае, я попытался добавить фильтры, но если я добавлю фильтр, он не сможет найти метод 'registerReceiver'. – SagiLow

ответ

4

Если вы всегда хотите слушать ACTION_USER_PRESENT, попробуйте:

<receiver android:name=".RegisterListener"> 
    <intent-filter> 
     <action android:name="android.intent.action.USER_PRESENT" /> 
    </intent-filter> 
</receiver> 

Пояснения

The method registerReceiver(BroadcastReceiver, IntentFilter) is undefined for the type RegisterListener 

Вы должны использовать registerReceiver() с контекстом, например context.registerReceiver(...). Но:

Это фильтр я пытался добавить (внутри OnReceive())

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

IntentFilter filter = new IntentFilter(Intent.ACTION_USER_PRESENT); 
BroadcastReceiver mReceiver = new RegisterListener(); 
registerReceiver(mReceiver, filter); 

Это будет только слушать ACTION_USER_PRESENTпока ваше приложение уже запущено.

0
IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction(BROADCAST_STARTED_ACTION); 
     intentFilter.addAction(BROADCAST_SUCCESS_ACTION); 
     intentFilter.addAction(BROADCAST_FAILURE_ACTION); 
     LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(broadCastReceiver, intentFilter); 
Смежные вопросы