융합 위치 제공자를 사용하는 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 빌드) :
다음 코드는 문제를 재현합니다.
내가 활동을 닫으면 앱을 다시 시작할 때 처음부터 다시 만들어집니다. 따라서 호출이 onCreate 또는 onStart에 있는지 여부는 차이를 만들지 않습니다. – Moritz