【问题标题】:How to kill an activity when the Home button is pressed?按下主页按钮时如何杀死活动?
【发布时间】:2011-03-07 13:49:10
【问题描述】:

我想在用户按下 Home 按钮时终止 Activity。为此,我使用以下代码:

public void onPause() {
    super.onPause();
    this.finish();
}

它工作正常。但是如果用户按下后退按钮而不是主页,它也会终止活动。我希望后退按钮像往常一样执行,即它应该将用户带到上一个活动。有什么想法吗?

以下是我的Activity类的代码:

public class HomeScreen extends Activity {
    /** Called when the activity is first created. */
        private Button btn_play;
        private MediaPlayer mp = new MediaPlayer();
        private static int AUDIO_NO = 1;
        public static String isVideoSelected = "";
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            try{
                btn_play = (Button)findViewById(R.id.btn_play);
                btn_play.setOnClickListener(btn_listener);
                if(isVideoSelected!="") isVideoSelected="";
                Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        play_audio(AUDIO_NO);
                    }
                }, 1000);
            } catch(Exception e) {

            }
        }
        private void play_audio(int slno) {
            try {
                if(slno == 1) mp = MediaPlayer.create(getBaseContext(), R.raw.audio_1);
                else if(slno == 2) mp = MediaPlayer.create(getBaseContext(), R.raw.audio_2);
                mp.setLooping(false);
                mp.setOnCompletionListener(audio_listener);
                mp.start();
            } catch(Exception e) {
                // do nothing
            }
        }
        private MediaPlayer.OnCompletionListener audio_listener = new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub
                try{
                    mp.release();
                    if(AUDIO_NO == 1) {
                        play_audio(2);
                        AUDIO_NO++;
                    }
                } catch(Exception e) {

                }
            }
        };
        private View.OnClickListener btn_listener = new View.OnClickListener() {        
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                try{
                    if(mp.isPlaying()) {
                        mp.stop();
                        mp.release();
                    }
                    Intent intent = new Intent(getApplicationContext(), ScreenTwo.class);
                    startActivity(intent);
                } catch(Exception e) {

                } finally {
                }
            }
        };
        public void onUserLeaveHint() {
            super.onUserLeaveHint();
            try{
                if(mp.isPlaying()) {
                    mp.stop();
                    mp.release();
                }
                btn_play = null;
            } catch(Exception e) {

            }
        }
        @Override
        public void onDestroy() {
            super.onDestroy();
            try{
                if(mp.isPlaying()) {
                    mp.stop();
                    mp.release();
                }
                btn_play = null;
            } catch(Exception e) {

            }
        }
    }

【问题讨论】:

    标签: android android-activity android-homebutton


    【解决方案1】:

    我认为您需要在此处提供有关您的动机的更多信息:为什么要终止您在 Home press 上的活动而不是让系统管理它?你想要完成的不是自己发生的事情?如果只是不希望用户将任务切换回特定活动,请查看可用于 task stack 的各种标志。

    编辑:在这种情况下,您可能会导致您的包罗万象的异常处理出现问题。尝试将这些行移到finally 子句中,而不是放在try 中,并让您的异常处理程序至少记录它捕获的异常(Log.e("tag", "Exception caught; ignoring:", e))。包罗万象通常是不好的编程习惯,尤其是如果您至少没有记录异常以便查看问题所在。

            Intent intent = new Intent(getApplicationContext(), ScreenTwo.class);
            startActivity(intent);
    

    【讨论】:

    • @Yoni Samlan 我在主屏幕上有一个名为“播放”的按钮,按下它会将用户带到第二个屏幕。我还在主屏幕的背景中播放音频。现在,每当用户按下主页按钮退出应用程序并再次返回主屏幕时,“播放”按钮都不起作用。日志条目如下所示:03-07 19:47:36.062: WARN/AudioFlinger(3256): write blocked for 221 msecs, 170 delayed writes, thread 0xbec0。因此,我试图终止 Home press 上的活动。
    • 如果用户按下返回按钮退出应用程序并再次启动它,主屏幕上的“播放”按钮工作正常,而不是主页。
    • 日志可能不止这些?但是,如果您希望它跨 Activity 边界播放,您应该考虑使用服务来播放您的音乐。这里还缺少大量信息——例如,你现在如何播放音频?媒体播放器?声音池?
    • @Yoni Samlan 我正在使用 MediaPlayer 播放音频。我不打算在活动中播放它,而只在主屏幕上播放。 (用户来到主屏幕,听到音频,点击按钮并移动到第二个屏幕)。在前一个之后,我得到的唯一其他重要日志条目是:03-08 11:12:38.445: DEBUG/dalvikvm(1635): GC freed 6588 objects / 517232 bytes in 145ms。您认为在这种情况下终止活动可能是一个好的解决方案吗?
    • @yoni 我创建了一个新的处理程序来在 onResume() 方法中运行音频。现在它工作正常。非常感谢!
    【解决方案2】:

    onPause() 在用户离开您的活动时被调用,因此这不是调用finish() 的地方。此外,我不确定您是否可以覆盖 Home 按钮,或者您是否真的应该这样做。

    【讨论】:

    • 仅供参考,由于安全原因,Google 尚未实施任何覆盖 Home 按钮的方法,尽管您可以通过设计自己的 HomeScreen 应用程序来实施它(但这不是获得“OnPause”操作的建议方法)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多