2014-08-27 51 views
0

我将声音设置为我的应用程序使用偏好,我设法禁止使用当Android应用程序在后台运行的识别 - Home键按下

Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED, 0); 

Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED, 1); 

使声音但是当按下home键暂停应用程序时,我需要将声音保留为默认值。我找不到任何方法来识别这种方法。

我知道,试图在任何活动生命周期方法中做到这一点是行不通的。 有没有什么办法可以识别,我的应用程序是在后台还是在运行? (我想对整个应用的角度来看,这样我就可以使声音时,用户将其最小化,并重新禁用时,他来到了我的应用程序)

在此先感谢

+0

的可能的复制【如何当一个Android应用程序转到后台检测和回来的前景(http://stackoverflow.com/questions/4414171/how -to-检测 - 当 - 的 - Android的应用程序,去到的背景和先得背到了-FO) – ant 2017-04-10 09:08:22

回答

1

首先,我用一个android.app.Application实例(我们称之为MyApplication),它有一个Timer,一个TimerTask,一个常量来表示从一个活动到另一个活动转换的最大毫秒数(我的值为2s) ,以及一个表示应用程序是否在“后台”中的布尔值:

public class MyApplication extends Application { 

private Timer mActivityTransitionTimer; 
private TimerTask mActivityTransitionTimerTask; 
public boolean wasInBackground; 
private final long MAX_ACTIVITY_TRANSITION_TIME_MS = 2000; 
... 

该应用程序通货膨胀还提供了启动和停止计时器/任务两种方法:

public void startActivityTransitionTimer() { 
this.mActivityTransitionTimer = new Timer(); 
this.mActivityTransitionTimerTask = new TimerTask() { 
    public void run() { 
     MyApplication.this.wasInBackground = true; 
    } 
}; 

this.mActivityTransitionTimer.schedule(mActivityTransitionTimerTask, 
             MAX_ACTIVITY_TRANSITION_TIME_MS); 
} 

public void stopActivityTransitionTimer() { 
if (this.mActivityTransitionTimerTask != null) { 
    this.mActivityTransitionTimerTask.cancel(); 
} 

if (this.mActivityTransitionTimer != null) { 
    this.mActivityTransitionTimer.cancel(); 
} 

this.wasInBackground = false; 
} 

最后一块这个解决方案是将呼叫添加到每个从的onResume(),并在onPause这些方法()事件的所有活动或者,优选地,在碱的活动从所有的混凝土活动继承:

@Override 
public void onResume() 
{ 
super.onResume(); 

MyApplication myApp = (MyApplication)this.getApplication(); 
if (myApp.wasInBackground) 
{ 
    //Do specific came-here-from-background code 
} 

myApp.stopActivityTransitionTimer(); 
} 

@Override 
public void onPause() 
{ 
super.onPause(); 
((MyApplication)this.getApplication()).startActivityTransitionTimer(); 
} 

所以在的情况下,当用户简单地应用程式的活动之间导航时,脱离活动的onPause()启动计时器,但几乎立即进入的新活动会取消定时器,直到达到最大转换时间。因此,背景将是错误的。

另一方面,当一个活动从启动器到达前台,设备唤醒,结束通话等时,很可能在该事件之前执行定时器任务,因此wasInBackground被设置为true。

How to detect... 由于复制到d60402