gpt4 book ai didi

BroadcastReceiver的onReceive函数中的Android startActivity

转载 作者:行者123 更新时间:2023-11-29 16:11:54 26 4
gpt4 key购买 nike

我的 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);
}
}

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

在AlarmPopup 的onCreate 方法中,Activity 持有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 管理为 WakefulIntentService

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 很少 不会启动 Activity 或启动不准时,通常会晚 1-2 分钟。

操作系统似乎在我的 AlarmPopup Activity 创建过程中终止了它,或者让 Activity 的创建时间比实际调用 startActivity 的时间稍晚。

真正有趣的是,当出现上述问题时,有时会记录日志消息“Alarm popup acquires wake lock”,有时甚至不会记录。我认为,在这种情况下,操作系统会在执行 onCreate 方法的第一行或第二行时终止 Activity。

我该如何解决这个问题?

当 AlarmPopup Activity 由另一个线程创建时,我是否应该在 onReceive 的末尾放置一些占用 CPU 的虚拟代码?

最佳答案

It seems that OS kills my AlarmPopup activitiy in the middle of its creation or let the activity be created a little bit later than the time when startActivity was actually called.

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

How can I solve this problem?

onReceive() 中获取WakeLock

关于BroadcastReceiver的onReceive函数中的Android startActivity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12455083/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com