2012-04-28 6 views
0

Я написал простую деятельность, чтобы протестировать службы и приемники-бракасты и службу, чтобы согласиться с ней. Чтобы узнать, работает ли он, я настроил Toast в основном действии, который будет показан после вызова метода OnReceive(). Но для жизни я не могу заставить это работать.Android: широковещательный приемник и проблемы с обслуживанием

Эти коды:

общественный класс ServicesAndBroadcastIntentActivity расширяет активность {

private Toast test; 
private Intent intent; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    intent = new Intent(this,serviceD.class); 
    test = Toast.makeText(this,"Test",Toast.LENGTH_LONG); 
    test.setGravity(Gravity.CENTER,0,0); 
} 

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     test.setText((intent.getStringExtra("EXTRA_MSG"))); 
     test.show(); 
    } 
}; 


@Override 
public void onResume(){ 
    super.onResume(); 
    startService(intent); 
    registerReceiver(broadcastReceiver, new IntentFilter(serviceD.BROADCAST_ACTION)); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    unregisterReceiver(broadcastReceiver); 
    stopService(intent);   
} 

}

общественного класса Serviced расширяет службы {

private Intent intent; 
static final String BROADCAST_ACTION = "com.mejg.ServicesAndBroadcastIntent"; 

public void onCreate() { 
    super.onCreate(); 
    intent = new Intent(BROADCAST_ACTION); 
} 

public void onStart(){ 
    intent.putExtra("EXTRA_MSG","hola"); 
    sendBroadcast(intent); 
    stopSelf(); 
} 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

}

ответ

1

Вы звоните startService() до registerReceiver(). Оба являются асинхронными операциями, но они все равно будут возникать последовательно. Следовательно, onStart() вашей услуги будет вызываться до того, как registerReceiver() выполнит свою работу, что означает, что ваша трансляция выходит до настройки вашего ресивера.

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

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

Также вы можете использовать LocalBroadcastManager для этого - тот же базовый синтаксис с лучшей производительностью и безопасностью, поскольку он все остается в вашем процессе.

UPDATE

Кроме того, также также, onStart() устарел за два с лишним лет, и ваш метод подписи для него не так, во всяком случае. Пожалуйста, используйте onStartCommand(), с правильными параметрами.

Также, также используйте @Override при переопределении методов, чтобы помочь вам уловить эти проблемы.

+0

Я сделал то, что вы предлагали, начиная службу с кнопки и регистрируя приемник перед запуском службы, и он, похоже, не работает. Любое другое предложение? –

+0

@rodkarom: Не с головы. FWIW, вот пример использования «LocalBroadcastManager» с почти идентичной настройкой на ваш (хотя я использую «TextView» вместо «Toast»). Вы можете временно избавиться от 'setGravity()', чтобы упростить «Toast», в случае, если это как-то испортилось - я редко меняю силу «Тоста». – CommonsWare

+0

Еще одно сомнение ... Нужно ли объявлять фильтр намерений в моем AndroidManifest.xml? –

Смежные вопросы