我有一个可以成功捕获广播的BroadcastReceiver,但如果我尝试从中调用另一个方法,它将无法始终工作。这是我的设置:
private class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (working == true) {
//toast to make sure we got here
doWork();
}
}
}
if中的toast被调用,但doWork不会执行。有没有人处理类似的问题?
答案 0 :(得分:2)
广播接收器与您的应用程序没有相同的上下文和生命周期,您无法在其中执行大量常规操作。您应该做的就是处理事件并尽快返回。换句话说,启动服务或通知用户。
来自:http://developer.android.com/reference/android/content/BroadcastReceiver.html
BroadcastReceiver对象仅在对onReceive(Context,Intent)的调用期间有效。一旦您的代码从此函数返回,系统会认为该对象已完成且不再有效。
这对你在onReceive(Context,Intent)实现中可以做的事情有重要的影响:任何需要异步操作的东西都不可用,因为你需要从函数返回来处理异步操作,但是那时候BroadcastReceiver不再处于活动状态,因此系统可以在异步操作完成之前自由终止其进程。
特别是,您可能无法在BroadcastReceiver中显示对话框或绑定到服务。对于前者,您应该使用NotificationManager API。对于后者,您可以使用Context.startService()向服务发送命令。
答案 1 :(得分:1)
很可能它不会保持清醒足够长的时间。您是否使用WakeLock让Android无法重新入睡?
所以,首先你需要将它添加到你的清单中:
<uses-permission android:name="android.permission.WAKE_LOCK" />
然后在你的接收器中//伪代码,除了重要的部分......
public WakeLock wl;
@Override
public void onReceive(c,i){
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);//this matters
wl.getWakeLock().acquire(); //as does this
//do whatever but DON'T do it here... call a Service like this...
Intent i = new Intent(context, MyExcellentService.class);
try {
PendingIntent.getService(context, 0,i, 0).send();
}catch(Exception e){}
//hold on to wl in some way and release it in the service, not here,
wl.getWakeLock().release();
}
如果您要使用某项服务,则需要在清单中注册,如此...
<service android:name="MyExcellentService" />
我会扩展应用程序并保留在那里的WakeLock,这样你就不必以更复杂的方式传递它。您可以直接进入应用程序并直接与它交谈!
你需要查看*种类的唤醒中的差异PARTIAL_WAKE_LOCK不会让屏幕保持清醒状态,例如,只是后台处理。
让我知道如果这种方法有效,我会从不同的地方切割和粘贴,所以,我可能会忽略一些东西。