【问题标题】:How to stop activity in Android?如何在 Android 中停止活动?
【发布时间】:2022-03-12 23:18:51
【问题描述】:

我创建了一个包含媒体播放器的活动。当我开始活动时,音乐开始播放。但是当歌曲完成并且当我点击模拟器上的后退按钮时,它显示错误(@ 987654324@).

这是我的代码:

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
            
    setContentView(R.layout.audio);
    init();
    imgVw.setImageResource(R.raw.teddy_two);
    
    prefs = PreferenceManager.getDefaultSharedPreferences(this);
      
    mp=MediaPlayer.create(Audio_Activity.this,R.raw.ennamo_yadho);
    Log.e("Song is playing","in  Mediya Player ");
    Log.e("Current ","Position -> " + length);
    mp.setLooping(false);
    mp.start();
    btnChapter.setEnabled(false);
            
    mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() 
    {
        @Override
        public void onCompletion(MediaPlayer mp) 
        {
            // TODO Auto-generated method stub
            mp.stop();
            mp.release();
            btnChapter.setEnabled(true);
            System.out.println("Music is over and Button is enable !!!!!!");
        }
    });
            
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
         
        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        }
    }
         
    @Override
    public void onPause()
    {
        super.onStop();
        SharedPreferences. Editor prefsEdit = prefs.edit();
                
        int position = mp.getCurrentPosition();
        prefsEdit.putInt("mediaPosition", position);
        prefsEdit.commit();
    }
    
    @Override
    protected void onResume() 
    {
        super.onResume();
        System.out.println("Activity is Resume !!!");
        int position = prefs.getInt("mediaPosition", 0);
        mp.seekTo(position);
        mp.start();
    }
        
    #Override
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) 
        { 
            if(mp!= null)
            {
                mp.pause();
            }
            //finish();
         return true;
     }
     return super.onKeyDown(keyCode, event);
 }

}

【问题讨论】:

标签: java android media-player


【解决方案1】:

在Activity类中使用finish();来停止Activity并返回。

【讨论】:

    【解决方案2】:

    试试这个

    MediaPlayer player;
    
    
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        Toast.makeText(getApplicationContext(), "service started", 100).show();
        if(player.isPlaying())
            player.stop();
    
        else
            player.start();
        return super.onStartCommand(intent, flags, startId);}
    

    【讨论】:

      【解决方案3】:

      我认为问题出在这里:

      @Override
      public void onPause()
      {
         super.onPause();//should be onPause and not onStop
      
         SharedPreferences. Editor prefsEdit = prefs.edit();
      
         int position = mp.getCurrentPosition();
         prefsEdit.putInt("mediaPosition", position);
         prefsEdit.commit();
      }
      

      更多信息请阅读here

      【讨论】:

        【解决方案4】:

        这是一个 onStop() 的实现,它将草稿笔记的内容保存到持久存储中:

        @Override
        
        protected void onStop() {
            super.onStop();  // Always call the superclass method first
        
            // Save the note's current draft, because the activity is stopping
            // and we want to be sure the current note progress isn't lost.
            ContentValues values = new ContentValues();
            values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
            values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());
        
            getContentResolver().update(
                    mUri,    // The URI for the note to update.
                    values,  // The map of column names and new values to apply to them.
                    null,    // No SELECT criteria are used.
                    null     // No WHERE columns are used.
                    );
        }
        

        虽然onPause() 方法在onStop() 之前调用,但您应该使用onStop() 来执行更大、更占用CPU 的关闭操作,例如将信息写入数据库。

        来自安卓开发者页面:http://developer.android.com/training/basics/activity-lifecycle/stopping.html

        【讨论】:

          【解决方案5】:
          if(mp!= null)
          {
          
             mp.pause();
          }
          

          if ((keyCode == KeyEvent.KEYCODE_BACK)) 中的上述代码 sn-p 似乎是问题所在。您应该检查播放器是否正在播放。如果它正在播放,则只应调用暂停。

          【讨论】:

            【解决方案6】:

            您在 onPause() 上得到 (IllegelStateException)

            要解决这个问题你需要把,

            mp = null;
            

            之后,

            mp.stop();
            mp.release();
            

            因为当您检查 mp!=null 时,MediaPlayer 已经发布但不是 null。 因此,如果条件正确并转到 mp.pause()mp 已经发布,这就是您收到错误的原因。

            您还需要在 onCompletion() 中更改 MediaPlayer 实例的名称。

            public void onCompletion(MediaPlayer mp)
            

            因为 stop()release() 使用了 onCompletion() 的 mp。 因此,将 mp 更改为 other(like: mp1)

            检查这对你有帮助。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-09-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多