检测android应用程序进入后台
当我的应用程序“转到后台”/“变为非活动状态”时,我需要关闭蓝牙 我尝试在MainActivity的onPause()中执行此操作,但由于现在BT关闭(启动了MainActivity的onPause()),即使我启动了一个新活动,其中显示了MainActivity中所选项目的实体详细信息,也无法执行此操作 我需要的是我的应用程序的某种“onPause()”,而不是单个活动检测android应用程序进入后台,android,activity-state,Android,Activity State,当我的应用程序“转到后台”/“变为非活动状态”时,我需要关闭蓝牙 我尝试在MainActivity的onPause()中执行此操作,但由于现在BT关闭(启动了MainActivity的onPause()),即使我启动了一个新活动,其中显示了MainActivity中所选项目的实体详细信息,也无法执行此操作 我需要的是我的应用程序的某种“onPause()”,而不是单个活动 我认为这样的方法是不存在的,所以有更好的解决方法吗?你可以参考这个问题,回答这个问题的人使用了onFocuschanged不
我认为这样的方法是不存在的,所以有更好的解决方法吗?你可以参考这个问题,回答这个问题的人使用了
onFocuschanged
不知道这个方法有多有效,不管怎样,继续在谷歌搜索
private boolean isApplicationBroughtToBackground() {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(context.getPackageName())) {
return true;
}
}
return false;
}
你可以在你的每一项活动上实现onPause(),但我认为不需要你自己关闭蓝牙,有些用户可能出于其他原因使用蓝牙,或者他们想自己打开它(我就是这么做的)对于一个不单独的活动应用,我建议每个活动都实现基于时间的可见性控制。在每个onPause()上启动定时状态检查器,并在每个onResume()方法上取消此计时器 这里有一个例子
@Override
protected void onPause() {
TimerTask backgroundCheck = new TimerTask() {
@Override
public void run() {
ActivityManager am = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(getApplicationContext().getPackageName())) {
// APP in background, do something
}
}
// APP in foreground, do something else
}
};
Timer isBackgroundChecker = new Timer();
isBackgroundChecker.schedule(backgroundCheck, 1000, 1000);
super.onPause();
}
@覆盖
受保护的void onPause(){
TimerTask backgroundCheck=新TimerTask(){
@凌驾
公开募捐{
ActivityManager am=(ActivityManager)getApplicationContext().getSystemService(Context.ACTIVITY_服务);
列表任务=am.getRunningTasks(1);
如果(!tasks.isEmpty()){
ComponentName topActivity=tasks.get(0).topActivity;
如果(!topActivity.getPackageName().equals(getApplicationContext().getPackageName())){
//应用程序在后台,做些什么
}
}
//应用程序在前台,执行其他操作
}
};
计时器isBackgroundChecker=新计时器();
isBackgroundChecker.时间表(backgroundCheck,10001000);
super.onPause();
}
实现后,记得取消
计时器isBackgroundChecker=new Timer()代码>更新:注意,根据评论,这并不是在所有情况下都有效
这里列出的解决方案对我来说太复杂了。我是这样想的:
创建可从所有活动访问的静态变量,以检测当前正在运行的活动的计数
public class SharedData {
static int runningActivities = 0;
}
在每个活动中,重写这两个方法
public void onStart() {
super.onStart();
if (SharedData.runningActivities == 0) {
// app enters foreground
}
SharedData.runningActivities++;
}
public void onStop() {
super.onStop();
SharedData.runningActivities--;
if (SharedData.runningActivities == 0) {
// app goes to background
}
}
您可以创建MyActivity extending Activity,将此代码放入其中并使所有活动扩展此类。不建议使用RunningTaskInfo
,因为其“方法”仅用于调试和显示任务管理用户界面“。好吧,如果你正在开发ICS及以上的应用程序,我发现这个链接非常有用
若要检测应用程序将进入后台,请在应用程序的应用程序类中重写以下方法:
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
if(level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN)
//called when app goes to background
}
在build.gradle文件中提取此依赖项:
然后在应用程序类中,使用以下命令:
更新您的AndroidManifest.xml文件:
Dude,我已经无数次地面对这个问题,但不幸的是,没有这样的方法或事件存在。你必须找到解决方法。将它放在主活动的onDestroy
和onBackPressed
中,这样当用户关闭应用程序时,蓝牙就会关闭。onDestroy()这不是我想要的,因为调用此方法可能需要时间。您有此方法的示例吗?getRunningTasks在API level 21(棒棒糖)中不推荐使用。文档中说不要使用它,因为它可能会“在未来有一个突破”这不起作用,因为如果我离开主活动并打开另一个活动(它是我应用程序的一部分),这意味着BT将关闭。您可以尝试使用片段?它们可以像活动一样工作,您可以将它们包含在单个活动中,这将在onPause()时打开蓝牙调用。至少到目前为止,它对我来说适用于多个活动。这不起作用。当通过backbutton恢复活动或从另一个活动输入活动时,也会触发此操作跟踪活动计数的陷阱是轮换。通常情况下,正在进行的活动在新活动之前完成新配置出现,导致背景->前景转换检测不正确。这是一个很好的答案。非常感谢!工作非常出色!顺便问一下,这是一个开源项目吗?可能在github上?我想研究一下它是如何工作的
dependencies {
implementation "android.arch.lifecycle:extensions:1.1.1"
}
public class MyApplication extends Application implements LifecycleObserver {
@Override
public void onCreate() {
super.onCreate();
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
private void onAppBackgrounded() {
Log.d("MyApp", "App in background");
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
private void onAppForegrounded() {
Log.d("MyApp", "App in foreground");
}
}
<application
android:name=".MyApplication"
....>
</application>