2

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

    <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

4 回答 4

2

根据文档

对于可能需要创建进程的接收器,一次只运行一个,以避免系统因新进程而过载

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

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

于 2013-07-24T03:29:13.983 回答
1

您不应该在BroadcastReceiver. 相反,启动一个服务来执行这里描述的长时间运行的任务

于 2013-07-24T03:25:35.743 回答
0

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

于 2013-07-24T03:34:54.843 回答
-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 语句中的块放入同步块中。

于 2013-07-24T03:22:58.657 回答