确定应用程序何时为前景的最佳方法

时间:2015-10-20 06:47:04

标签: android

我想问你最好的方法来确定我的应用程序当前对用户可见(前景)。我知道有两种解决方案:

  1. 使用ActivityManager,但这是非常昂贵的方式。
  2. 创建任何boolean变量并在onResume()中更改其状态 每个onPause()都有Activity个。该解决方案有一个主要方面 缺少额外的代码要记住。
  3. 你知道其他任何更好的方法吗?你怎么想,什么更好,为什么?

    修改

    根据我的第二个解决方案,Skywell建议我们可以在ActivityonResume()中创建onPause(),我们可以更改boolean变量的状态。应用程序中的每个Activity都应该扩展我们的新Activity。但这个想法几乎没有产生新的问题:

    1. 我们必须为所需类型的所有类型(例如Activity)复制新的ActionBarActivity
    2. 我们仍然需要记住扩展正确的活动,它可能会在较大的团队中出现问题。
    3. 我的第二个解决方案的很好的解释是在DroidAks的帖子中提供的。

2 个答案:

答案 0 :(得分:1)

如果您想跟踪应用是否在前台。这可能是最好的方法。 使用Activity.onPause,Activity.onResume方法自行检查应用程序的状态。存储"可见性"在其他一些班级中的地位。现在将您自己的Application类实现为:

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;
    }

现在在onResume()

中添加onPause()activity

我们可以使用AndroidLifecycleCallbacks来跟踪应用程序当前是否对用户可见。 AndroidLifecycleCallbacks在API级别14中添加。希望它可以帮助您。

@Override
protected void onResume() {
super.onResume();
MyApplication.activityResumed();
}

@Override
protected void onPause() {
super.onPause();
MyApplication.activityPaused();
}

同时在代码中添加清单。

<application
android:name="your.app.package.MyApplication"
android:icon="@drawable/icon"
android:label="@string/app_name" >

答案 1 :(得分:0)

DroidAks的回答很好,但还不够好。众所周知,在static变量中使用状态并不是最漂亮的事情。这样做意味着您必须记住您需要管理此状态并进行清理。此外,在这种情况下,在static类中包含Application个变量意味着您的类将完全依赖于此特定Application类。如果您想从您的代码中创建一个可以在许多应用程序中使用的库,该怎么办?

以下是我的建议:

public class MyApplication extends Application
{
    private boolean visible;
    public boolean isVisible()
    {
        return visible;
    } 
    //use Application events to manage app visibility state
}

在您的Activity代码中:

public class MyActivity extends Activity
{
    @Override
    protected void onResume() 
    {
        super.onResume();
        MyApplication myApp = (MyApplication)this.getApplication();
        //myApp.isVisible();
    }
}

如果上述MyApplication类实现不够(将visible设置为false可能会出现问题),那么请继续更正确地解决此问题:

public /*abstract*/ class MyActivity extends Activity
{
    private boolean visible;
    protected boolean isVisible()
    {
        return visible;
    } 
    //use Activity events to manage activity visibility state
    //for ex.
    @Override
    protected void onResume() 
    {
        super.onResume();
        visible = true;
    }
}

public class MyConcreteActivity extends MyActivity
{
    @Override
    protected void onResume() 
    {
        super.onResume(); // calls onResume from base MyActivity,
                          // thus always setting visible state properly
        //isVisible();
    }
}

请记住相应地更新您的清单文件。

修改

  

我们必须为每种类型复制新的活动(例如   ActionBarActivity)所需的Activity。   我们仍然需要记住   扩展正确的活动,在较大的团队中可能会出现问题。

以上所有内容都是通过一个接口解决的,该接口传递给需要向对象询问其可见性状态的功能的类。

public interface Hideable
{
   boolean isVisible();
}

如果有人想使用Your类,那么这个类应该明确地将Hideable接口作为其构造函数/公共方法参数之一。如果您想限制参数以扩展Activity AND 实现Hideable,那么这个通用示例(使用通配符)是正确的做法:

//TODO design new parameter name
public <T extends Activity & Hideable> void myMethod(T iNeedToBeHideableActivity)

看到这样的方法后,开发人员应该:

  1. 扩展已经实现此功能的预定义activities之一 接口。
  2. 或者在自己的activity
  3. 中实现此界面
  4. 询问您究竟是什么样的通配符。
  5. 在这种情况下,正确行为的要求是显而易见的 - 接口应该宣布特定对象是否可见。

    PS。这不是一个非常丑陋的重复,因为每个实现可能在某些方面有所不同。例如,Application类缺少onDestroy事件,因此Hideable接口的实现应该不同。

    修改

    通过添加泛型来改进上述建议。