相关疑难解决方法(0)

启动活动后立即调用OnPause和OnStop()

我有一项活动需要在启动时打开屏幕(如果是关闭).所以在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在启动活动后立即调用

  1. 的onCreate
  2. 在onStart
  3. 的onResume
  4. 在onPause
  5. 的onStop
  6. 在onStart
  7. 的onResume

所以问题出在启动和恢复调用两次,在停止也调用,我想在onStop()中实现一些逻辑,但是,这样的行为应用程序将无法正常工作.

编辑

我发现问题只是由于标志FLAG_SHOW_WHEN_LOCKED.当设备被锁定时 它只会在活动开始前锁定设备时发生.

PS我正在使用带有广播接收器的报警管理器,然后从广播接收器开始活动.

android activity-lifecycle wakelock android-activity

43
推荐指数
1
解决办法
1万
查看次数

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

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

我用这样的代码从服务开始活动:

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)

android

19
推荐指数
2
解决办法
1万
查看次数