2014-12-18 4 views
2

В моем приложении у меня есть BroadcastReceiver, который выглядит примерно так:BroadcastReceiver не сохраняет локальную переменную

public class MyBroadcastReceiver extends BroadcastReceiver 
{ 
    public static final String CUSTOM_BROADCAST_1 = "com.cilenco.application1"; 
    public static final String CUSTOM_BROADCAST_2 = "com.cilenco.application2"; 

    private boolean lastState = false; 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     final String action = intent.getAction(); 

     boolean cb1 = CUSTOM_BROADCAST_1.equals(action); 
     boolean cb2 = CUSTOM_BROADCAST_2.equals(action); 

     if(cb1) lastState = true; 
     else if(cb2) lastState = false; 

     Toast.makeText(context, "" + lastState, Toast.LENGTH_LONG).show(); 
    } 
} 

Теперь моя проблема заключается в том, что каждый раз, когда я получаю Broadcast переменная lastState всегда находится ложь. Я уверен, что метод onReceive вызывается правильно. У вас есть идеи, почему это так? Для меня это похоже, что BroadcastReceiver повторно инициализирует каждый раз, когда получает широковещательную передачу. Правильно ли, и если да, то как я могу избежать этой проблемы? Мой BroadcastReceiver зарегистрированный в манифесте, как это:

<receiver 
    android:name="service.MyBroadcastReceiver" 
    android:enabled="true" 
    android:exported="false" > 
    <intent-filter> 
     <action android:name="com.cilenco.application1"/> 
     <action android:name="com.cilenco.application2"/> 
    </intent-filter> 
</receiver> 

ответ

5

BroadcastReceivers не сохраняется между передачами. Каждая трансляция создаст новый экземпляр BroadcastReceiver, по крайней мере, если он будет автоматически зарегистрирован через манифест. Вы можете обойти это, сделав переменную static и передав ее между всеми экземплярами класса. Но вы не можете сохранять переменные экземпляра между трансляциями.

+4

Даже статический не поможет, так как это очень вероятно, что процесс будет прекращен между трансляциями. Статические члены данных - это только кеш. Все, что должно выдержать завершение процесса, должно быть записано на диск. – CommonsWare

+2

Внимание, CommonsWare - это правильно. – TiagoPereira17

+0

Благодарим вас за эту информацию и в комментариях. Так что я должен написать, например, в «SharedPreferences»? Будет за исключением 10 минут – Cilenco

0

Если вы используете динамический BroadcastReceiver (зарегистрируйтесь и отмените регистрацию через Context.registerReceiver() и Context.unregisterReceiver()), ресивер может сохранить поле своего члена. BroadcastReceiver, зарегистрированный AndroidManifest.xml, не может. Потому что он создает новый экземпляр каждый раз, когда он получает трансляцию.

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