1在任何给定时间广播接收器实例

时间:2013-07-24 03:12:19

标签: android

目前,我有一个广播接收器,它将在网络活动发生变化时执行。

    <receiver android:name="org.yccheok.jstock.network.ConnectivityChangeBroadcastReceiver" >
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
    </receiver>

但是,有时,ConnectivityChangeBroadcastReceiver中会有一个长时间运行的操作。如果用户倾向于在短时间内多次更改网络连接,则会产生多个广播接收器实例。

我只希望在任何给定时间运行1个ConnectivityChangeBroadcastReceiver。我有什么技巧可以应用吗?

4 个答案:

答案 0 :(得分:2)

基于the documentation

  

对于可能需要创建进程的接收者,只有一个   将在一次运行,以避免新系统超载   过程

因此,使用android:process会阻止创建两个接收器。

但是,维护Service并从brodcast接收器发送意图可能更灵活。该服务将能够对传入意图的处理/查询进行必要的排序/拒绝。

答案 1 :(得分:1)

您不应该在BroadcastReceiver内执行长时间运行的任务。相反,启动服务以执行here.

所述的长期运行任务

答案 2 :(得分:0)

使用标志并在调用广播接收器时将其升高,并在工作结束时将其降低,以便没有新实例可以调用广播接收器

答案 3 :(得分:-1)

您可以在ConnectivityChangeBroadcastReceiver中使用静态布尔字段来跟踪方法当前是否正在执行。

public class ConnectivityChangeBroadcastReceiver extends BroadcastReceiver {
    private static boolean currentlyReceiving = false;

 @Override
 public void onReceive(Context context, Intent intent) {
     if(!currentlyReceiving) {
        currentlyReceiving = true;
        doYourLongTaskHere();
        currentlyReceiving = false;
     }
  }
} 

我不确定每个广播是否会在不同的线程中运行,因此您可能希望将if语句中的块抛出到同步块中。