一个如何能Service
检查,如果它的一个应用程序的Activity
是在前台运行?
Answer 1:
使用下面的方法与你的包名。 如果您的任何活动是在前台,它将返回true。
public boolean isForeground(String myPackage) {
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> runningTaskInfo = manager.getRunningTasks(1);
ComponentName componentInfo = runningTaskInfo.get(0).topActivity;
return componentInfo.getPackageName().equals(myPackage);
}
更新:
添加权限:
<uses-permission android:name="android.permission.GET_TASKS" />
Answer 2:
使用SharedPreferences保存在您的onResume应用,在onPause等的状态
像这样:
@Override
public void onPause() {
super.onPause();
PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("isActive", false).commit();
}
@Override
public void onDestroy() {
super.onDestroy();
PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("isActive", false).commit();
}
@Override
public void onResume() {
super.onResume();
PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("isActive", true).commit();
}
然后在服务:
if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("isActive", false)) {
return;
}
我用这两个的onPause和的onDestroy因为有时跳直的onDestroy :)它基本上所有的巫术
无论如何,希望可以帮助别人
Answer 3:
从棒棒糖开始, getRunningTasks
被弃用:
* <p><b>Note: this method is only intended for debugging and presenting * task management user interfaces</b>. This should never be used for * core logic in an application, such as deciding between different * behaviors based on the information found here.</p> * * @deprecated As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method * is no longer available to third party applications.
要做到这一点的方法之一是绑定到应用程序启动该服务。 然后:1.如果您需要检查的任何应用程序的活动的运行,你可以创建一个基类的活动,覆盖的onPause和的onResume。 在的onPause,呼叫服务方法,让它知道它的背景。 在的onResume,呼叫服务方法,让它知道它是在前台。 2.如果你只需要做到这一点就一些具体的活动,只是覆盖的onResume和的onPause这些活动或为这些活动建立一个基地活动。
Answer 4:
有一个缺陷,以大部分的答案上面,如果你的活动有一定的功能,过顶触发其他活动,例如发送电子邮件
该topActivity
不会返回你的包的名字,而是Android的活动选择包名。
因此,最好是检查的baseActivity
而不是topActivity
。
public boolean isMainActivityRunning(String packageName) {
ActivityManager activityManager = (ActivityManager) getSystemService (Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasksInfo = activityManager.getRunningTasks(Integer.MAX_VALUE);
for (int i = 0; i < tasksInfo.size(); i++) {
if (tasksInfo.get(i).baseActivity.getPackageName().toString().equals(packageName)
return true;
}
return false;
}
Answer 5:
我想你可以在Android getRunninTasks,并检查你的包名,如果正在运行的任务或没有。
public boolean isServiceRunning() {
ActivityManager activityManager = (ActivityManager)Monitor.this.getSystemService (Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE);
isServiceFound = false;
for (int i = 0; i < services.size(); i++) {
if (services.get(i).topActivity.toString().equalsIgnoreCase("ComponentInfo{com.lyo.AutoMessage/com.lyo.AutoMessage.TextLogList}")) {
isServiceFound = true;
}
}
return isServiceFound;
}
Answer 6:
使用下面的方法来获得当前活动的全类名(包+类名),并检查它是否等于活动的需要完整的类名(包+类名):
public String getCurrentClass() {
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> runningTaskInfo = manager.getRunningTasks(1);
ComponentName componentInfo = runningTaskInfo.get(0).topActivity;
String className = componentInfo.getClassName();
return className;
}
文章来源: Check if Activity is running from Service