У меня есть Activity
, который запускается и привязывается к Service
. У меня то есть еще Activity
, запущенный с первого. При возвращении к первому Activity
из второго мне нужно вызвать метод Service
(сохраняет некоторые данные).
При просмотре каждого Activity
мои методы жизненного цикла Activity
, по-видимому, адекватно справляются с изменениями ориентации экрана, при условии, что я возвращаюсь к той же ориентации экрана перед выходом из Activity
.
Проблема возникает, когда я возвращаюсь к первому действию с другой ориентацией, чем когда я его оставил. Если это произойдет, я потеряю ссылку на свой Service
и, следовательно, столкнусь с NullPointerException
в onActivityResult()
. Поэтому, если я запущу свой второй Activity
в портретном режиме, переключусь на альбомный режим при просмотре второго Activity
и вернусь к первому Activity
в ландшафтном режиме, он вылетит.
Что я могу упустить? Я не хочу использовать файл манифеста, чтобы указать, что я буду обрабатывать изменения конфигурации - мне кажется, что это несколько уродливый хак, который не решает основную проблему. Если я опять что-то не упустил...
Вот выдержки из моих методов жизненного цикла из первого Activity:
@Override
protected void onStart()
{
super.onStart();
// start and bind to service
startService(smsIntent);
connection = new SMServiceConnection();
bindService(smsIntent, connection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onRestart()
{
super.onRestart();
}
@Override
protected void onResume()
{
super.onResume();
}
@Override
protected void onPause()
{
super.onPause();
sms.save(); // autosave
}
@Override
protected void onStop()
{
super.onStop();
unbindService(connection);
// stopService(smsIntent); //doesn't appear to have any effect
}
@Override
protected void onDestroy()
{
super.onDestroy();
}
РЕДАКТИРОВАТЬ: вот выдержки из моего класса SMServiceConnection, который является частным внутренним классом в моей деятельности, который расширяется из пользовательского класса ServiceConnection.
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
super.onServiceConnected(name, service);
msg("Service connected");
sms = getSMService();
if (sms != null)
{
String s = sms.getStuff(); //etc.; haven't listed every method invoked on sms
sms.saveSurvey();
}
} else
{
System.out.println("sms is null!");
}
}
@Override
public void onServiceDisconnected(ComponentName name)
{
super.onServiceDisconnected(name);
msg("Service disconnected");
}
Мой суперкласс ServiceConnection выглядит примерно так:
public class MyServiceConnection implements ServiceConnection
{
private boolean serviceAvailable = false;
private SMService sms;
public void onServiceConnected(ComponentName name, IBinder service)
{
serviceAvailable = true;
LocalBinder b = (LocalBinder) service;
sms = b.getService();
}
public void onServiceDisconnected(ComponentName name)
{
serviceAvailable = false;
}
public boolean isServiceAvailable()
{
return serviceAvailable;
}
public SMService getSMService()
{
return sms;
}
}