BroadcastReceiver不保存本地变量

时间:2014-12-18 23:41:08

标签: android 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();
    }
}

现在我的问题是,每次收到广播时,变量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>

2 个答案:

答案 0 :(得分:6)

广播之间不保存BroadcastReceivers。每个广播都将创建BroadcastReceiver的新实例,至少如果通过清单自动注册。您可以通过使变量静态并在类的所有实例之间共享来解决此问题。但是你无法在广播之间保存实例变量。

答案 1 :(得分:0)

如果您使用动态BroadcastReceiver(通过Context.registerReceiver()Context.unregisterReceiver()注册和取消注册),接收方可以保存其成员字段。 AndroidManifest.xml注册的BroadcastReceiver不能。因为它每次收到广播时都会创建一个新实例。