2010-01-05 67 views
4

我有一个应用程序使用服务在应用程序运行时以及不运行时在后台获取数据。 当它没有运行时,我想在有新数据时显示通知,但不会在应用程序运行时显示。如何确定我的应用程序何时运行?

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

回答

1

我想你想检查某个活动是否显示。如果这是真的,我会使用Activity.onCreate()方法在应用程序实例中设置一个标志,即使用字段“uiRunning”扩展类Application,并在您的服务中检查该字段。应该使用onDestroy()来取消标记属性。不要忘了在Manifest.xml中也使用您的应用程序类

+0

有不需要使用应用程序子类 - 只需在服务中添加一个静态变量,这些静态变量由这些方法设置(或调用一个维护内部静态状态的静态函数)。 与Application对象一样,不保证Activity。onDestroy()将被杀死 - 如果系统需要进程的内存,它将简单地终止进程,并且不会运行代码。 – hackbod 2010-01-05 02:17:00

+0

我唯一的想法也是沿着这些路线。我希望有一个uiRunning方法。我可以在不同的时间运行不同的活动的应用程序,这将使保持标志同步更复杂。 我想我应该设置/删除onStart/onStop的国旗? – Wilken 2010-01-05 09:08:24

0

我同意使用onCreate()/ onDestroy()为单个Activity应用程序,但具有多个活动的应用程序最好使用Application.onCreate()/ onTerminate()是为了避免在切换活动时触发uiRunning状态。

+0

Application.onTerminate()永远不会在正常的系统操作中被终止 - 当从后台进程需要内存时,它会被终止。被杀死的 – hackbod 2010-01-05 02:14:12

+0

,你的意思叫? – Wilken 2010-01-05 09:08:59

+0

没有它刚刚死亡,这只是为了模拟..应用程序没有通知它会被杀死。 – 2012-04-24 19:36:01

0

这很容易。您使用一个命名的互斥体。

把这个应用程序,你要检查:

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"); 
} 
+0

这是.net代码,不是吗? 除此之外,我同意,互斥体也会这样做。 – Wilken 2010-01-05 10:21:14

0

另一种选择是实行:

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

在检查,以确保其他应用程序正在运行的应用程序将这个监听器模式,并让您的服务使用addListener()和removeListener()的服务接口上的方法来管理侦听器列表。您的活动可以在连接到服务并将其自身删除onStop()(即应用程序不再可见或完全关闭)后将其自身添加为侦听器。

在您的服务中,检查听众的数量。如果没有听众,那么你知道你应该创建你的通知。

0

另一种完成的方法是将数据接收器分离到一个始终在后台运行的“服务”。您可以让应用程序绑定到服务并显示服务所获取的数据。

在后台运行应用程序的问题是,Android会在应用程序变得太旧时终止应用程序。它最好有这样的背景运行应用程序作为服务,而不是活动。

0

我所做的是在我的服务中使用一个标志,即根活动在onStart/onStop上设置和清除。这工作得很好。

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; 
} 
相关问题