在后退按钮和主页按钮时检查我的应用程序何时处于后台

时间:2012-03-29 10:48:46

标签: android

大家好我正在使用这种方法检查我的应用是否在后台:

public static boolean isApplicationSentToBackground(final Context context) {
    ActivityManager am = (ActivityManager) context
            .getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> tasks = am.getRunningTasks(1);
    for( RunningTaskInfo rti: tasks ) {
        ComponentName cn = rti.topActivity;
        LogHelper.i(TAG, "Component Name: " + cn.getPackageName() );
    }



    if (!tasks.isEmpty()) {
        ComponentName topActivity = tasks.get(0).topActivity;
        if (!topActivity.getPackageName().equals(context.getPackageName())) {
            return true;
        }
    }

    return false;
}

我在我的Activity onPause,onStop,onDestroy中调用了这个方法 这些是我的结果:

当我在我的活动中并点击android-home-button时,它遵循以下流程:

onPause - &gt;在背景?真正 onStop - &gt;在背景?真

这一切都很完美。 问题是当我点击从活动回到android主页的android-back-button时。这是流程:

onPause - &gt;在背景?假 onStop - &gt;在背景?假 onDestroy - &gt;在背景?假

如果您检查代码我有一个Log cat标记,它总是(在后面的按钮情况下)标记:

03-29 00:46:39.324:I / DFFramework(15344):MusicUtils - 组件名称:my-activity-name

这意味着我的活动不在后台。 我该怎么办?

更新:

我正在添加有关我的方案的更多信息。我正在开发一个音乐播放器,所以我要抓住这种事件,以便在应用程序关闭但音乐仍在播放时开始我的前台音频服务(否则音乐将暂停)。 因此,当应用程序处于后台时(例如,当您单击android-home-button时)或关闭应用程序时(例如,当您单击android-back-button时),我会抓住它。

2 个答案:

答案 0 :(得分:6)

所以这就是我解决的问题(模仿Google音乐播放器的行为)

正如我所说,我正在寻找两种事件:

  • 当我的应用进入后台时

  • 当用户点击并按下后退按钮并转到Android主页(应用程序被销毁)时

所以这是我在超级活动中完成的onPause

@Override
    protected void onPause() {
        boolean bg = MusicUtils.isApplicationSentToBackground(this);
        if ( bg ) {
            MusicUtils.startForegroundMusic(this);
        } else {
            if ( isBackPressed ) {
                //MusicUtils.getActiviesApplicationInBackStack(this) <= 1
                if ( isBackPressed && (this instanceof DashBoardActivity || MusicUtils.getActiviesApplicationInBackStack(this) <= 1) ) {
                    MusicUtils.startForegroundMusic(this);
                }
            }
        }
        super.onPause();
    }

首先,我使用isApplicationSentToBackground(问题正文中的源代码)检查应用程序是否在后台。

如果应用不在后台,有两个原因:

  • 活动仍在前台,因此onPause被调用因为我们正在开始一项新活动,或者我们正在改变方向(我需要跳过此事件)
  • 该应用程序将被销毁(因此活动相同)我需要捕获此事件才能启动foregroundMusic

因此,为了捕捉第二个事件,我检查用户是否按了后退按钮

private boolean isBackPressed = false;

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            LogHelper.i(TAG, "BACK PRESSED EVENT");
            isBackPressed = true;
        }

        // Call super code so we dont limit default interaction
        return super.onKeyDown(keyCode, event);
    }

如果他们按下了bakc-key,我会检查这个活动是否是最新活动(因此在当前活动被破坏后我的应用程序将被销毁!)

要检查这个,我得到MusicUtils.getActiviesApplicationInBackStack(this)返回的计数编号

    public static int getActiviesApplicationInBackStack(final Context context) {
    int count = 0;
    ActivityManager am = (ActivityManager) context.getSystemService( Context.ACTIVITY_SERVICE );
    List<RunningTaskInfo> runningTaskInfoList =  am.getRunningTasks(10);
    Iterator<RunningTaskInfo> itr = runningTaskInfoList.iterator();
    while(itr.hasNext()){
        RunningTaskInfo runningTaskInfo = (RunningTaskInfo)itr.next();
        if ( runningTaskInfo.topActivity.getPackageName().equals(context.getPackageName()) ) {
            count += runningTaskInfo.numActivities;
        }
    }
    return count;
}

我希望这个答案可以帮助我解决同样的问题:)我知道这是一个奇怪的场景,但是分享问题,想法和代码总是很好的思考:)

答案 1 :(得分:1)

你为什么要这样? “在后台”对你意味着什么?从活动的角度来看,您的应用程序处于活动状态(例如,已调用OnResume),它已暂停(已调用OnPaused)或已停止(已调用OnDestroy)。

在暂停状态下,您通常不应该做任何工作。您的应用已暂停,为需要系统资源的不同应用程序提供了帮助。

如果您需要确保某些内容在后台运行,那么您很可能需要一项服务,尽管使用在后台长时间运行的服务通常是不好的形式,除非您正在构建类似的东西例如,音乐播放器。

因此,根据您的评论,您正在制作音乐播放器。现在音乐播放器有两种模式:

  1. 用户在播放音乐时与其进行互动
  2. 音乐正在后台播放。
  3. 使用音乐播放服务是有意义的,这样它可以独立于控制音乐播放器(活动)的任务运行。当用户回击时,该活动将被销毁,当用户点击主页按钮,或者接到电话,锁定屏幕等时,活动将暂停。

    现在很容易发现这些情况。如果活动暂停,则表示用户正在执行其他操作。然后你应该确保你的音乐继续播放。 Android为此目的提供了startForeground,这意味着系统只会作为最后的手段将其杀死。因此,在您的活动的OnPause上,您应该通知服务并将其置于前台模式,这也将显示通知。

    对于用户完成OnDestroy活动的情况,您也可以这样做。

    唯一要做的就是确保在OnResume中再次启动活动时调用stopForeground

    我建议您阅读Android架构,了解不同组件和生命周期的工作原理。同样,应该有理由以您现在尝试的方式检查您的应用是否处于“后台”。