2015-02-07 3 views
1

융합 위치 제공자를 사용하는 Android Wear에서 활동을 시작, 종료 및 다시 시작할 때 충돌이 발생합니다.Android Wear의 융합 위치 제공자가 작업 재시작시 충돌을 일으킴

시나리오는 다음과 같습니다

01-31 18:51:15.319 2281-2281/com.example.test E/ActivityThread﹕ Performing pause of activity that is not resumed: {com.example.test/com.example.test.WearActivity} 
java.lang.RuntimeException: Performing pause of activity that is not resumed: {com.example.test/com.example.test.WearActivity} 
     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3196) 
     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3184) 
     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3159) 
     at android.app.ActivityThread.access$1000(ActivityThread.java:144) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5221) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
: (융합 위치 제공자로부터 분리하면서) 활동을 마감, 융합 위치 제공자에 연결하는 작업을 시작 및 응용 프로그램을 다시 시작하면 다음과 같은 예외와 충돌 할 수있는 새로 도입 된 활동의 원인

Android Wear 기기가 휴대 전화에 연결되어 있고 융합 위치 제공자가 '융합'위치를 반환하면 충돌이 발생할 수 있습니다. 연결된 전화없이 위치 제공 업체를 사용할 때 충돌이 나타나지 않습니다.

앱 목록에서 활동을 다시 시작하면 새로 작성된 활동이 작성 -> 시작 -> 다시 시작 단계를 거치며 일시 중지없이 직접 중지 단계로 진행됩니다.

이 때문에 시계가 잠기고 더 이상 음성 명령을 사용할 수 없습니다. 그래도 홈 화면에서 카드를 스크롤 할 수 있습니다. 장치 버튼을 누르면 화면을 켜고 끄고 장치의 "잠금을 해제"하고 logcat은 언급 된 예외를 인쇄합니다.

가끔 충돌이 발생하기 위해 앱을 다시 시작해야하지만 재현성이 있어야합니다. Nexus 6에서 동일한 앱을 실행해도 아무런 문제가 발생하지 않습니다.

public class WearActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener { 

private GoogleApiClient apiClient; 
private LocationListener locationListener; 

@Override 
protected void onStart() { 
    super.onStart(); 
    Log.v("Wear", "onStart"); 
    apiClient = new GoogleApiClient.Builder(this) 
      .addApi(LocationServices.API) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .build(); 
    apiClient.connect(); 

} 

@Override 
protected void onStop() { 
    super.onStop(); 
    Log.v("Wear", "onStop"); 
    if (locationListener != null) { 
     FusedLocationApi.removeLocationUpdates(apiClient, locationListener); 
     System.out.println("removing"); 
     locationListener = null; 
    } 
    if (apiClient.isConnected()) { 
     apiClient.disconnect(); 
    } 
} 

@Override 
public void onConnected(Bundle bundle) { 
    System.out.println("connection established"); 
    if (locationListener == null) { 
     locationListener = new LocationListener() { 
      @Override 
      public void onLocationChanged(Location location) { 
       System.out.println(location); 
      } 
     }; 
     FusedLocationApi.requestLocationUpdates(apiClient, createLocationRequest(), locationListener); 
    } 
} 

private LocationRequest createLocationRequest() { 
    return new LocationRequest() 
      .setInterval(2000) 
      .setFastestInterval(2000) 
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
} 

@Override 
public void onConnectionSuspended(int i) { 
    System.out.println("connection suspended"); 
} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 
    System.out.println("connection failed"); 
} 
} 

소니 Smartwatch를 3에서 볼 실행하는 Android 5.0.1 (LWX48P 빌드) :

다음 코드는 문제를 재현합니다.

답변

0

문제가 있는지는 확실하지 않지만 매번 onStart에 새 Google Api 클라이언트를 만들 필요는 없습니다. 대신 onCreate에 있어야하고 onStart에 apiClient.connect()가 있어야합니다.

+0

내가 활동을 닫으면 앱을 다시 시작할 때 처음부터 다시 만들어집니다. 따라서 호출이 onCreate 또는 onStart에 있는지 여부는 차이를 만들지 않습니다. – Moritz

관련 문제