【问题标题】:How can I manually trigger my Android onPause() method to test it?如何手动触发我的 Android onPause() 方法来测试它?
【发布时间】:2017-01-09 17:46:30
【问题描述】:

我想手动测试我正在编写的 Android 应用程序在暂停时是否正常工作。 我可以通过 Android GUI 执行哪些操作以使 onPause() 方法被调用而不导致 onStop() 也被调用?

我尝试拉下通知栏并接听电话,但都没有导致onPause()被呼叫。

我想通过 GUI 找到一个适用于多个 Android 版本的非编程解决方案,无论有没有手机,因为我正在教一个全班学生使用不同设备的课程。

请注意,我不是在问如何告诉如果我的onPause() 方法被调用了。我在问我能做些什么来调用它,而不修改我的应用程序。

【问题讨论】:

  • 您可以为此使用日志。
  • 你可以有Snack bar或者toast消息。
  • @santoshkumar 是的,我可以让它显示祝酒词,但我的问题是我该怎么做才能导致 onPause() 方法被调用,而不是如何测试该方法是否已经叫。我会尽量让它更清楚。
  • 将应用推送到后台 onpause 将被调用。
  • @santoshkumar 恐怕我不明白你把应用程序推到后台是什么意思。

标签: android android-activity onpause


【解决方案1】:

我找到了解决方案。我从书中的一张图片Head-First Android Development得到了这个想法。

  1. 安装Any Do
  2. 创建一个任务。
  3. 设置未来几分钟的闹钟。
  4. 启动被测应用。
  5. 当警报出现时,我的应用程序被部分遮挡,并且它的onPause() 方法被调用。如果我点击 Dismiss 图标,我的应用程序会在没有调用其 onStop() 方法的情况下继续运行。

【讨论】:

    【解决方案2】:

    您可以通过编程方式调用它。

    或者干脆从一个不同的活动开始。

    【讨论】:

    • 谢谢,但我想在不修改被测应用的情况下这样做。
    • 如您所愿,但它应该可以帮助您测试它​​。如果我是你,我会在右下角添加一个小按钮,通过 OnClick 调用 demoActivity 的启动。
    【解决方案3】:

    这可能是在应用程序中执行此操作的一种方式。

      @Override
        protected void onPause () {
            super.onPause();
            Toast.makeText(this, "Paused", Toast.LENGTH_SHORT).show();
            finish();
        }
    
        @Override
        protected void onStop () {
            super.onStop();
            Toast.makeText(this, "stopped", Toast.LENGTH_SHORT).show();
        }
    

    您的其他方法是使用意图打开任何活动/应用程序。

    【讨论】:

    • 谢谢,但我想知道如何调用我的 onPause() 方法,而不是如何判断它是否被调用。
    • 您在安卓手机中有方形按钮,用于在后台推送应用程序,一旦应用程序不可见,它将导致暂停状态
    • 您可以从第一个活动中打开第二个活动,在这种情况下,第一个活动将进入后台,第二个活动将出现 onPause of first will b 调用。
    • @santoshkumar 但是这些事情也会导致 onStop() 被调用,并且 OP 明确表示他们不希望这种情况发生。
    【解决方案4】:

    根据文档的暂停状态发生,如果一个活动失去焦点但仍然可见(即,一个新的非全尺寸或透明活动的焦点位于您的活动之上),它会被暂停。暂停的活动完全处于活动状态(它维护所有状态和成员信息并保持连接到窗口管理器),但可以在内存极低的情况下被系统杀死。

    因此,如果您参加通话,显然您的通话屏幕将出现在堆栈中,它将调用先前运行的活动的 onStop()。

    因此,如果您只想调用 onPause(),则应打开一个新的非全尺寸或透明活动。

    【讨论】:

    • 您能否推荐一个易于使用的非全尺寸或透明活动,以及如何在不离开被测应用程序并导致其 onStop() 方法被调用的情况下以非编程方式启动它?
    • 当您当前的应用程序打开时,最简单的选择是从不同的应用程序获取通知。例如,假设您在运行应用程序的手机上接到电话,或者说您收到了 whatsapp 通知。然后 onPause() 将被调用。打开通知后,将调用 onStop。但是只有通知,onPause() 将被调用。
    • 谢谢。我最终做了类似的事情。
    • 酷。展示对话是展示更多观众的更好方式。
    【解决方案5】:

    您可以创建一个警报对话框来调用onPause() 而无需调用onStop()

    但要注意的重要一点是将警报对话框创建为一个活动。

    这可以按如下方式完成:

    创建一个名为 dialog 的新活动类,扩展 AppCompatActivty,并将其添加到 AndroidManifest.xml,如下所示:

    public class dialog extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //set appropriate layout
            setContentView(R.layout.activity_main);
        }
    }
    

    添加到AndroidManifest.xml:

    <application>
    ....
        <activity
                    android:name="dialog"
                    android:theme="@style/Theme.AppCompat.Dialog"></activity>
    </application>
    

    在MainActivty.java的onCreate()方法中添加以下内容:

    button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(getApplicationContext(), dialog.class);
                    startActivity(intent);
                }
            });
    

    【讨论】:

    • 谢谢,但我的部分目标是不必修改被测应用。
    • 据我所知,有两种方法可以实现这一点 - 通过创建警报对话框或在现有活动上启动新的透明活动,这两种方法都需要您更改代码。如果您只是按下设备上的任何硬件按钮(返回、主页或概览),它将同时调用 onPause() 和 onStop() 方法。
    【解决方案6】:

    实际上在29 API通知可能不起作用。
    对于手动调用方法 onPause()/onResume() 应该按住主页按钮

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多