2014-12-18 58 views
2

在我的應用程序有一個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(); 
    } 
} 

現在我的問題是,每次我收到廣播的變量lastState時間是百達假的。我確信onReceive方法調用正確。你有什麼想法,爲什麼?對我來說,每次接收廣播時,BroadcastReceiver都會重新初始化。這是對的,如果是的話,我該如何避免這個問題?我BroadcastReceiver在清單registerd這樣的:

<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實例,至少如果通過清單自動註冊的話。您可以通過使變量靜態並在類的所有實例之間共享變量來解決此問題。但是你不能在廣播之間保存實例變量。

+4

即使靜態也無濟於事,因爲顯然這個過程將在廣播之間終止。靜態數據成員只是一個緩存。任何必須經歷過程終止的事情都需要寫入磁盤。 – CommonsWare 2014-12-18 23:45:36

+2

Atention,CommonsWare是正確的。 – TiagoPereira17 2014-12-18 23:47:19

+0

感謝您在評論中提供此信息。所以我必須寫信給'SharedPreferences'例如?將在10分鐘內除外 – Cilenco 2014-12-18 23:48:48

0

如果您使用Dynamic BroadcastReceiver(通過Context.registerReceiver()Context.unregisterReceiver()註冊和取消註冊),接收方可以保存其成員字段。 AndroidManifest.xml註冊的BroadcastReceiver不能。因爲每次收到廣播時都會創建一個新實例。