Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测android应用程序进入后台_Android_Activity State - Fatal编程技术网

检测android应用程序进入后台

检测android应用程序进入后台,android,activity-state,Android,Activity State,当我的应用程序“转到后台”/“变为非活动状态”时,我需要关闭蓝牙 我尝试在MainActivity的onPause()中执行此操作,但由于现在BT关闭(启动了MainActivity的onPause()),即使我启动了一个新活动,其中显示了MainActivity中所选项目的实体详细信息,也无法执行此操作 我需要的是我的应用程序的某种“onPause()”,而不是单个活动 我认为这样的方法是不存在的,所以有更好的解决方法吗?你可以参考这个问题,回答这个问题的人使用了onFocuschanged不

当我的应用程序“转到后台”/“变为非活动状态”时,我需要关闭蓝牙

我尝试在MainActivity的onPause()中执行此操作,但由于现在BT关闭(启动了MainActivity的onPause()),即使我启动了一个新活动,其中显示了MainActivity中所选项目的实体详细信息,也无法执行此操作

我需要的是我的应用程序的某种“onPause()”,而不是单个活动


我认为这样的方法是不存在的,所以有更好的解决方法吗?

你可以参考这个问题,回答这个问题的人使用了
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>