我有一个BroadcastReceiver,我需要在那里长时间操作。这是我的代码:线程关闭一次BroadcastReceiver.onCreate()结束了吗?
public class clsMyReceiver extends BroadcastReceiver
{ PowerManager oPowerManager;
PowerManager.WakeLock oWakeLock;
@Override public void onReceive(Context context, Intent intent)
{ //Aviod the device to go to Sleep:
oPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
oWakeLock = oPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelock");
oWakeLock.acquire();
new Thread()
{ public void run()
{ //......
//Perform long operation here
//......
if(oWakeLock.isHeld())
oWakeLock.release();
}
}.start();
}
}
据我所知,这是不允许的,因为一旦onReceive完成创建的所有任务被杀死。这是正确的吗?即使我使用WakeLock? 这是最好的解决方案是什么? “长时间操作”可持续约2分钟。我想避免为此提供其他服务。 感谢
这是我读的:**任何需要异步操作的东西都不可用,因为您需要从处理异步操作的函数返回,但此时BroadcastReceiver不再处于活动状态,因此系统在异步操作完成之前可以自由地终止它的进程。**(请参阅http://developer.android.com/reference/android/content/BroadcastReceiver.html) – Ton
我不太确定这种情况的重演。我明白,除了不允许这么做外,它可以在线程执行过程中的任何时候释放'BroadcastReceiver',它会不安全地结束它。你有没有测试过它看到它需要的行为? – nKn
一种方法是使用'CountDownLatch(1)'同步,它像信号量一样工作。在你的'onReceive()'方法的''''''结尾之前,你会调用'CountDownLatch.await()'方法,一旦它完成,你的'Thread'就会调用'.countDown()'方法。这样你就可以确保你的'onReceive()'方法在'Thread'执行结束之前不会被释放。 – nKn