当我的应用程序转到后台时,我需要关闭蓝牙" /"变为非活动状态"。
我尝试在我的MainActivity的onPause()中执行此操作,但由于现在BT关闭(Mainactivity的onPause()被触发),即使我开始显示实体详细信息的新活动,也无法工作从Mainactivity中选择的项目。
我需要的是某种" onPause()"我的应用程序不属于单一活动。
我认为这样的事情不存在,所以有什么更好的解决方案吗?
答案 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>