Nic*_*ick 98 android dialog activity-finish android-activity
我在计时器上有一个闪屏.我的问题是,在finish()我的活动之前,我需要检查下一个活动是否已经开始,因为系统对话框弹出,我只想finish(); 一旦用户从对话框中选择了一个选项?
我知道有很多关于如何查看您的活动是否在前台的问题,但我不知道这是否允许在活动之上设置对话框.
这是问题,红色是我的活动,它在后台,而对话在前台:

编辑:我已经尝试过不使用finish()但是我的活动可以回到我试图避免的应用程序堆栈中.
But*_*ass 180
这是推荐的正确解决方案:
正确的解决方案(积分归Dan,CommonsWare和NeTeInStEiN)使用Activity.onPause,Activity.onResume方法自行跟踪应用程序的可见性.将"可见性"状态存储在其他类中.好的选择是您自己的应用程序或服务实现(如果您想检查服务的活动可见性,还有一些此解决方案的变体).
示例 实现自定义Application类(请注意isActivityVisible()静态方法):
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中注册您的应用程序类:
<application
    android:name="your.app.package.MyApplication"
    android:icon="@drawable/icon"
    android:label="@string/app_name" >
将onPause和onResume添加到项目中的每个Activity(如果您愿意,可以为您的活动创建一个共同的祖先,但如果您的活动已经从MapActivity/ListActivity等扩展,您仍然需要手动编写以下内容) :
@Override
protected void onResume() {
  super.onResume();
  MyApplication.activityResumed();
}
@Override
protected void onPause() {
  super.onPause();
  MyApplication.activityPaused();
}
在您的finish()方法中,您希望用于isActivityVisible()检查活动是否可见.在那里,您还可以检查用户是否选择了选项.满足两个条件时继续.
该消息来源还提到了两个错误的解决方案......所以避免这样做.
Him*_*ani 67
如果定位API级别14或更高级别,可以使用android.app.Application.ActivityLifecycleCallbacks 
public class MyApplication extends Application implements ActivityLifecycleCallbacks {
    private static boolean isInterestingActivityVisible;
    @Override
    public void onCreate() {
        super.onCreate();
        // Register to be notified of activity state changes
        registerActivityLifecycleCallbacks(this);
        ....
    }
    public boolean isInterestingActivityVisible() {
        return isInterestingActivityVisible;
    }
    @Override
    public void onActivityResumed(Activity activity) {
        if (activity instanceof MyInterestingActivity) {
             isInterestingActivityVisible = true;
        }
    }
    @Override
    public void onActivityStopped(Activity activity) {
        if (activity instanceof MyInterestingActivity) {
             isInterestingActivityVisible = false;
        }
    }
    // Other state change callback stubs
    ....
}
Ale*_*lia 14
UPD:已更新为状态Lifecycle.State.RESUMED。感谢@htafoya。
在2019年,借助新的支持库28+或AndroidX,您可以简单地使用:
val isActivityInForeground = activity.lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)
Muz*_*ant 10
这正是Activity类文档中描述的活动onPause与onStop事件之间的区别.
如果我理解正确,您要做的就是finish()从您的活动中调用onStop以终止它.请参阅活动生命周期演示应用程序的附图.这是它的外观,当活动B从活动A.事件的顺序是从下到上,所以你可以看到,活动一推出像onStop后,活动B被称为onResume已经调用.

如果显示对话框,则您的活动在后台变暗并且仅onPause被调用.
Activity :: hasWindowFocus()返回您需要的布尔值.
public class ActivityForegroundChecker extends TimerTask
{
    private static final long FOREGROUND_CHECK_PERIOD = 5000;
    private static final long FIRST_DELAY             = 3000;
    private Activity m_activity;
    private Timer    m_timer;
    public ActivityForegroundChecker (Activity p_activity)
    {
        m_activity = p_activity;
    }
    @Override
    public void run()
    {
        if (m_activity.hasWindowFocus() == true) {
            // Activity is on foreground
            return;
        }
        // Activity is on background.
    }
    public void start ()
    {
        if (m_timer != null) {
            return;
        }
        m_timer = new Timer();
        m_timer.schedule(this, FIRST_DELAY, FOREGROUND_CHECK_PERIOD);
    }
    public void stop ()
    {
        if (m_timer == null) {
            return;
        }
        m_timer.cancel();
        m_timer.purge();
        m_timer = null;
    }
}
这是一个示例课程,用于检查您的活动在任何地方的可见性.
请记住,如果显示对话框,则结果将为false,因为对话框将具有主焦点.除此之外,它比建议的解决方案更方便,更可靠.
使用实现ActivityLifecycleCallbacks的应用程序,并使用它来跟踪应用程序中的活动生命周期事件.请注意,ActivityLifecycleCallbacks适用于Android api> = 14.对于以前的Android API,您需要在所有活动中自行实现;-)
需要在活动中共享/存储状态时使用应用程序.
您可以使用此类RunningAppProcessInfo检查正在运行的进程的状态
使用ActivityManager.getRunningAppProcesses()获取正在运行的进程列表, 并过滤结果列表以检查所需的RunningAppProcessInfo并检查其"重要性"
| 归档时间: | 
 | 
| 查看次数: | 182210 次 | 
| 最近记录: |