检测android应用程序转到后台

时间:2013-12-09 11:35:24

标签: android activity-state

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

我尝试在我的MainActivity的onPause()中执行此操作,但由于现在BT关闭(Mainactivity的onPause()被触发),即使我开始显示实体详细信息的新活动,也无法工作从Mainactivity中选择的项目。

我需要的是某种" onPause()"我的应用程序不属于单一活动。

我认为这样的事情不存在,所以有什么更好的解决方案吗?

7 个答案:

答案 0 :(得分:9)

更新:请注意,根据评论,这并不适用于所有情况!

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

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

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

答案 1 :(得分:2)

您可以参考此问题How to detect when an Android app goes to the background and come back to the foreground使用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;
}

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

要检测该应用程序是否为后台,请在App的Application类中覆盖以下方法:

@Override
public void onTrimMemory(int level) {
    super.onTrimMemory(level);
    if(level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN)
        //called when app goes to background
}

答案 5 :(得分:1)

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

答案 6 :(得分:1)

  

在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>