我有一个
在查看每个
问题发生在我以不同于离开时的方向返回第一个
我可能错过了什么?我不想使用清单文件指示我将处理配置更改 - 这让我觉得有点丑陋的黑客,不能解决主要问题。除非我又错过了什么...
以下是我第一个
Activity
启动并绑定到一个Service
。然后我有另一个Activity
,从第一个Activity
启动。从第二个Activity
返回到第一个Activity
时,我需要调用Service
的一个方法(保存一些数据)。在查看每个
Activity
时,我的Activity
生命周期方法似乎能够很好地处理屏幕方向的更改,只要我在退出Activity
之前返回相同的屏幕方向。问题发生在我以不同于离开时的方向返回第一个
Activity
时。如果发生这种情况,我将失去对我的Service
的引用,因此在onActivityResult()
中遇到NullPointerException
。所以如果我在纵向模式下启动我的第二个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类的摘录,它是我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;
}
}