大家好我正在使用这种方法检查我的应用是否在后台:
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时),我会抓住它。
答案 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(问题正文中的源代码)检查应用程序是否在后台。
如果应用不在后台,有两个原因:
因此,为了捕捉第二个事件,我检查用户是否按了后退按钮
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)。
在暂停状态下,您通常不应该做任何工作。您的应用已暂停,为需要系统资源的不同应用程序提供了帮助。
如果您需要确保某些内容在后台运行,那么您很可能需要一项服务,尽管使用在后台长时间运行的服务通常是不好的形式,除非您正在构建类似的东西例如,音乐播放器。
因此,根据您的评论,您正在制作音乐播放器。现在音乐播放器有两种模式:
使用音乐播放服务是有意义的,这样它可以独立于控制音乐播放器(活动)的任务运行。当用户回击时,该活动将被销毁,当用户点击主页按钮,或者接到电话,锁定屏幕等时,活动将暂停。
现在很容易发现这些情况。如果活动暂停,则表示用户正在执行其他操作。然后你应该确保你的音乐继续播放。 Android为此目的提供了startForeground,这意味着系统只会作为最后的手段将其杀死。因此,在您的活动的OnPause上,您应该通知服务并将其置于前台模式,这也将显示通知。
对于用户完成OnDestroy活动的情况,您也可以这样做。
唯一要做的就是确保在OnResume中再次启动活动时调用stopForeground。
我建议您阅读Android架构,了解不同组件和生命周期的工作原理。同样,应该有理由以您现在尝试的方式检查您的应用是否处于“后台”。