如何确定我的应用程序正在运行?

4

我有一个应用程序,使用服务在后台获取数据,无论应用程序是否正在运行。

当应用程序未运行时,我希望在有新数据时显示通知,但是当应用程序正在运行时不显示通知。

如何在我的服务中确定应用程序是否正在运行?

7个回答

1

我认为您想要检查某个活动是否正在显示。如果是这样,我会使用Activity.onCreate()方法在应用程序实例中设置一个标志,即通过扩展Application类来添加一个名为"uiRunning"的字段,并在您的服务中检查此字段。onDestroy()应该用于取消标记属性。不要忘记在Manifest.xml中也使用您的Application类。


不需要使用Application子类 - 只需在服务中添加一个静态变量,这些方法设置它(或调用维护内部静态状态的静态函数)。与Application对象一样,也不能保证Activity.onDestroy()会被杀死 - 如果系统需要进程的内存,它将简单地杀死进程,并且其中不会运行任何代码。 - hackbod
我的想法也是沿着这个方向的。我希望有一个 uiRunning 方法存在。我可能会有一些应用程序,在不同的时间运行不同的活动,这将使保持标志同步变得更加复杂。我猜我应该在 onStart/onStop 中设置/删除标志? - Wilken

0

这很简单。您可以使用命名 Mutex。

将此代码放入要检查的应用程序中:

bool createdNew;
Mutex mutex = new Mutex(true, @"Global\YourAppNameHere", out createdNew);
if (createdNew)
{
    var app = new YourProcess();
    app.run();
    mutex.Close();
}

将此代码放入检查其他应用程序是否正在运行的应用程序中:
bool createdNew;
Mutex mutex = new Mutex(true, @"Global\YourAppNameHere", out createdNew);
if (createdNew)
{
    Console.WriteLine("App not running");
    mutex.Close();
} else {
    Console.WriteLine("App is running");
}

这是 .net 代码,不是吗? 除此之外,我同意,互斥锁会做同样的事情。 - Wilken

0
这就是我使用几行代码完美运作的方法:
在扩展的App类中:
public static boolean isAppInFront = false;

在你的主活动中:
@Override
public void onStart() {
    super.onStart();
    MyApplication.isAppInFront = true;
}

@Override
public void onStop() {
    super.onStop();
    if (isFinishing())
        MyApplication.isAppInFront = false;
}

0
我认为在单个Activity应用程序中使用onCreate()/onDestroy()是可行的,但是如果应用程序有多个活动,则最好使用Application.onCreate()/onTerminate(),以避免在切换活动时触发uiRunning状态。

在正常的系统操作中,Application.onTerminate()不会被杀死——当后台进程需要内存时,它会被简单地终止。 - hackbod
不,这只是模拟,应用程序没有通知将被杀死的调用。 - Matt Wolfe

0
另一个选项是实现监听器模式,并让您的服务管理具有addListener()和removeListener()方法的侦听器列表。在连接到服务后,您的活动可以将自身添加为侦听器,并在onStop()时(即当应用程序对用户不再可见或完全关闭时)将其删除。
在您的服务中,检查侦听器的计数。如果没有侦听器,则知道您应该创建通知。

0

另一种实现的方法是将数据接收器解耦为一个“服务”,该服务将始终在后台运行。您可以让应用程序绑定到该服务,并显示由服务获取的数据。

将应用程序放在后台的问题是,Android会在它变得太旧时杀死该应用程序。最好将这样的后台运行应用程序作为服务而不是活动。


0
我所做的是在我的服务中使用一个标记,在root活动的onStart/onStop中设置和清除该标记。这个方法非常有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接