2015-02-07 49 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 2015-02-11 21:50:14

相關問題