当我将活动更改为横向模式时,我遇到了一些意外的服务泄露错误。该应用程序运行正常,错误只显示在logcat中。
logcat错误是:
E / ActivityThread(16640):活动com.amazon.hsyal.ui.VoltageSODLoggerActivity已泄露最初绑定的ServiceConnection com.amazon.hsyal.ui.VoltageSODLoggerActivity$1@41461908
E / ActivityThread(16640):android.app.ServiceConnectionLeaked:Activity com.amazon.hsyal.ui.VoltageSODLoggerActivity泄露了最初绑定的ServiceConnection com.amazon.hsyal.ui.VoltageSODLoggerActivity$1@41461908
E / ActivityThread(16640):在android.app.LoadedApk $ ServiceDispatcher。(LoadedApk.java:999)
E / ActivityThread(16640):在android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:893)
E / ActivityThread(16640):在android.app.ContextImpl.bindService(ContextImpl.java:1139)
E / ActivityThread(16640):在android.content.ContextWrapper.bindService(ContextWrapper.java:386)
E / ActivityThread(16640):at com.amazon.hsyal.ui.VoltageSODLoggerActivity $ 2.onClick(VoltageSODLoggerActivity.java:96)
E / ActivityThread(16640):在android.view.View.performClick(View.java:3538)E / ActivityThread(16640):在android.view.View $ PerformClick.run(View.java:14132)
E / ActivityThread(16640):在android.os.Handler.handleCallback(Handler.java:605)
E / ActivityThread(16640):在android.os.Handler.dispatchMessage(Handler.java:92)
E / ActivityThread(16640):在android.os.Looper.loop(Looper.java:137)
E / ActivityThread(16640):在android.app.ActivityThread.main(ActivityThread.java:4492)
E / ActivityThread(16640):at java.lang.reflect.Method.invokeNative(Native Method)
E / ActivityThread(16640):at java.lang.reflect.Method.invoke(Method.java:511)
E / ActivityThread(16640):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
E / ActivityThread(16640):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E / ActivityThread(16640):at dalvik.system.NativeStart.main(Native Method)
对应的onCreate代码是:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
PowerManager mgr= (PowerManager) this.getSystemService(Context.POWER_SERVICE);
wk = mgr.newWakeLock(PowerManager.FULL_WAKE_LOCK, "MyWakeLock");
wk.acquire();
intent = new Intent(getBaseContext(), LoggerService.class);
Button start_stop_button = (Button) findViewById(R.id.start_stop_button);
start_stop_button.setOnClickListener(startStopButtonListener);
if(getServiceInfo(this)){
start_stop_button.setText("Stop Service");
}else
{ start_stop_button.setText("Start Service");
}
}
我认为在创建服务连接实例的地方肯定存在一些问题。现在我在onCreate中这样做,我还需要在其他地方做这个吗?
答案 0 :(得分:1)
在您的代码中,我看不到您的服务连接实例,只有Intent
(这不是您服务的连接,如您所知)...
您可能希望在onStart()
中绑定您的服务,并使用您活动的onStop()
方法取消绑定服务。另外,如果您不需要WakeLock
一直出现,我建议您在Service
课程中移动Activity
...
有关Service
类以及如何从Service
绑定/取消绑定(而不是使用startService()
和stopService()
)<<}的更多详细信息,请参阅http://developer.android.com/reference/android/app/Service.html / p>
答案 1 :(得分:1)
当方向改变时,将重新创建活动,即调用onDestroy()并再次调用onCreate。
您可能忘记在onDestroy()方法中释放唤醒锁定。将唤醒锁定为成员变量并调用
wk.release();
在你的onDestroy()方法中。