OnPause 在 OnResume 之后被调用

5

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


我正在启动一个新的活动,但是我发现在 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) {
        switch(v.getId()){
            case R.id.testBtn:
                Intent mainIntent = new Intent(this, MainActivity.class);
                TestActivity.this.startActivity(mainIntent);
                break;
        }
    }
}

有bug的活动

public class MainActivity extends AppCompatActivity{

    public static final String TAG = "acrx";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


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

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "on resume Called on Main activity");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "on stop Called on Main activity");
    }
}

日志

12-06 23:24:19.751 22983-22983/com.example.m1alesis.smartcardreader I/acrx: on resume Called on Main activity
12-06 23:24:19.751 22983-22983/com.example.m1alesis.smartcardreader D/SecWifiDisplayUtil: Metadata value : SecSettings2
12-06 23:24:19.751 22983-22983/com.example.m1alesis.smartcardreader D/ViewRootImpl: #1 mView = com.android.internal.policy.PhoneWindow$DecorView{5ce8491 I.E...... R.....ID 0,0-0,0}
12-06 23:24:19.781 22983-23012/com.example.m1alesis.smartcardreader D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000,  [1440x2560]-format:1
12-06 23:24:19.811 22983-22983/com.example.m1alesis.smartcardreader W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView)
12-06 23:24:19.831 22983-22983/com.example.m1alesis.smartcardreader D/ViewRootImpl: MSG_RESIZED_REPORT: ci=Rect(0, 96 - 0, 0) vi=Rect(0, 96 - 0, 0) or=1
12-06 23:24:19.871 22983-23012/com.example.m1alesis.smartcardreader D/OpenGLRenderer: endAllActiveAnimators on 0x7f9c17ec00 (RippleDrawable) with handle 0x7f9ccc8b60
12-06 23:24:19.871 22983-22983/com.example.m1alesis.smartcardreader I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@fa2f707 time:376798424
12-06 23:24:20.131 22983-22983/com.example.m1alesis.smartcardreader V/ActivityThread: updateVisibility : ActivityRecord{e78cff6 token=android.os.BinderProxy@a67fd36 {com.example.m1alesis.smartcardreader/com.example.m1alesis.smartcardreader.TestActivity}} show : false
12-06 23:24:31.561 22983-22983/com.example.m1alesis.smartcardreader I/acrx: on pause called on mainactivity
12-06 23:24:31.701 22983-22983/com.example.m1alesis.smartcardreader I/acrx: on resume Called on Main activity
12-06 23:24:31.721 22983-22983/com.example.m1alesis.smartcardreader I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@fa2f707 time:376810271

这绝对违反了Android活动周期...也许这是一个bug。你在启动你的应用程序后打开了任何其他应用程序吗? - ZeroOne
我知道这种临时暂停可能会发生在需要将结果传递给Activity但已经恢复的情况下。但这里并非如此,但是在其他情况下也可能会发生这种暂停。 - Marcin Jedynak
@MuhammadHafiqIqmal 我没有打开任何其他应用程序。它会立即发生,在 onResume 被调用后的 1 秒内。 - m1alesis
3个回答

3
我曾经遇到过同样的问题,与活动启动和屏幕未开启有关 - 我只在屏幕关闭后(例如触摸电源按钮然后按主页再次恢复)才看到它。
这是其他人也看到的行为 - 我发现这个问题和答案有有用的参考:OnPause and OnStop() called immediately after starting activity 帮助我理解行为的关键引用是:

请记住,onResume不是您的活动对用户可见的最好指标; 诸如键保护之类的系统窗口可能在前面。 使用onWindowFocusChanged(boolean)确切地知道您的活动对用户可见


3
在我的情况下,同样的问题是由ActivityCompat.requestPermissions(this, new String[]{Manifest.permission...);引起的。
 * This method may start an activity allowing the user to choose which permissions
 * to grant and which to reject. Hence, you should be prepared that your activity
 * may be paused and resumed. Further, granting some permissions may require
 * a restart of you application. In such a case, the system will recreate the
 * activity stack before delivering the result to your
 * {@link OnRequestPermissionsResultCallback#onRequestPermissionsResult(int, String[], int[])}.

这导致应用程序启动明显变慢。

0

我在我的测试活动中尝试了一下,我没有遇到你的问题。在我的MainActivity和TestActivity上只有一个按钮。

我在这里找到了一些内容:暂停和恢复活动

这是有趣的部分:

注意:当系统调用您的活动的onPause()方法时,系统可能正在发出信号,表示活动将会被暂停一段时间,并且用户可能会再次关注您的活动,或者该应用程序正在运行多窗口模式。但是,此方法调用也可能是用户离开您的活动的第一个迹象。


很奇怪,我创建了一个新项目来测试它,但仍然存在同样的问题。在我的两个三星手机上测试,都有同样的错误。你认为这是因为手机而不是代码引起的吗? - m1alesis
我有一台三星Galaxy Tab E-Lite平板电脑。我尝试了调试模式和正常模式,但是我还是不知道问题出在哪里。 - Zoltan Febert
@m1alesis,你找到任何解决方案了吗?我一直在思考。如果你把测试项目发送给我,我可以在我的平板电脑上尝试一下。 - Zoltan Febert
很不幸目前还没有解决方案,但我最近在模拟器上测试了代码并没有问题,但是我的手机出现了问题。到目前为止,我已经在两部手机上进行了测试,都有问题。 - m1alesis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接