我有一个活动,在onCreate方法中我必须检查活动是在前台还是后台。如果活动在前台,那么我必须向服务器发送请求,如果应用程序进入后台,那么我必须发送服务器请求通过Intent服务。我怎么能这样做。
如果应用程序进入前台的后台停止服务器请求,是否有任何方法。
答案 0 :(得分:1)
尝试使用此功能检查您的应用是否在前台
public static boolean isAppInForeground(Context ctx) {
ActivityManager activityManager = (ActivityManager) ctx
.getApplicationContext().getSystemService(
Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> services = activityManager
.getRunningTasks(Integer.MAX_VALUE);
if (services == null) {
return false;
}
if (services.size() > 0
&& services.get(0).topActivity
.getPackageName()
.toString()
.equalsIgnoreCase(
ctx.getApplicationContext().getPackageName()
.toString())) {
return true;
}
return false;
}
答案 1 :(得分:1)
使用 Activity.onPause,Activity.onResume 方法自行跟踪应用程序的可见性。
示例实现自定义应用程序类:
public class MyApplication extends Application {
public static boolean isActivityVisible() {
return activityVisible;
}
public static void activityResumed() {
activityVisible = true;
}
public static void activityPaused() {
activityVisible = false;
}
private static boolean activityVisible;
}
在AndroidManifest.xml
然后是这样的:
@Override
protected void onResume() {
super.onResume();
MyApplication.activityResumed();
}
@Override
protected void onPause() {
super.onPause();
MyApplication.activityPaused();
}
答案 2 :(得分:1)
最好的方法是你应该在你的活动的onStop()调用中触发你的服务,因为服务启动onStatCommand()中的逻辑将被执行,如果你想你的服务不应该依赖于应用程序生命周期返回在onStatCommand()中使用START_STICKY。
答案 3 :(得分:1)
以下是使用Application
类的解决方案。
public class AppSingleton extends Application implements Application.ActivityLifecycleCallbacks {
private WeakReference<Context> foregroundActivity;
@Override
public void onActivityResumed(Activity activity) {
foregroundActivity=new WeakReference<Context>(activity);
}
@Override
public void onActivityPaused(Activity activity) {
String class_name_activity=activity.getClass().getCanonicalName();
if (foregroundActivity != null &&
foregroundActivity.get().getClass().getCanonicalName().equals(class_name_activity)) {
foregroundActivity = null;
}
}
//............................
public boolean isOnForeground(@NonNull Context activity_cntxt) {
return isOnForeground(activity_cntxt.getClass().getCanonicalName());
}
public boolean isOnForeground(@NonNull String activity_canonical_name) {
if (foregroundActivity != null && foregroundActivity.get() != null) {
return foregroundActivity.get().getClass().getCanonicalName().equals(activity_canonical_name);
}
return false;
}
}
如果您有对所需活动的引用或使用活动的规范名称,您可以查明它是否在前台。这个解决方案可能不是万无一失的。因此,您的评论非常受欢迎。
答案 4 :(得分:-1)
检查this库。它可以跟踪当前的活动状态。