我有Activity
启动并绑定到Service
。然后我从第一个启动了另一个Activity
。从第二个返回第一个Activity
后,我需要调用Service
的方法(保存一些数据)。
在查看每个Activity
时,我的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类的摘录,它是我的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;
}
}
答案 0 :(得分:4)
您的问题可能是在返回时再次绑定服务之前调用onActivityResult(),这在onstart中的bindcall之后稍微发生。
我会尝试以下两种方法之一:
尝试将数据保存为待处理信息:
if (sms == null) {
mPendingResultCode = resultCode;
mPedingResultData = new Bundle(intent.getExtras()); } else {
handleData(resultCode, intent.getExtras()); }
然后在onServiceConnected
电话中
例如handleData(mPedingResultCode, mPedingResultData)
mPendingResultData != null
并确保取消设置mPendingResultCode和mPendingResultData或 完成数据后的其他一些指标。
我不确定这一点,但也许会尝试通过在onActivityResult中执行类似的操作将数据处理添加到事件队列的后面:
final Bundle data = new Bundle(intent.getExtras);
new Handler().postRunnable(new Runnable() {
public void run() {
"do some stuff with data and resultcode (which should be final in the parameter list anyway)"
}
}
正如您所说,您不应该更改清单,以便在更改方向时不重新创建。这是一个丑陋的黑客,无法解决问题,我不喜欢什么时候建议。如果你这样做,你仍然会冒一些其他配置发生变化的风险,例如语言或者框架暂时销毁活动以节省资源。
只有在您希望获得更改的回调而不是重新创建商品时,才能使用清单中的configchanges。原因。懒惰不是一个。