onPause() 和 onStop() 不起作用

Posted

技术标签:

【中文标题】onPause() 和 onStop() 不起作用【英文标题】:onPause() and onStop() not working 【发布时间】:2017-03-17 03:38:36 【问题描述】:
public class PhrasesActivity extends AppCompatActivity 
    MediaPlayer mediaPlayer;
    private MediaPlayer.OnCompletionListener onCompletionListener = new MediaPlayer.OnCompletionListener()
        @Override
        public void onCompletion(MediaPlayer mediaPlayer) 
            releaseMediaPlayer();
        
    ;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.word_list);

        final ArrayList<Word> words = new ArrayList<Word>();

#some Word elements added
        WordAdapter wordAdapter = new WordAdapter(this, words, R.color.category_phrases);
        ListView listView = (ListView)findViewById(R.id.numberlist);
        listView.setAdapter(wordAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) 
                Toast.makeText(PhrasesActivity.this, "Demo", Toast.LENGTH_SHORT).show();
                Word word = words.get(i);
                releaseMediaPlayer();
                mediaPlayer = MediaPlayer.create(PhrasesActivity.this, word.getAudioResourceID());
                mediaPlayer.start();
                mediaPlayer.setOnCompletionListener(onCompletionListener);
            
        );
    

@Override
protected void onPause() 
    super.onPause();
    Log.v("PhrasesActivity", "onPause: Paused");
    releaseMediaPlayer();


@Override
protected void onStop() 
    super.onStop();
    Log.v("PhrasesActivity", "onPause: Stopped");
    releaseMediaPlayer();


    private void releaseMediaPlayer()
        if(mediaPlayer!= null)
            mediaPlayer.release();
            mediaPlayer= null;
        
    

此代码在我的应用中的子活动中不起作用。 我曾尝试使用Log.v() 检查日志,但是根本没有发生任何事情。不创建日志。 编辑 - 我只尝试使用 onPause() 方法。这也没有帮助我解决问题。

【问题讨论】:

什么是子活动?你也没有@Override这些方法 我的意思是儿童活动,对此感到抱歉。我使用了命令(Windows PC 上的 android Studio 中的 control + o)。我该如何解决这个问题? 您能否发布整个课程,以便我们了解发生了什么/发生了什么。 打印你的洞“孩子”活动以及“父母”活动(如果有的话)。注意:在 android 中没有子活动这样的术语。也许你的意思是片段? 我不认为Android中也有child activity这样的东西。你如何使用它?或发布完整代码 【参考方案1】:

代码中的错误是在调用super.onStop()/super.onPause()之前使用所需指令语句的顺序;

@Override
protected void onPause() 
    // super.onPause();
    Log.v("PhrasesActivity", "onPause: Paused");
    releaseMediaPlayer();
    super.onPause();


@Override
protected void onStop() 
    // super.onStop();
    Log.v("PhrasesActivity", "onPause: Stopped");
    releaseMediaPlayer();
    super.onStop();

一般来说,在java中我们首先调用super();在被覆盖的方法中,然后继续进行进一步的代码编写。 我不明白为什么这里不遵循它,但是如上所述更改代码帮助我解决了问题。

感谢 Mohammed Atif 的帮助!

【讨论】:

【参考方案2】:
@Override
protected void onPause() 
    super.onPause();
    releaseMediaPlayer();

@Override
protected void onStop() 
    super.onStop();
    releaseMediaPlayer();

在最初的 Udacity 教程中,他们只使用了onStop 方法。

但是,只有onStop 或只有onPause 对我不起作用。

通过添加它们(如上所述),它对我来说很好(Android 10)。 (而且,在调用releaseMediaPlayer() 之后,不必再调用super.____()。)

【讨论】:

【参考方案3】:

您需要添加覆盖标签并确保您正在扩展 Activity

例子

public class MyActivity extends Activity 
    @Override
    protected void onPause()
    super.onPause();
    #Some code
    

    @Override
    protected void onStop()
    super.onStop();
    #Some code
    

【讨论】:

这是错误的。您不需要注释要覆盖的方法。 纠正不需要,但在堆栈溢出中,我们总是提倡良好的做法。请参阅***.com/a/94411/1492034 了解更多信息您为什么应该这样做 这可能是一个好习惯,但这并不能回答或解决问题。

以上是关于onPause() 和 onStop() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

两个Activity启动时候执行的顺序

android - onPause()

android fragment 生命周期

安卓活动的生命周期

25.Android开发艺术探究Note

android的生命周期