更改为横向模式android时出现意外错误

时间:2012-07-02 08:27:42

标签: android android-service

当我将活动更改为横向模式时,我遇到了一些意外的服务泄露错误。该应用程序运行正常,错误只显示在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中这样做,我还需要在其他地方做这个吗?

2 个答案:

答案 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()方法中