gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:07:47 26 4
gpt4 key购买 nike

大家好,我正在使用这种方法来检查我的应用程序是否在后台运行:

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 中调用这个方法这是我的结果:

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

onPause -> 在后台?真的onStop -> 在后台?是的

一切都很完美。问题是当我点击 android-back-button 从 Activity 返回到 android home 时。这是流程:

onPause -> 在后台?错误的onStop -> 在后台?错误的onDestroy -> 在后台?假的

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

03-29 00:46:39.324: I/DFFramework(15344): MusicUtils - 组件名称:我的 Activity 名称

这意味着我的 Activity 不在后台。我能做什么?

更新:

我正在添加有关我的场景的更多信息。我正在开发一个音乐播放器,所以如果应用程序关闭但音乐仍在播放(否则音乐将暂停),我必须捕捉这种事件才能启动我的前台音频服务。所以我必须捕捉应用程序何时处于后台(例如当您单击 android-home-button 时)或何时关闭应用程序(例如当您单击 android-back-button 时)。

最佳答案

这就是我解决的方法(模拟 Google 音乐播放器的行为)

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

  • 当我的应用进入后台时

  • 当用户点击 androd-back-button 并转到 android home(应用被销毁)

所以这是我在 super Activity 中完成的 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(问题正文中的源代码)检查应用程序是否处于后台。

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

  • Activity 仍在前台,因此调用 onPause 是因为我们正在开始一个新 Activity 或我们正在改变方向(我需要跳过此事件)
  • 应用程序将被销毁(对于 Activity 也是如此),我需要捕获此事件以启动 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,我会检查这个 Activity 是否是最新的(所以在当前 Activity 被销毁后,我的应用程序将被销毁!)

为了检查这一点,我得到了 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;
}

我希望这个答案能帮助遇到同样问题的人 :) 我知道这是一个奇怪的场景,但分享问题、想法和代码总是一个好主意 :)

关于android - 检查后退按钮和主页按钮时我的应用程序何时处于后台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9923877/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com