我在 oreder 中使用带有以下BroadcastReceiver
的ALARM_SERVICE
来开始我的OnReceiveActivity
:
public class AlarmReciever extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent)
{
try {
Intent i = new Intent();
i.setClassName("com.test", "co.test.OnReceiveActivity");
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
i.addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED +
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON +
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
);
context.startActivity(i);
} catch (Exception e) {
e.printStackTrace();
}
}
}
当我在没有任何指定WindowManager.LayoutParams
标志的情况下尝试它时(当设备处于唤醒和解锁状态时) - 一切都按预期工作,这意味着onReceive()
被调用,并成功启动OnReceiveActivity
。 但是,当标志存在时,它不起作用,无论是当设备处于睡眠状态并查看时,还是在唤醒和解锁时。
在清单文件中指定了以下权限:
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
不是Intent
标志,不能与Intent
上的addFlags()
一起使用。
正如@CommonsWare所评论的,WindowManager.LayoutParams
标志不是意图标志。
正确的方法是在OnReceiveActivity
的onCreate()
内,使用如下getWindow()
函数:
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED +
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD +
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON +
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
);
我之前做过的方式在我见过的许多例子中使用过,这使得它很奇怪。