android startactivity 路径错误,android – 活动启动延迟(startActivity)错误

我认为你的问题是关于在没有正确使用WakeLocks的情况下使用AlarmManager,当设备在屏幕关闭时“休眠”,你的接收器将无法正常工作.

我想你的接收器从AlarmManager得到onReceive(),这很可能是用_WAKEUP标志启动的,如下所示:

mAlarmManager.set(AlarmManager.RTC_WAKEUP, .......);

The Alarm Manager holds a CPU wake lock as long as the alarm receiver’s onReceive() method is executing. This guarantees that the phone will not sleep until you have finished handling the broadcast. Once onReceive() returns, the Alarm Manager releases this wake lock. This means that the phone will in some cases sleep as soon as your onReceive() method completes. If your alarm receiver called Context.startService(), it is possible that the phone will sleep before the requested service is launched. To prevent this, your BroadcastReceiver and Service will need to implement a separate wake lock policy to ensure that the phone continues running until the service becomes available.

在你的代码中,这意味着一旦onReceive()结束,系统就会重新进入睡眠状态,并且由于startActivity(i)不能同步工作 – 直接导致问题,如上所述 – 它将被启动,但是很多,很多之后,用户将打开屏幕.

要解决它,我建议做这样的事情:

//BroadcastReceiver

@Override

public void onReceive(Context context, Intent intent) {

Logger.initialize(context);

Logger.log("StartAlarm received");

Intent i = new Intent(context, AlarmOnScreen.class);

i.putExtras(intent.getExtras());

i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(i);

AlarmOnScreen.acquireLock(context);

//Before, system could sleep right after this line(not exactly, however) and activity actually would be started much later

}

//AlarmOnScreen (activity)

private static WakeLock sWakeLock;

public static void acquireLock(Context context) {

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);

sWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "providersLock");

//Limit 10 sec, if something wrong will happen - we'll not drain the battery to much.

sWakeLock.acquire(10000);

//As we are acquiring and releasing only once - we don't need a counter.

sWakeLock.setReferenceCounted(false);

}

private static void releaseLock(Context context) {

try {

sWakeLock.release();

} catch (Exception e) {

//In case it's already auto-released

e.printStackTrace();

}

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.alarm_on_screen);

Logger.log("AlarmOnScreen create");

//Time value of alarm is logged below

(...)

@Override

protected void onResume() {

releaseLock(this);

}

该解决方案将首次运行,让您更深入地了解问题.测试 – 只是在屏幕关闭时开始使用你的警报,并且可能是电缆被拔掉,但我不确定是否真的需要让设备进入睡眠模式.

但是,我强烈建议实施更适合您项目的更优雅的解决方案,因为当前的静态参考设计非常差,因为它在赛车条件下不能很好地工作.

希望它有所帮助,如果有任何问题,请告诉我.

祝好运.

UPD:

我想我也建议不仅使用PARTIAL_WAKE_LOCK,而且还要使用全部.喜欢:

pm.newWakeLock(PowerManager.FULL_WAKE_LOCK

| PowerManager.ACQUIRE_CAUSES_WAKEUP, "providersLock");

这将迫使屏幕开启,而不依赖于先前的状态和平台对新活动创建的反应.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值