Android 不管创建的应用程序是否仍在运行,是否仍要创建一个后台进程服务来运行?

Android 不管创建的应用程序是否仍在运行,是否仍要创建一个后台进程服务来运行?,android,service,background-process,Android,Service,Background Process,所以,我想让我的应用程序创建一个服务,最初在后台运行,然后做一些事情。这个后台进程永远不会停止。它将持续运行。创建或销毁后台进程的唯一方法是通过应用程序。我知道有无限的可能杀死一个进程。我想我希望我的应用程序能够告诉我进程是否正在运行,并从该进程中检索实时信息。除此之外,您还可以启动和/或销毁后台进程 那么,假设您要打开应用程序并启动/创建服务。即使您关闭应用程序的/terminal/call onDestroy,我仍然希望后台进程能够运行。销毁此服务的唯一方法是重新打开/重新创建应用程序,然后

所以,我想让我的应用程序创建一个服务,最初在后台运行,然后做一些事情。这个后台进程永远不会停止。它将持续运行。创建或销毁后台进程的唯一方法是通过应用程序。我知道有无限的可能杀死一个进程。我想我希望我的应用程序能够告诉我进程是否正在运行,并从该进程中检索实时信息。除此之外,您还可以启动和/或销毁后台进程

那么,假设您要打开应用程序并启动/创建服务。即使您关闭应用程序的/terminal/call onDestroy,我仍然希望后台进程能够运行。销毁此服务的唯一方法是重新打开/重新创建应用程序,然后将其销毁

Android允许这样的事情吗?有没有办法绕过这个问题

我打算创建一个
IntentService
,并让它运行一个无限循环。不过,我唯一的问题是如何从
IntentService
获取信息。据我所知,创建了一个
IntentService
,并在完成后自杀


我对Android还是新手,所以请不要犹豫,具体点和/或补救点。

只需制作两个应用程序。一个是服务,一个是应用。(因为服务和应用程序在“UI”线程上运行)。。这样就有了两个独立的过程。使用aidl在两者之间进行通信。。不会使用意向服务,这些服务应该是短期的

你不需要为此制作两个应用程序,事实上,如果你的要求是只能从主应用程序停止/创建服务,那么这只会使事情变得过于复杂(例如,你根本不需要aidl,因为它都在同一个应用程序中),这就是上面的答案(还不能回复!)

只需在与其他活动相同的包上创建应用程序和服务类。然后在清单xml上,在应用程序节点上注册如下服务:

<service
        android:name="com.example.yourpackage.Service"
        android:process=":remote"> 
        <intent-filter>
            <action
                android:name="com.example.yourpackage.Service" />
        </intent-filter>
    </service>
· · ·

无论如何,请确保您阅读了有关服务(和广播接收器)的文档,但这会让您大致了解到目标在哪里,以及如何避免过度复杂

我最近一直在服务部门工作,所以我对这件事很了解,如果你有任何问题,请在这里告诉我

>>>>


啊,我想我现在明白你的意思了。。如果您不想在“应用程序”完成后继续运行服务,请忘记:远程部分。这样,他们将共享相同的应用程序生命周期(但不是上下文生命周期,因为他们有不同的生命周期),如果这一部分让您感到困惑,那么很抱歉,谢谢您的投票

用户SupersSwarnings给您的解决方案是正确的,只是您将强制服务在单独的进程中运行,我认为您不会对此感兴趣。它只会帮助您在主进程死亡(可能是因为未处理的异常)后保持服务运行,但事实是,如果您有一个正在运行的服务,则主进程永远不会死亡。将服务放在单独的VM进程中的问题是,您将失去使用相同内存空间的能力,因此单例、静态变量等将无法按预期工作。此外,从主进程到服务进程的每个调用都将通过绑定机制进行序列化,这会导致速度损失,并限制序列化数据不超过1MB(例如,如果传递大字节数组,可能会发生这种情况)。
因此,我的意见是,您应该使用不带android:process属性的SupersWarnings解决方案。

答案非常简单

  • 创建一个
    服务
    (不是
    IntentService
    ,只是一个简单的
    服务
    )并从您的活动开始。IntentService在您的情况下不起作用,因为一旦您从
    OnHandleContent()
  • 您的服务将继续运行,直到有人显式地对其调用stop方法或服务本身调用
    stopSelf()
    method。但在内存不足的情况下,平台可能会终止您的后台服务。当设备有足够的内存时,如果您在onStartCommand()中返回
    START\u STICKY
    ,使您的服务具有粘性,平台将重新启动您的服务
  • 需要时从活动中调用
    stopService()
    。即使您的活动停止/终止并重新启动,这也无关紧要
  • 您实际上不需要在另一个流程中启动服务。因为只要应用程序的任何实体(活动、服务、接收者)处于活动状态,平台就会确保启动并保持应用程序流程处于活动状态。别担心,如果进程正在运行,但其所有活动均未激活,则应用程序将不会显示在“正在运行的应用程序”列表中

希望这能回答您的问题。

我遇到了同样的问题,我在常规
服务的
onStartCommand()
中调用了
startForeground()
,而不是
IntentService
,解决了这个问题。我建议您切换到上面提到的常规
服务

这是我的密码。在
onStartCommand()
中调用此方法:


你读过这本指南吗?我猜“服务”应用程序不会像普通应用程序那样运行?你能在应用程序抽屉中看到它吗?但问题是,如果操作系统需要资源,操作系统总是可以终止服务,因此不可能只有你的应用程序终止服务。创建一个单独的“应用程序”仅仅是一个服务,这看起来非常愚蠢和不必要,因为你可以在一个正常的时间内启动和停止它app@tyczj我知道有无限的可能杀死一个进程。我想我希望我的应用程序能够告诉我进程是否正在运行并实时检索
startService(new Intent(this, Service.class));
stopService(new Intent(this, Service.class));
final int id = 1234;
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendIntent = PendingIntent.getActivity(this, 0, intent, 0);

//Build the notification
Notification.Builder builder = new Notification.Builder(getBaseContext());
builder.setContentIntent(pendIntent);
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setTicker("message");
builder.setWhen(System.currentTimeMillis());
builder.setAutoCancel(false);
builder.setContentTitle("Test Service");
builder.setContentText("message");

Notification notification = builder.build();

//start foreground service
startForeground(id, notification);