Предотвратите уничтожение службы 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;
}
}