首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在onCreate之后立即调用onPause方法

为什么在onCreate之后立即调用onPause方法
EN

Stack Overflow用户
提问于 2011-09-08 16:34:46
回答 3查看 13.2K关注 0票数 21

我正在编写一个在固定时间显示活动的应用程序。

我用下面的代码从服务开始这个活动:

代码语言:javascript
复制
intent.setClass(context, FakeAction.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

在FakeAction的onCreate方法中,我要求唤醒设备并启动声音消息:

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
@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之后停止。

代码语言:javascript
复制
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));
    }

}
EN

回答 3

Stack Overflow用户

发布于 2012-12-27 19:09:42

我通过以下代码测试屏幕是否打开或关闭,从而解决了我的问题:

代码语言:javascript
复制
    PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);  
    if (!powerManager.isScreenOn()){
       return;
    }

如果按下主页按钮时停止声音活动,请使用代码。只有在屏幕未打开时,onPause才会激活。

代码语言:javascript
复制
  @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时,PowerManagerisScreenOn方法返回false。

票数 3
EN

Stack Overflow用户

发布于 2011-09-08 18:41:31

启动一个意图,它将检查用户是否正在退出,并将其绑定到您的退出按钮。我仍然不确定你想要什么,因为代码不完整

票数 1
EN

Stack Overflow用户

发布于 2011-09-08 19:01:35

代码语言:javascript
复制
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.
}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7345282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档