在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设备连接到手机,融合位置提供商返回“融合”位置时,可能会发生崩溃。在没有连接的电话的情况下使用位置提供程序时,不会出现崩溃。
从应用程序列表重新启动活动时,新创建的活动将经历create -> start -> resume阶段,然后直接进入stop without pause。
这会导致手表锁定,因此您不能再进入语音命令。不过,你仍然可以在主屏幕上滚动卡片。按下设备按钮打开和关闭屏幕“解锁”设备,logcat打印上述异常。
有时它需要两次或更多的应用程序重启才能导致崩溃,但它是可重现的。在nexus6上运行相同的应用程序不会造成任何问题。
下面的代码重现了这个问题:
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");
}
}在运行安卓5.0.1 (Build LWX48P)的索尼智能手表3上看到。
发布于 2015-02-11 05:25:57
不确定这是否是问题所在,但没有必要每次都在onStart中创建一个新的Google Api客户端。相反,它应该在onCreate中,然后在onStart中只有apiClient.connect();
https://stackoverflow.com/questions/28380890
复制相似问题