目前,我有一个广播接收器,它将在网络活动发生变化时执行。
<receiver android:name="org.yccheok.jstock.network.ConnectivityChangeBroadcastReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
但是,有时,ConnectivityChangeBroadcastReceiver中会有一个长时间运行的操作。如果用户倾向于在短时间内多次更改网络连接,则会产生多个广播接收器实例。
我只希望在任何给定时间运行1个ConnectivityChangeBroadcastReceiver。我有什么技巧可以应用吗?
答案 0 :(得分:2)
对于可能需要创建进程的接收者,只有一个 将在一次运行,以避免新系统超载 过程
因此,使用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语句中的块抛出到同步块中。