У меня есть Activity
, который запускается и связывается с Service
.У меня потом еще один Activity
, запущенный с первого раза.После возврата к первому Activity
из второго мне нужно вызвать метод Service
(сохраняет некоторые данные).
При просмотре каждого Activity
мои Activity
методы жизненного цикла выглядят так:адекватно справляться с изменениями ориентации экрана, при условии, что я возвращаюсь к той же ориентации экрана перед выходом из Activity
.
Проблема возникает, когда я возвращаюсь к первому действию с ориентацией, отличной от той, которую я оставил.Если это произойдет, я потеряю свою ссылку на Service
и, следовательно, столкнусь с NullPointerException
в onActivityResult()
.Поэтому, если я запускаю свой второй 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, который являетсязакрытый внутренний класс в моей Activity, который расширяется от пользовательского класса 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;
}
}