9

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

我试图在我的 MainActivity 的 onPause() 中执行此操作,但这不起作用,因为现在 BT 关闭(Mainactivity 的 onPause() 被触发)即使我开始一个新的活动,显示来自 Mainactivity 的所选项目的实体详细信息.

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

我认为没有这样的东西存在,所以有什么更好的解决方案吗?

4

7 回答 7

16

在你的 build.gradle 文件中拉取这个依赖:

dependencies {
    implementation "android.arch.lifecycle:extensions:1.1.1"
}

然后在你的 Application 类中,使用这个:

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");
    }
}

更新您的 AndroidManifest.xml 文件:

<application
    android:name=".MyApplication"
    ....>
</application>
于 2018-05-17T19:54:27.647 回答
9

更新:当心,根据评论,这在所有情况下都不起作用!!!

SO上列出的解决方案对我来说似乎太复杂了。我想出了使用这个:

创建可从您的所有活动中访问的静态变量,以检测当前正在运行的活动的数量。

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 扩展 Activity,将此代码放入其中并使您的所有活动都扩展此类。

于 2014-10-06T13:50:41.133 回答
3

要检测该应用程序将进入后台,请在您的 App 的 Application 类中覆盖以下方法:

@Override
public void onTrimMemory(int level) {
    super.onTrimMemory(level);
    if(level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN)
        //called when app goes to background
}
于 2016-11-30T07:17:12.963 回答
2

你可以参考这个问题How to detect when an Android app go to the background and come back to the frontground回答这个问题的人用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;
}
于 2013-12-09T11:39:44.913 回答
2

对于一个不单一的活动应用程序,我建议每个活动都实现基于时间的可见性控制。在每个 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();
}

实施后,记得取消Timer isBackgroundChecker = new Timer();

于 2013-12-09T11:51:19.357 回答
2

不建议使用它,RunningTaskInfo因为它的“方法仅用于调试和呈现任务管理用户界面”。好吧,如果您正在为 ICS 及以上开发应用程序,我发现此链接非常有用!

http://vardhan-justlikethat.blogspot.in/2013/05/android-solution-to-detect-when-android.html

于 2014-11-20T02:59:55.257 回答
1

您可以在您拥有的每个活动上实现 onPause() ,但我认为不需要自己关闭蓝牙,有些用户可能出于其他原因使用蓝牙,或者他们想自己关闭它(这就是我愿意 )

于 2013-12-09T11:40:20.910 回答