0

アクティビティをランドスケープ モードに変更すると、予期しないサービス リーク エラーが発生します。アプリは正常に動作していますが、エラーは logcat にのみ表示されます。

logcat エラーは次のとおりです。

E/ActivityThread(16640): アクティビティ com.amazon.hsyal.ui.VoltageSODLoggerActivity が、元々ここにバインドされていた ServiceConnection com.amazon.hsyal.ui.VoltageSODLoggerActivity$1@41461908 をリークしました

E/ActivityThread(16640): android.app.ServiceConnectionLeaked: アクティビティ 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): 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): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) で

E/ActivityThread(16640): java.lang.reflect.Method.invoke(Method.java:511) で

E/ActivityThread(16640): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) で

E/ActivityThread (16640): com.android.internal.os.ZygoteInit.main (ZygoteInit.java:551) で

E/ActivityThread(16640): dalvik.system.NativeStart.main(ネイティブ メソッド) で

対応する 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でそれを行っていますが、他の場所でもこれを行う必要がありますか?

4

2 に答える 2

1

向きが変わると、アクティビティが再作成されます。つまり、onDestroy()が呼び出され、onCreateが再度呼び出されます。

onDestroy()メソッドでウェイクロックを解除するのを忘れている可能性があります。ウェイクロックをメンバー変数にして、呼び出します

wk.release();

onDestroy()メソッドで。

于 2012-07-02T09:00:42.903 に答える
1

あなたのコードでは、サービス接続のインスタンスは表示されず、Intent(ご存知かもしれませんが、これはサービスへの接続ではありません)...

でサービスをバインドし、アクティビティのメソッドでonStart()サービスをアンバインドすることをお勧めします。onStop()また、ずっと現れる必要がない場合は、クラスにWakeLock移動することをお勧めします...ServiceActivity

クラスの詳細と、 ( と を使用する代わりに)からバインド/バインド解除する方法については、 http://developer.android.com/reference/android/app/Service.htmlを参照してください。ServiceServicestartService()stopService()

于 2012-07-02T08:54:01.437 に答える