Android BroadcastReceiver获取wakelock以启动活动的正确模式?

Android BroadcastReceiver获取wakelock以启动活动的正确模式?,android,Android,在BroadcastReceiver中获取wakelock并将其保持到活动启动的正确方法是什么?这就是我所拥有的: public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { PowerManager pm = (PowerManager) context.getS

在BroadcastReceiver中获取wakelock并将其保持到活动启动的正确方法是什么?这就是我所拥有的:

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        PowerManager pm = (PowerManager) 
            context.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(
            PowerManager.PARTIAL_WAKE_LOCK, 
            "tag");
        wl.acquire();  

        Intent intent = new Intent(context, MyActivity.class);
        context.startActivity(intent);
    }
}

public class MyActivity extends Activity {  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        PowerManager pm = (PowerManager) 
            context.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(
            PowerManager.PARTIAL_WAKE_LOCK, 
            "tag");
        wl.release();  

        // I want to keep the screen on now.
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);  
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
    }
}

// The broadcastreceiver is fired via AlarmManager:
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setExact(AlarmManager.RTC_WAKEUP, someTime, pendingIntent);
此外,如果广播接收器同时被触发,会发生什么情况?我假设wakelock管理器是同步的,这不会是一个问题


谢谢

一旦获得锁,您必须保留此锁实例,并在工作完成后完全释放该实例。您可以检查的源代码,以更好地了解如何实现和使用它


此外,从广播接收器开始活动不是一个很好的主意。想象一下,你玩一个游戏,在一个水平的中间,你的手机开始一个活动。我想你不会喜欢的。您应该发布一个通知,用户可以稍后在用户需要时打开活动。

您使用AlarmManager唤醒吗?@VM4不,我没有,我更新了答案以显示我所拥有的内容。您正在收听的广播的确切内容是什么?@VM4哦,我正在通过AlarmManager进行此操作,再次更新,请参阅代码示例的底部。通知允许专门用于警报和其他基于中断的情况-这是内置警报和电话应用程序使用的,可能也是您应该使用的。Yeah agreed@beworker,这是用于警报的,因此我认为在这种情况下中断用户是可以的。我明白您对WakefulBroadcastReceiver的看法,现在将通读。您可以为活动构建类似的内容。它基于静态列表,所以它也可以用于活动。您需要注意的唯一一件事是可靠地释放唤醒锁。否则设备会很快放电。好的,所以我应该像@ianhanniballake建议的那样使用全屏。如果你真的想发起一项活动,那么我相信这是一种方式。