为啥我在 Android 中杀死我的应用程序时服务会重新启动?

Posted

技术标签:

【中文标题】为啥我在 Android 中杀死我的应用程序时服务会重新启动?【英文标题】:Why does service restart when i kill my app in Android?为什么我在 Android 中杀死我的应用程序时服务会重新启动? 【发布时间】:2015-09-07 11:01:17 【问题描述】:

尝试使用 android 中的服务保持 xmpp 连接处于活动状态

public class XMPPService extends Service 

XMPPTCPConnection connection;
String USERNAME;
String PASSWORD;

public XMPPService() 


@Override
public int onStartCommand(Intent intent, int flags, int startId) 
    onHandleIntent();
    return START_STICKY;


private void onHandleIntent() 
    connection = XMPPClient.getConnection();
    connection.addConnectionListener(
            new AbstractConnectionListener() 
                public void connectionClosed() 
                    Log.i("connection", "closed");

                

                public void connectionClosedOnError(Exception e) 
                    Log.i("connection", "closed on error");

                

                public void reconnectionFailed(Exception e) 
                    Log.i("reconnection", "failed");

                

                public void reconnectionSuccessful() 
                    if (connection.isAuthenticated()) 
                        Log.i("isauthenticauted : ", String.valueOf(connection.isAuthenticated()));
                        Log.i("reconnection", "succesful");
                     else 
                        try 
                            connection.login(USERNAME, PASSWORD);
                         catch (XMPPException e) 
                            e.printStackTrace();
                         catch (SmackException e) 
                            e.printStackTrace();
                         catch (IOException e) 
                            e.printStackTrace();
                        
                        Log.i("reconnection", "succesful");
                    
                

                public void reconnectingIn(int seconds) 
                    Log.i("reconnectingIn", String.valueOf(seconds));
                

            
    );




@Override
public void onCreate() 
    Log.i("service", "created");



@Override
public IBinder onBind(Intent intent) 
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");

当我杀死我的应用程序时,我的服务会重新启动。为什么会这样?当我重新启动时,它给我一个异常 NetworkOnMainThreadException at connection = XMPPClient.getConnection(); 当我杀死我的应用程序时,我不希望我的服务重新启动。

【问题讨论】:

【参考方案1】:

START_STICKY 标志会导致您的服务在销毁时自动重启。您的 onstartCommand 应该返回 START_NOT_STICKY 而不是 START_STICKY。

@Override
public int onStartCommand(Intent intent, int flags, int startId) 
    onHandleIntent();
    return START_NOT_STICKY;

【讨论】:

我读到的另一件事是 onHandleIntent 是在一个单独的线程上调用的,而不是 ui 线程。怎么做呢?我想我的 onhandleintent 在这里的 ui 线程上被调用。我需要重写 onHandleIntent 方法吗? 我按照你说的做了一切,但是在我杀死我的应用程序后,服务现在根本没有运行 手动杀死您的应用程序总是会杀死您的服务(当您使用 START_STICKY 时也是如此,但是此标志会在服务被杀死时立即重新启动)。如果您不希望您的服务停止,请不要手动终止您的应用,而是使用后退按钮关闭您的应用。 在您的解决方案之后,我的活动甚至不再重新启动 那么您的代码中可能还有其他问题。 START_NOT_STICKY 只会阻止您的 Service 重启,对您的 Activity 没有影响【参考方案2】:

在服务的 onStartCommand(Intent, int, int) 函数中使用 START_NOT_STICKY。

示例: public static final int START_NOT_STICKY http://developer.android.com/reference/android/app/Service.html

【讨论】:

我可以再详细一点吗? public static final int START_NOT_STICKY 之后呢? 你不能在 onDestroy() 中使用 public 和 static 修饰符 START_NOT_STICKY:从onStartCommand(Intent, int, int)返回的常量:如果该服务的进程在启动时被杀死(从onStartCommand(Intent, int, int)返回后),并且没有新的启动意图传递给它,然后将服务从启动状态中取出,并且在将来显式调用 Context.startService(Intent) 之前不要重新创建。

以上是关于为啥我在 Android 中杀死我的应用程序时服务会重新启动?的主要内容,如果未能解决你的问题,请参考以下文章

每当应用程序被杀死时服务停止

Android:当应用程序被杀死时保持服务运行

如何模拟Android系统杀死的服务

为啥即使我在后台请求位置更新,我的 iOS 应用程序也会被杀死?

为啥我的客户端会杀死我的服务器?

如果Android经常杀死应用程序,为啥要使用phonegap相机