我有一项活动需要在启动时打开屏幕(如果是关闭).所以在onCreate中,我有:
this.getWindow().setFlags(
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
Run Code Online (Sandbox Code Playgroud)
在广播接收器的wakelock的帮助下使用它,我能够在广播接收器启动时显示我的活动.
但问题很奇怪,活动生命周期以这种方式调用,onPause()和onResume在启动活动后立即调用
所以问题出在启动和恢复调用两次,在停止也调用,我想在onStop()中实现一些逻辑,但是,这样的行为应用程序将无法正常工作.
编辑
我发现问题只是由于标志FLAG_SHOW_WHEN_LOCKED.当设备被锁定时 它只会在活动开始前锁定设备时发生.
PS我正在使用带有广播接收器的报警管理器,然后从广播接收器开始活动.
我正在编写一个在固定时间显示活动的应用程序.
我用这样的代码从服务开始活动:
intent.setClass(context, FakeAction.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
在FakeAction的onCreate方法中,我需要唤醒设备并启动声音消息:
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);
Run Code Online (Sandbox Code Playgroud)
onCreate中有很多代码可以在屏幕上显示信息并启动声音信息.
这是一个onPause方法:
@Override
protected void onPause()
{
Log.i(TAG, "onPause");
//Stop mediaPlayer
if(mp != null)
{
if(mp.isPlaying())mp.stop();
mp.release();
mp = null;
}
//Restore volume
if(audioManager != null)
{
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, savedVolume, 0);
}
//Stop minute timer
handler.removeCallbacks(minuteReceiver);
super.onPause();
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,在onCreate之后立即调用onPause()方法.所以我的声音消息立即停止.
但是如果在未锁定屏幕时启动活动,则在onCreate()之后不会立即调用onPasue();
即使我评论所有"getWindow().addFlags()"字符串,onCreate()在onCreate()之后调用,如果屏幕被锁定.
问题是为什么在onCreate之后立即调用onPause?当用户按下后退按钮时,如何区分onPause()方法的立即调用和onPause()的调用?
以下是活动的代码.我使用MVP模式,因此,主要代码在演示者中.但即使我评论所有演示者的调用(就像我在本例中所做的那样),onCreate()之后立即调用onPause()
我是否可以在AsyncTask中开始活动?AsyncTask是从服务启动的.如果完成,则在AsyncTask之后停止服务.
public class FakeAction extends RoboActivity
implements
View.OnClickListener
,AlarmAction
{
private static final String TAG = "TA FakeAction";
@InjectView(R.id.aa_btn_Stop) Button btnStop;
@InjectView(R.id.aa_btn_Snooze) Button btnSnooze;
@InjectView(R.id.aa_tv_CurTime) TextView tvCurTime; …Run Code Online (Sandbox Code Playgroud)