在自定义对象中创建粘性服务时不重新启动

时间:2016-09-06 08:28:35

标签: android android-activity android-service

我有一个具有绑定服务的Singleton对象。我希望它重新启动,当我从启动器启动我的应用程序时,singleton对象将初始化并绑定到此现有服务实例。

以下是在singleton中创建和绑定服务的代码:

public class MyState {

    private static MyState sState;

    private MyService mService;
    private Context mContext;
    private boolean mBound = false;


    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            MyService.MyBinder binder = (MyService.MyBinder) service;
            mService = binder.getService();
            mBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mBound = false;
        }
    };

    public static MyState get(Context context) {
        if (sState == null) {
            sState = new MyState(context);
        }
        return sState;
    }

    public MyState(Context context) {
        mContext = context.getApplicationContext();
        startService();
    }

    private void startService() {
        Intent intent = new Intent(mContext, MyService.class);
        mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
        // this won't create another instance of service, but will call onStartCommand
        mContext.startService(intent);
    }
}

这是代码insice服务

public class MyService extends Service {

    private final IBinder mBinder = new MyBinder();

    public class MyBinder extends Binder {
        MyService getService() {
            return MyService.this;
        }
    }

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

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    // this method is called by singleton object to stop service manually by user                                                                                                              
    public void stop() {
        stopSelf();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // some cleanup code here                                                                                                                                                              
    }
}

不幸的是,当我在任务列表中滑动我的应用程序时,此服务永远不会重新启动。在这种情况下,永远不会调用Service的onDestroy方法。

我将绑定移动到用户可以与服务进行交互的活动,并且令人惊讶的是它开始按照我的预期工作。 我试图在我的活动中使用应用程序上下文来调用服务创建,它仍然有效。

从活动启动服务是否与从常规java对象启动服务不同?

1 个答案:

答案 0 :(得分:2)

当您返回START_STICKY时,只要您关闭/终止应用程序,此服务就会停止,因为在应用程序关闭后,所有Intent以及变量的所有Reference / Value都将变为null,因此{ {1}}服务无法获取Intent值。如果你想在应用程序杀死后使用STICKY

重启服务
return START_REDELIVER_INTENT

这将在app杀死后5-10秒内重启服务。