应用程序关闭时重新启动服务 - START_STICKY

时间:2015-08-01 08:32:01

标签: android service

我有一个作为Web服务器运行的应用程序。该应用程序有一个START_STICKY服务我希望此服务始终运行Web服务器(在通知中向用户提供选项以停止它)。

当我滑动我的应用程序关闭时,问题是服务器重新启动(丢失设置等)。它保持不错,但logcat显示它正在重新启动。

我可以重新打开我的应用并绑定到新服务,这很好用。虽然再次滑动关闭具有相同的效果。

我需要这个不要重启。

标准服务代码

private WebServerService mService;
private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className,
                                   IBinder binder) {
        WebServerService.MyBinder b = (WebServerService.MyBinder) binder;
        mService = b.getService();
    }

    public void onServiceDisconnected(ComponentName className) {
        mService = null;
    }
};

public serviceStart() {
    mIntent = new Intent(mContext.getApplicationContext(), WebServerService.class);
    mContext.startService(mIntent);
    mContext.bindService(mIntent, mConnection, Context.BIND_AUTO_CREATE);
}

启动时服务

 @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, START_STICKY, startId);
    Log.d("SERVICE","Started");
    return START_STICKY;
}

4 个答案:

答案 0 :(得分:9)

简短回答:你不能。当系统声明内存或用户从最近的应用列表中清除应用时,每个Android应用都可能被系统或用户杀死。这是Android设计,所有应用都必须遵守它。您可以将唯一(小)改进设置为Foreground service

  

系统认为它是用户积极意识到的东西,因此在内存不足时不会被杀死。 (从理论上讲,服务在当前前台应用程序的极端内存压力下被杀死仍然是可能的,但实际上这不应该是一个问题。)

答案 1 :(得分:2)

使用startForeground()

缺点是您必须提供通知。

答案 2 :(得分:1)

像Mimmo说的那样:你不能。如果内存不足,系统确实可以杀死应用程序/服务。用户也可以这样做。使用应用程序设置中的强制关闭按钮或滑动应用程序。滑动关闭就像强制停止一样。关闭这样的应用程序时,应用程序/服务不会重新启动。这就是系统的工作原理。自己尝试一下,下载高级任务杀手并杀死Facebook。如果几秒钟后重新启动任务杀手,您将看到Facebook再次运行。现在打开Facebook并使用滑动功能来杀死它。现在再次启动任务杀手。您将看到Facebook不再运行。同样,这就是系统的工作方式。 将服务设置为Foreground服务也无济于事。

答案 3 :(得分:0)

你的清单上的标签android:process =“anyname”会有用吗?它使服务在您的应用程序的不同进程上运行。

http://developer.android.com/guide/topics/manifest/service-element.html#proc

根据其他人的指定,如果内存不足,系统仍然可以终止它,但是关闭你的应用程序不会终止它。希望它有所帮助。