我正在编写一个在固定时间显示活动的应用程序。
我用下面的代码从服务开始这个活动:
intent.setClass(context, FakeAction.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
在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);
在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();
}
不幸的是,在onCreate之后会立即调用onPause()方法。所以我的声音信息会立即停止。
但如果活动是在屏幕未锁定时启动的,则在onCreate()之后不会立即调用onPasue();
即使我注释了所有的"getWindow().addFlags()“字符串,当屏幕被锁定时,onPause()在onCreate()之后被调用。
问题是为什么在onCreate之后立即调用onPause?如何区分onPause()方法的立即调用和用户按下后退按钮时的onPause()调用?
下面是该活动的代码。我使用MVP模式,所以,主要代码在presenter中。但是,即使我注释了所有presenter的调用(就像我在本例中所做的那样),在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;
@InjectView(R.id.aa_tv_CurDate) TextView tvCurDate;
@InjectView(R.id.aa_tv_AlarmName) TextView tvAlarmName;
@Inject public AlarmActionPresenter presenter;
private Exception ex;
@Override
public void onCreate(Bundle savedInstanceState)
{
Log.i(TAG, "onCreate");
super.onCreate(savedInstanceState);
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);
setContentView(R.layout.alarm_action);
try
{
//presenter.onCreate(this);
}
catch(Exception ex)
{
this.ex = ex;
Log.e(TAG, "onCreate", ex);
}
btnStop.setOnClickListener(this);
btnSnooze.setOnClickListener(this);
}
@Override
protected void onPause()
{
Log.i(TAG, "onPause");
//presenter.onPause();
super.onPause();
}
@Override
public void onClick(View v)
{
Log.i(TAG, "onClick");
//presenter.onClick(v.getId());
}
@Override
public Bundle getIntentBundle()
{
return getIntent().getExtras();
}
@Override
public void setAlarmName(String alarmName)
{
tvAlarmName.setText(alarmName);
}
@Override
public String getAlarmName()
{
return tvAlarmName.getText().toString();
}
@Override
public void setCurTime(String curTime)
{
tvCurTime.setText(curTime);
}
@Override
public String getCurTime()
{
return tvCurTime.getText().toString();
}
@Override
public void setCurDate(String curDate)
{
tvCurDate.setText(curDate);
}
@Override
public String getCurDate()
{
return tvCurDate.getText().toString();
}
@Override
public IAssetFileDescriptorMockable openFd(String assetName) throws IOException
{
Log.i(TAG, "openFd");
return new AssetFileDescriptorMockable(getAssets().openFd(assetName));
}
}
发布于 2012-12-27 19:09:42
我通过以下代码测试屏幕是否打开或关闭,从而解决了我的问题:
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
if (!powerManager.isScreenOn()){
return;
}
如果按下主页按钮时停止声音活动,请使用代码。只有在屏幕未打开时,onPause
才会激活。
@Override
protected void onPause() {
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
if (powerManager.isScreenOn()){
Log.e("Test two", "****");
Intent i = new Intent(this, RingtonePlayingService.class);
stopService(i);
finish();
}
super.onPause();
}
因此,只有在屏幕打开时,才会执行onPause
方法中的代码。当屏幕打开并且调用onPause
时,PowerManager
的isScreenOn
方法返回false。
发布于 2011-09-08 18:41:31
启动一个意图,它将检查用户是否正在退出,并将其绑定到您的退出按钮。我仍然不确定你想要什么,因为代码不完整
发布于 2011-09-08 19:01:35
You can distinguish onPause() call between Acticity itself and back button press.
onBackPressed(){
// set isBackPressed = true;
}
onPause(){
if(isBackPressed ){
// exit due to back pressed.
}else{
// normal exit.
}
}
https://stackoverflow.com/questions/7345282
复制相似问题