相关疑难解决方法(0)

为什么在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万
查看次数

为什么在我的Activity启动后立即调用onStop?

我有一个活动需要在启动时打开屏幕(以防屏幕关闭).所以在我看来onCreate,我有:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
            |WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
            |WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
            |WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
Run Code Online (Sandbox Code Playgroud)

使用这种直接的组合,我能够在我的后台服务启动时显示我的活动(是的,这是一个合法的案例).

然而,问题是当我在这种情况下启动我的活动时,存在一种非常奇怪的生命周期行为.使用广泛的日志记录,我能够确定在活动开始后立即发生以下7个步骤:

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

看到了吗?对于简单的活动开始,onStart被调用两次.更重要的是,onStop被神秘地称为,即使活动刚刚开始 - 没有任何事情会导致它停止.

我已经在许多不同的场景中对此进行了测试,看起来这种奇怪的行为只发生在屏幕关闭且活动在被破坏后启动时.如果屏幕打开,或者活动已停止[但尚未销毁],则活动正常启动,onStart仅调用一次.

结论:似乎当我的活动启动并且强制启动屏幕时,Android会启动活动,然后停止活动,然后再次启动它,原因无关紧要.

那么:为什么会这样呢?我有什么办法可以解决这个问题(所以只有在有正当理由的情况下才会调用onStop)?


笔记:

  • 有问题的活动是使用singleTasklaunchmode
  • 我试过禁用键盘锁/锁,但它没有效果
  • 我在运行Android 3.2的三星Galaxy Tab 10.1上见证了这种行为.我还没有测试这是否适用于其他任何事情......

android android-lifecycle android-activity

11
推荐指数
1
解决办法
4423
查看次数

锁定屏幕触发不同活动的应用程序生命周期事件

当我在扩展FirebaseMessagingService的服务中收到Push消息并在此类中启动Activity时,将执行以下生命周期事件/方法:

  • Push Message启动VideoRingingActivity
  • 启动VideoRingingActivity
  • 的onCreate
  • disableLockScreen
  • 屏幕从黑色切换到锁定屏幕,因此它不显示VideoRingingActivity
  • 在onStart
  • 的onResume
  • 在onPause
  • 的onStop
  • 现在显示了实际的VideoRingingActivity?我期待在setContentView(R.layout.activity_video_ringing)之后出现这个问题
  • onRestart
  • 在onStart
  • 的onResume

我开发了下面的解决方案,我在其中添加一个布尔值,以确定屏幕是否打开/关闭.但这很麻烦,当屏幕在锁定模式下打开时,它不起作用.

因为当屏幕未关闭且显示MainActivity,并且接收到推送消息时,该行为是默认的生命周期行为,因此是正确的.打开屏幕并显示MainActivity时,这是相同的流程:

  • 的onCreate
  • 在onStart
  • 的onResume

这是正确的,也是可以预期的.

class VideoRingingActivity : BaseActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        if (ViewUtils.isScreenActive(activity)) {
            screenIsNotLocked = true
        }
        ViewUtils.disableLockScreen(this)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_video_ringing)
    }

    override fun onStart() {
        super.onStart()
        if (screenIsNotLocked) {
        }
    }

    override fun onResume() {
        super.onResume()
        if (screenIsNotLocked) {
        }
    }

    override fun onPause() {
        super.onPause()
        if (screenIsNotLocked) {
        }
    }

    override fun onStop() {
        super.onStop()
        if …
Run Code Online (Sandbox Code Playgroud)

android lockscreen android-lifecycle

6
推荐指数
0
解决办法
163
查看次数

OnPause 在 OnResume 之后立即被调用

编辑* 在 Android 设备上进行测试时出现此问题。在模拟器上测试时不会出现此问题。


我正在开始一项新活动,我看到在调用 onResume 后立即调用了 onPause。如果我查看日志,它会在 onResume 后进入空闲状态。因此在调用 onResume 后立即导致 onPause。

调用方活动 - 通过意图在 onClick 上调用 MainActivity。

public class TestActivity extends AppCompatActivity implements View.OnClickListener{

    String TAG = "acr";
    Button testBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        testBtn = (Button) findViewById(R.id.testBtn);
        testBtn.setOnClickListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "on pause called on TestActivity ");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "on resume called on  TestActivity ");
    }

    @Override
    public void onClick(View v) { …
Run Code Online (Sandbox Code Playgroud)

android android-intent android-lifecycle android-activity

5
推荐指数
1
解决办法
2902
查看次数