重新启动活动时,Android Wear 上的融合位置提供程序会导致崩溃

Posted

技术标签:

【中文标题】重新启动活动时,Android Wear 上的融合位置提供程序会导致崩溃【英文标题】:Fused location provider on Android Wear causes crash when restarting activity 【发布时间】:2015-04-07 11:42:27 【问题描述】:

我在使用融合位置提供程序的 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 设备连接到手机并且融合位置提供程序返回“融合”位置时,可能会发生崩溃。在未连接手机的情况下使用位置提供程序时,不会出现崩溃。

当从应用列表重新启动 Activity 时,新创建的 Activity 会经历创建 -> 启动 -> 恢复阶段,然后直接进入停止而不暂停。

这会导致手表锁定,因此您无法再使用语音命令。不过,您仍然可以在主屏幕上滚动浏览卡片。按下设备按钮打开和关闭屏幕会“解锁”设备,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");


在运行 Android 5.0.1(Build LWX48P)的 Sony Smartwatch 3 上看到。

【问题讨论】:

【参考方案1】:

不确定这是否是问题所在,但无需每次都在 onStart 中创建新的 Google Api 客户端。相反,它应该在 onCreate 中,然后在 onStart 中只有 apiClient.connect();

【讨论】:

自从我关闭活动后,当我重新启动应用程序时,它会从头开始重新创建。因此,无论调用是在 onCreate 还是 onStart 中,我认为都不会产生影响。

以上是关于重新启动活动时,Android Wear 上的融合位置提供程序会导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Android:当应用程序被销毁和重新创建时总是启动启动活动

从通知意图启动活动时重新创建 Android ViewModel

如何修复在 Android 中崩溃的活动的重新启动?

在启动某些活动之前,小部件无法在 Android 11 上的设备启动时启动服务

当活动从后台(暂停)到前台时重新创建 Android 活动

设备重新启动后,地理围栏是不是在 android 中保持活动状态