Android:调用onPause而不是onStop的场景?

时间:2015-06-30 18:02:34

标签: android

我正在尝试理解onPause和onStop之间的区别。

我已经阅读了所有不同的论坛,但我仍然不清楚这些差异。我创建了一个简单的应用程序来尝试测试何时调用哪个方法。为此,我只是在每种方法中放置记录器。

从我的试验 -

  1. 弹出窗口不会调用任何一种方法
  2. 切换到另一个活动会调用两种方法
  3. 调低通知栏不会调用任何方法
  4. 我只看到两种方法都是快速连续调用,或者根本没有被调用。 我正在尝试找到onPause被调用的场景,但onStop没有。

    目的是了解是否甚至需要定义onPause。如果仅调用onPause的场景非常罕见,那么为onPause编写单独的代码甚至没有意义。不应该写onStop就足够了吗?

    public class LifecycleActivity extends ActionBarActivity {
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.d("Rachit", "In Destroy Method");
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_lifecycle);
            Log.d("Rachit", "In Create Method");
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Log.d("Rachit", "In Start Method");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.d("Rachit", "In Resume Method");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.d("Rachit", "In Pause Method");
        }
    
        @Override
        protected void onRestart() {
            super.onRestart();
            Log.d("Rachit", "In Restart Method");
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.d("Rachit", "In Stop Method");
        }
    }
    

8 个答案:

答案 0 :(得分:9)

我稍后想出来了,但忘了在这里发表我的答案。

我注意到调用了onPause()的实例,没有立即后续调用onStop(),当我在手机上打开另一个应用程序时收到来自其他应用程序的通知时。

例如,假设您当前正在手机上运行Facebook。如果您收到WhatsApp的通知(在弹出对话框中),您的Facebook活动将暂停。如果您在此期间关闭WhatsApp弹出窗口,Facebook活动将获得恢复。另一方面,如果您从弹出消息中打开WhatsApp,您的Facebook活动将被停止。

答案 1 :(得分:5)

活动A - >活动B. 如果B是透明的,则会调用A'onPause,但不会调用onStop。

答案 2 :(得分:2)

官方Android开发者页面,您可以看到与这两种活动状态相关的所有信息

onPause()http://developer.android.com/training/basics/activity-lifecycle/pausing.html

  

当系统为您的活动调用onPause()时,从技术上讲   意味着您的活动仍然部分可见,但通常是一个   表示用户正在离开活动,很快就会出现   进入Stopped状态。您通常应该使用onPause()回调   到:

     

停止可能消耗CPU的动画或其他正在进行的操作。   提交未保存的更改,但仅限用户期望进行此类更改   他们离开时永久保存(例如草稿电子邮件)。发布   系统资源,例如广播接收器,处理传感器   (如GPS),或任何可能影响电池寿命的资源   活动暂停,用户不需要它们。

     

通常,您不应使用onPause()来存储用户更改(例如   个人信息输入表格)到永久存储。该   只有你应该将用户更改持久保存到永久存储中   onPause()是指您确定用户期望更改的时间   自动保存(例如在起草电子邮件时)。但是,你应该避免   在onPause()期间执行CPU密集型工作,例如写入   数据库,因为它可以减慢可见的过渡到下一个   活动(您应该执行重载关闭操作   在onStop()期间。

     

您应该在onPause()方法中保留完成的操作量   相对简单,以便快速过渡到   如果您的活动实际停止,则为用户的下一个目的地。

     

注意:当您的活动暂停时,将保留活动实例   驻留在记忆中,并在活动恢复时被召回。您   不需要重新初始化在任何期间创建的组件   回调方法导致恢复状态。

onStop()http://developer.android.com/training/basics/activity-lifecycle/stopping.html

  

当您的活动收到对onStop()方法的调用时,它是否定的   更长时间可见,并应释放几乎所有非资源   在用户不使用它时需要。一旦您的活动停止,   如果需要恢复系统,系统可能会销毁该实例   记忆。在极端情况下,系统可能会简单地杀死您的应用   进程没有调用活动的最终onDestroy()回调,所以   使用onStop()释放可能泄漏的资源非常重要   存储器中。

     

虽然在onStop()之前调用了onPause()方法,但是你应该这样做   使用onStop()执行更大,更密集的CPU关闭   操作,例如将信息写入数据库。

     

当您的活动停止时,Activity对象将保持驻留状态   记忆,并在活动恢复时被召回。你不需要   重新初始化在任何回调期间创建的组件   导致恢复状态的方法。系统也跟踪   布局中每个View的当前状态,如果是用户   将文本输入到EditText小部件中,该内容将保留给您   不需要保存和恢复它。

     

注意:即使系统在停止时破坏了您的活动,也是如此   仍然保留View对象的状态(例如文本中的文本)   在一个Bundle(一对键值对)中的EditText)并恢复它们   用户导航回活动的同一个实例(下一个   课程详细介绍了如何使用Bundle保存其他状态数据   如果您的活动被销毁并重新创建)。

答案 3 :(得分:1)

我的测试用例结果:

对于以下两个活动,从C4_SecondActivity开始MainActivity时,对于MainActivity,其onPause被调用,但没有被onStop覆盖。

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name=".C4_SecondActivity"
    android:label="@string/title_activity_c4__second"
    android:theme="@style/Theme.AppCompat.Dialog">
</activity>

答案 4 :(得分:0)

当我们从当前活动开始对话活动时,只会调用onPause()。 例如:假设我们有活动A和B.现在活动B是对话活动,活动A是正常活动。当我们从活动A开始活动B时,将调用活动A的onPause(),并且将调用活动B的onCreate()onStart()onResume()。请检查以下网址的样本码 sample code

答案 5 :(得分:0)

还有另一种方法可以做到这一点。 让我们假设一个场景,你的活动启动模式是单一任务,并从中创建一个通知并触发它并再次调用相同的待定意图,然后onresume将被称为post to on pause。

public class MainActivity extends AppCompatActivity {

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

    private final static String TAG = "TestOne";

    public  void sendNotification(){
        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(this);

    //Create the intent that’ll fire when the user taps the notification//

    Intent i = new Intent(MainActivity.this, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0);


    mBuilder.setContentIntent(pendingIntent);

    mBuilder.setSmallIcon(R.mipmap.ic_launcher);
    mBuilder.setContentTitle("My notification");
    mBuilder.setContentText("Hello World!");

    NotificationManager mNotificationManager =

            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    mNotificationManager.notify(001, mBuilder.build());

} 

清单:

    <activity android:name=".MainActivity"
        android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".Main2Activity"></activity>

答案 6 :(得分:-1)

当您接到电话时,活动的

onPause()方法就会被呼叫。否则,在很多情况下onPause()始终会使用onStop()进行调用。例如,当您按下主页按钮时,调用另一个意图,更像是当您的活动处于后台时。

答案 7 :(得分:-1)

Whenever we do Split window than onPause will be called alone 
In Split window onStop will not be Called.