Предотвратите уничтожение службы Android после развязывания

У меня есть сценарий, когда действие запускает сервис, вызывая метод startService: оба Activity и Service находятся в одном пакете. Затем служба, в соответствии с параметрами конфигурации, может запустить операцию (пусть ее называют ExternalActivity), содержащейся в другом пакете: эта операция связывает службу через bindService; как только это действие завершит свои задачи, оно вызывает метод unbindService следующим образом:

// method of ExternalActivity
@Override
public void onDestroy() {
    super.onDestroy();
    unbindService(...);
}

Как следствие, служба также уничтожается. Есть ли возможность избежать разрушения службы?

Ответы

Ответ 1

Как следствие, служба также уничтожается.

Как пояснил yorkw, служба уничтожается только тогда, когда выполняются оба следующих условия:

  • Все вызовы bindService() соответствуют соответствующим вызовам unbindService().

  • Если кто-то вызвал startService(), кто-то также вызвал stopService() или службу под названием stopSelf().

Есть ли возможность избежать разрушения службы?

Найдите лучшее время для вызова stopService() или stopSelf(), независимо от того, что вы используете.

Ответ 2

Как насчет этого?

public class MainActivity extends Activity {

private LocalService mBoundService;
private boolean mIsBound;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (LocalService.isRunning())
        doBindService(false);

    Button startService = (Button) findViewById(R.id.startService);
    startService.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            doBindService(true);
        }
    });
    Button stopService = (Button) findViewById(R.id.stopService);
    stopService.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            doUnbindService(true);
        }
    });
}

void doBindService(boolean start) {

    Intent i = new Intent(this, LocalService.class);
    if (start)
        startService(i);
    bindService(i, mConnection, Context.BIND_AUTO_CREATE);

    mIsBound = true;
}

void doUnbindService(boolean stop) {
    if (mIsBound) {
        // Detach our existing connection.
        unbindService(mConnection);
        if (stop)
            stopService(new Intent(this, LocalService.class));
        mIsBound = false;
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    doUnbindService(false);
}

private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {

        mBoundService = ((LocalService.LocalBinder) service).getService();

        // Tell the user about this for our demo.
        Toast.makeText(MainActivity.this, R.string.local_service_connected, Toast.LENGTH_SHORT).show();
    }

    public void onServiceDisconnected(ComponentName className) {

        mBoundService = null;
        Toast.makeText(MainActivity.this, R.string.local_service_disconnected, Toast.LENGTH_SHORT).show();
    }
};

}

LocalService.java из https://developer.android.com/reference/android/app/Service.html#LocalServiceSample

public class LocalService extends Service {

...
private static boolean isRunning=false;
...

@Override
public void onCreate() {
    mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    L.i("Service.onCreate() " );
    // Display a notification about us starting.  We put an icon in the status bar.
    showNotification();
    isRunning = true;

}

@Override
public void onDestroy() {
    // Cancel the persistent notification.
    mNM.cancel(NOTIFICATION);
    isRunning = false;
    // Tell the user we stopped.
    Toast.makeText(this, R.string.local_service_stopped, Toast.LENGTH_SHORT).show();
}
...

public static boolean isRunning()
{
    return isRunning;
}
}