Auf Android habe ich eine Activity
namens FirstActivity
, die eine Service
namens MyService
startet, um Netzwerk-Sachen im Hintergrund zu tun. Die Activity
und die Service
kommunizieren ständig miteinander durch Aufruf von Methoden.Aktivität mit lang anhaltenden Service im Hintergrund, die nicht getötet wird
Jetzt, wenn der Benutzer FirstActivity
-SecondActivity
navigiert, sollte der Hintergrunddienst nicht getötet oder neu erstellt werden, aber am Leben gehalten und zu SecondActivity
geführt, die nun die mit dem Dienst zu kommunizieren ist.
Mit anderen Worten wird die Service
so lange laufen, wie einer der beiden Activity
s läuft, und es sollte nicht aufhören, während der Benutzer zwischen den beiden Activity
s navigiert.
Eines der Activity
s wird immer im Vordergrund stehen und während dieser Zeit sollte der Dienst (optimal) niemals abgetötet werden. Ich denke, das sollte kein Problem sein, denn einer der beiden Activity
s ist immer aktiv und somit weiß Android, dass der Dienst wichtig ist und nicht etwas, das getötet werden muss.
(Wenn es keine Möglichkeit gab, Android zu verhindern, dass das Töten und neu zu erstellen, den Service von Zeit zu Zeit, ich würde einen Weg brauchen den vollen Zustand des Dienstes ordnungsgemäß wiederherzustellen.)
Zusammengefasst sollte die Service
die gleiche Lebensdauer wie die beiden Activity
s "kombiniert" haben. Es sollte mit dem ersten von ihnen beginnen und nicht aufhören, bevor beide zerstört wurden.
Also ist der folgende Code richtig für diese Einrichtung und Ziele?
public class MyService extends Service {
public class LocalBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
...
}
public class FirstActivity extends Activity {
private MyService mMyService;
private ServiceConnection mMainServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
MyService mainService = ((LocalBinder) service).getService();
mMyService = mainService;
mMyService.setCallback(FirstActivity.this);
}
@Override
public void onServiceDisconnected(ComponentName className) {
mMyService = null;
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
...
startService(new Intent(FirstActivity.this, MyService.class));
}
@Override
protected void onResume() {
super.onResume();
bindService(new Intent(FirstActivity.this, MyService.class), mMainServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onPause() {
super.onPause();
if (mMainServiceConnection != null) {
unbindService(mMainServiceConnection);
}
if (mMyService != null) {
mMyService.setCallback(null);
}
if (!isUserMovingToSecondActivity) {
stopService(new Intent(FirstActivity.this, MyService.class));
}
}
@Override
public void onBackPressed() {
stopService(new Intent(FirstActivity.this, MyService.class));
super.onBackPressed();
}
...
}
public class SecondActivity extends Activity {
private MyService mMyService;
private ServiceConnection mMainServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
MyService mainService = ((LocalBinder) service).getService();
mMyService = mainService;
mMyService.setCallback(SecondActivity.this);
}
@Override
public void onServiceDisconnected(ComponentName className) {
mMyService = null;
}
};
@Override
protected void onResume() {
super.onResume();
bindService(new Intent(SecondActivity.this, MyService.class), mMainServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onPause() {
super.onPause();
if (mMainServiceConnection != null) {
unbindService(mMainServiceConnection);
}
}
@Override
protected void onDestroy() {
...
stopService(new Intent(SecondActivity.this, MyService.class));
}
...
}
Ist dies der beste Weg, um einen lang anhaltenden Dienst im Hintergrund des Activity
s zu gewährleisten, die getötet oder neu erstellt werden nicht?
Was ist mit Context.BIND_AUTO_CREATE
? Ist es richtig, diese Flagge hier zu setzen? Was ist mit Context.BIND_ADJUST_WITH_ACTIVITY
und Context.BIND_WAIVE_PRIORITY
- brauche ich diese?
Haben Sie diesen Code ausprobiert oder fragen Sie vor dem Versuch? Wenn Sie es versucht haben, haben Sie irgendwelche Fehler bekommen? Hat es sich nicht so verhalten, wie du es erwartet hast? Wir werden eine viel produktivere Diskussion und eine nützlichere Antwort für die Gemeinschaft und für dich selbst haben, wenn du es tatsächlich ausprobierst und dann nach der Lösung eines konkreten Problems fragst – DallaRosa
@DallaRosa Ja, natürlich habe ich das versucht.Dies ist eine allgemeine Frage, wie eine Serviceklasse und die entsprechenden 'Activity'-Klassen entworfen werden, damit der Service so lange wie möglich dauert und nicht getötet wird. Benutzer haben gemeldet, dass die von diesem Dienst bereitgestellten Funktionen nicht mehr in einer der "Activity" -Klassen verfügbar sind. Und ich (a) finde es schwierig zu debuggen, wenn das System diesen Service killt und (b) würde gerne etwas über Best Practices oder Verbesserungen erfahren, die auf diesen Service für die genau definierten Ziele und Anforderungen angewendet werden sollten. – caw
Ich kann viele Probleme in Ihrer Verwaltung des 'Service' sehen. Sie müssen es nur stoppen, wenn die erste 'Aktivität' zerstört ist, oder von der Bindung abhängen und diese richtig verwalten. Es gibt einige allgemeine Anweisungen dazu in den Android-Startbüchern: https://books.google.com.pk/books?id=mRGrCQbqHkoC&pg=PA399 – corsair992