这是我使用的方法,似乎效果很好:
我有一个我自己的顶级应用程序类,它扩展了应用程序
public class MyApplication extends Application implements Application.ActivityLifecycleCallbacks {
您还需要在清单文件中注册此应用程序对象:
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:name=".MyApplication">
请注意我还如何实现 ActivityLifeCycleCallbacks 接口。该接口有以下方法:
public static interface ActivityLifecycleCallbacks {
void onActivityCreated(android.app.Activity activity, android.os.Bundle bundle);
void onActivityStarted(android.app.Activity activity);
void onActivityResumed(android.app.Activity activity);
void onActivityPaused(android.app.Activity activity);
void onActivityStopped(android.app.Activity activity);
void onActivitySaveInstanceState(android.app.Activity activity, android.os.Bundle bundle);
void onActivityDestroyed(android.app.Activity activity);
}
您需要实现这些方法,然后在您的应用程序 onCreate() 中注册这些事件,如下所示
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
这将在活动生命周期方法发生时调用回调(MyApplication 对象),例如 onCreate()、onPause 等。
在您的 onActivityPaused() 中,您可以通过调用 @peceps 方法检查应用程序是否在后台:isApplicationSentToBackground(...)
这就是我的代码的样子...
/**
* Application.ActivityLifecycleCallbacks methods
*/
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
try {
boolean foreground = new ForegroundCheckTask().execute(getApplicationContext()).get();
if(!foreground) {
//App is in Background - do what you want
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
创建一个新类来进行前台检查(这是一个异步任务)。请参阅check android application is in foreground or not? 了解更多信息。
class ForegroundCheckTask extends AsyncTask<Context, Void, Boolean> {
@Override
protected Boolean doInBackground(Context... params) {
final Context context = params[0];
return isAppOnForeground(context);
}
private boolean isAppOnForeground(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
if (appProcesses == null) {
return false;
}
final String packageName = context.getPackageName();
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.processName.equals(packageName)) {
return true;
}
}
return false;
}
}