Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何确定应用程序何时运行?_Android - Fatal编程技术网

Android 如何确定应用程序何时运行?

Android 如何确定应用程序何时运行?,android,Android,我有一个应用程序,在应用程序运行和不运行时都使用服务在后台获取数据。 当它不运行时,我希望在有新数据时显示通知,但在应用程序运行时不显示通知 如何在我的服务中确定应用程序是否正在运行?我想您需要检查是否显示了特定的活动。如果这是真的,我将使用Activity.onCreate()方法在应用程序实例中设置一个标志,即使用字段“uiRunning”扩展类应用程序,并在服务中检查该字段。onDestroy()应用于取消该属性的延迟。不要忘记在Manifest.xml中也使用您的应用程序类,我同意对单个

我有一个应用程序,在应用程序运行和不运行时都使用服务在后台获取数据。 当它不运行时,我希望在有新数据时显示通知,但在应用程序运行时不显示通知


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

我想您需要检查是否显示了特定的活动。如果这是真的,我将使用Activity.onCreate()方法在应用程序实例中设置一个标志,即使用字段“uiRunning”扩展类应用程序,并在服务中检查该字段。onDestroy()应用于取消该属性的延迟。不要忘记在Manifest.xml中也使用您的应用程序类,我同意对单个活动应用程序使用onCreate()/onDestroy(),尽管具有多个活动的应用程序最好使用Application.onCreate()/onTerminate()以避免在切换活动时触发uiRunning状态

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

将其放入要检查的应用程序中:

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

另一个选项是实现侦听器模式,并让您的服务使用addListener()和RemovelListener()的服务接口上的方法管理侦听器列表。您的活动可以在连接到服务后将自身添加为侦听器,并在top()上删除自身(即,当应用程序不再对用户可见或已完全关闭时)


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

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


将应用程序放在后台的问题是,一旦应用程序太旧,Android就会杀死它。让这样的后台应用程序作为服务而不是活动运行总是更好的。

我所做的是在我的服务中使用一个标志,根活动在启动/启动时设置和清除。这非常好。

我就是这样做的,只需几行代码就可以完美地工作:

在扩展应用程序类中:

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

在正常的系统操作中,Application.onTerminate()永远不会被终止——当后台进程需要内存时,它只会被终止。不,它只是被终止,这只是为了模拟。。应用程序没有用于通知其将被终止的调用。不需要使用应用程序子类——只需在这些方法设置的服务中添加一个静态变量(或调用维护内部静态状态的静态函数)。同样对于应用程序对象,也不能保证Activity.onDestroy()会被终止——如果系统需要进程的内存,它只会终止进程,并且不会在其中运行任何代码。我唯一的想法也是这样。我希望在某个地方有一种跑步的方法。我可以使用在不同时间运行不同活动的应用程序,这将使保持标志同步更加复杂。我想我应该在onStart/onStop中设置/删除标志?这是.net代码,不是吗?除此之外,我同意互斥也会这样做。