当我的应用程序“进入后台”/“变为非活动状态”时,我需要关闭蓝牙。
我试图在我的 MainActivity 的 onPause() 中执行此操作,但这不起作用,因为现在 BT 关闭(Mainactivity 的 onPause() 被触发)即使我开始一个新的活动,显示来自 Mainactivity 的所选项目的实体详细信息.
我需要的是我的应用程序的某种“onPause()”,而不是单个活动。
我认为没有这样的东西存在,所以有什么更好的解决方案吗?
当我的应用程序“进入后台”/“变为非活动状态”时,我需要关闭蓝牙。
我试图在我的 MainActivity 的 onPause() 中执行此操作,但这不起作用,因为现在 BT 关闭(Mainactivity 的 onPause() 被触发)即使我开始一个新的活动,显示来自 Mainactivity 的所选项目的实体详细信息.
我需要的是我的应用程序的某种“onPause()”,而不是单个活动。
我认为没有这样的东西存在,所以有什么更好的解决方案吗?
在你的 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>
更新:当心,根据评论,这在所有情况下都不起作用!!!
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,将此代码放入其中并使您的所有活动都扩展此类。
要检测该应用程序将进入后台,请在您的 App 的 Application 类中覆盖以下方法:
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
if(level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN)
//called when app goes to background
}
你可以参考这个问题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;
}
对于一个不单一的活动应用程序,我建议每个活动都实现基于时间的可见性控制。在每个 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();
不建议使用它,RunningTaskInfo
因为它的“方法仅用于调试和呈现任务管理用户界面”。好吧,如果您正在为 ICS 及以上开发应用程序,我发现此链接非常有用!
http://vardhan-justlikethat.blogspot.in/2013/05/android-solution-to-detect-when-android.html
您可以在您拥有的每个活动上实现 onPause() ,但我认为不需要自己关闭蓝牙,有些用户可能出于其他原因使用蓝牙,或者他们想自己关闭它(这就是我愿意 )