我有前台服务,可以通过单击通知中的“X”来停止前台服务。确定在点击通知时是否显示应用程序
当前台服务停止时,应显示其他活动。
问题是,我不知道该应用程序是否可见或在单击“X”按钮时在后台。当应用程序可见时,应该更改活动。
我有前台服务,可以通过单击通知中的“X”来停止前台服务。确定在点击通知时是否显示应用程序
当前台服务停止时,应显示其他活动。
问题是,我不知道该应用程序是否可见或在单击“X”按钮时在后台。当应用程序可见时,应该更改活动。
检查ab你的活动是否在前台运行?在这里你去:
public boolean isRunning(Context ctx) {
try {
ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
// The first in the list of RunningTasks is always the foreground
// task.
RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0);
String foregroundTaskPackageName = foregroundTaskInfo.topActivity
.getPackageName();// get the top fore ground activity
PackageManager pm = context.getPackageManager();
PackageInfo foregroundAppPackageInfo = pm.getPackageInfo(
foregroundTaskPackageName, 0);
String foregroundTaskAppName = foregroundAppPackageInfo.applicationInfo
.loadLabel(pm).toString();
// Log.e("", foregroundTaskAppName +"----------"+
// foregroundTaskPackageName);
if (!foregroundTaskAppName.equals("Your App name")) {
return true;
}
} catch (Exception e) {
Log.e("isAppSentToBackground", "" + e);
}
return false;
}
对于API等级> = 21
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.AppTask> tasks = activityManager.getAppTasks();
for (ActivityManager.AppTask task : tasks) {
Log.d(TAG, "stackId: " + task.getTaskInfo().stackId);
}
对于您的问题没有100%担保解决方案。
一个最简单的是跟踪在全局变量可见的活动:
public void onResume(){
super.onResume();
App.visibleActivity = this;
}
public void onPause(){
super.onPause();
App.visibleActivity = null;
}
但也有一些重要的事情:
1)不要忘记在的onPause释放visibleActivity以防止内存泄漏
2)当前onPause和下一个onResume之间存在时间差,当您的应用在技术上处于后台时
如果如果活动在我得到2项任务,一个是服务,一个是活动的后台运行。只有当活动被操作系统杀死时,只有一项任务。 – sativa
@sativa:是的,这里你必须检查堆栈中的第一个任务总是在前台 – Jai
@sativa由于该方法已被弃用,因此该代码不适用于Andoid API Level> = 21 [API文档链接](https ://developer.android.com/reference/android/app/ActivityManager.html#getRunningTasks(int)) – harsh201