BroadcastReceiver的onReceive函数中的Android startActivity

时间:2012-09-17 07:50:00

标签: android broadcastreceiver alarmmanager broadcast

我在BroadcastReceiver的onReceive函数中有以下代码。

public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (action == null) return;
    if (action.equals(ACTION_ALARM)) {
        Intent alarmPopup = new Intent(context, AlarmPopup.class);
        int vibrateDuration = context.getSharedPreferences(PREF, 0)
                .getInt(VIBRATE_DURATION, DEFAULT_VIBRATE_DURATION)
        alarmPopup.putExtra(VIBRATE_DURATION, vibrateDuration);
        alarmPopup.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(alarmPopup);
    }
}

此代码在接收警报管理器的广播时启动活动AlarmPopup。 AlarmPopup活动开始后,它会显示典型的警报消息,并在vibrateDuration通过Intent#putExtra期间振动。

在AlarmPopup的onCreate方法中,活动保持WakeLock以使设备保持开启状态。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    wl = getLock(this);
    if (!wl.isHeld()) {
        Log.d(PREF, "Alarm popup acquires wake lock");
        wl.acquire();
        thread.run();
    }
    .
    .
    .
}

getLock是一种同步方法,可以WakeLock管理private static volatile PowerManager.WakeLock wlStatic = null; synchronized private static PowerManager.WakeLock getLock(Context context) { if (wlStatic == null) { PowerManager mgr = (PowerManager) context.getSystemService(Context.POWER_SERVICE); wlStatic = mgr.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, PREF); wlStatic.setReferenceCounted(true); } return wlStatic; }

context.startActivity(alarmPopup)

现在出现问题:即使startActivity被调用,startActivity 很少也无法启动活动或未按时启动,通常是1-2分钟后。

似乎操作系统在创建过程中杀死了我的AlarmPopup活动,或者让活动创建的时间比实际调用"Alarm popup acquires wake lock"的时间稍早。

真正有趣的是,当上述问题发生时,有时会记录日志消息onCreate,有时甚至不记录。我认为,在这种情况下,操作系统会在执行{{1}}方法的第一行或第二行时杀死活动。

我该如何解决这个问题?

在另一个线程创建AlarmPopup活动时,是否应该在onReceive结尾处放置一些保存CPU的虚拟代码?

1 个答案:

答案 0 :(得分:4)

  

OS似乎在其创建过程中杀死了我的AlarmPopup活动,或者让活动创建的时间比实际调用startActivity的时间晚了一点。

没有。该设备只是睡着了。 startActivity()是一个异步操作。操作系统为WakeLock工作所持有的AlarmManager(假设您确实使用AlarmManager)将在onReceive()返回时释放。 onCreate()返回时,您的活动onReceive()将无法运行。因此,设备可能会在onReceive()结束和WakeLock中获取onCreate()之间的时间窗口内入睡。

  

我该如何解决这个问题?

获取WakeLock中的onReceive()