我想问你最好的方法来确定我的应用程序当前对用户可见(前景)。我知道有两种解决方案:
ActivityManager
,但这是非常昂贵的方式。 boolean
变量并在onResume()
中更改其状态
每个onPause()
都有Activity
个。该解决方案有一个主要方面
缺少额外的代码要记住。你知道其他任何更好的方法吗?你怎么想,什么更好,为什么?
修改
根据我的第二个解决方案,Skywell建议我们可以在Activity
和onResume()
中创建onPause()
,我们可以更改boolean
变量的状态。应用程序中的每个Activity
都应该扩展我们的新Activity
。但这个想法几乎没有产生新的问题:
Activity
)复制新的ActionBarActivity
。我的第二个解决方案的很好的解释是在DroidAks的帖子中提供的。
答案 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)
看到这样的方法后,开发人员应该:
activities
之一
接口。 activity
。在这种情况下,正确行为的要求是显而易见的 - 接口应该宣布特定对象是否可见。
PS。这不是一个非常丑陋的重复,因为每个实现可能在某些方面有所不同。例如,Application
类缺少onDestroy
事件,因此Hideable
接口的实现应该不同。
修改强>
通过添加泛型来改进上述建议。