【发布时间】:2016-09-26 07:37:10
【问题描述】:
我有一个前台服务,可以通过单击通知中的“X”来停止它。
当前台服务停止时,应显示其他活动。
问题是,当单击“X”按钮时,我不知道应用程序是可见的还是在后台。当应用可见时,应更改活动。
【问题讨论】:
标签: android notifications
我有一个前台服务,可以通过单击通知中的“X”来停止它。
当前台服务停止时,应显示其他活动。
问题是,当单击“X”按钮时,我不知道应用程序是可见的还是在后台。当应用可见时,应更改活动。
【问题讨论】:
标签: android notifications
对于您的问题没有 100% 的保证解决方案。
其中一个最简单的方法是在全局变量中跟踪可见活动:
public void onResume(){
super.onResume();
App.visibleActivity = this;
}
public void onPause(){
super.onPause();
App.visibleActivity = null;
}
但是有一些重要的事情:
1) 不要忘记在 onPause 时释放 visibleActivity 以防止内存泄漏
2) 当您的应用在技术上处于后台时,当前的 onPause 和下一个 onResume 之间存在时间间隔
【讨论】:
检查您的活动是否在前台运行?给你:
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);
}
【讨论】: