2017-08-06 92 views
0

当用户拒绝更新Google Play服务时,您如何正确关闭活动?我正在使用makeGooglePlayServicesAvailable(),因为它看起来很方便,但我还没有找到很多使用它的例子。处理取消makeGooglePlayServicesAvailable

我在onCreate()onResume()中使用checkGooglePlayServices()(代码如下)。

public class MainScreen extends Activity { 
    private static final String TAG = "MainScreen"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     checkGooglePlayServices(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     checkGooglePlayServices(); 
    } 

    void checkGooglePlayServices() 
    { 
     GoogleApiAvailability.getInstance() 
     .makeGooglePlayServicesAvailable(this) 
     .addOnSuccessListener(new OnSuccessListener<Void>() { 
      @Override 
      public void onSuccess(Void ignored) { 
        Log.d(TAG,"makeGooglePlayServicesAvailable().onSuccess()"); 

       // GPS available; do something useful 

      } 
     }).addOnFailureListener(this,new OnFailureListener() { 
      @Override 
      public void onFailure(@NonNull Exception e) { 

       Log.d(TAG,"makeGooglePlayServicesAvailable().onFailure()"); 
       e.printStackTrace(); 

       Toast.makeText(MainScreen.this, 
        "Google Play services upgrade required", 
        Toast.LENGTH_SHORT).show(); 

       // can't proceed without GPS; quit 

       MainScreen.this.finish(); // this causes a crash 
      } 
     }); 
    } 
} 

应用崩溃时finish()叫做:

com.example E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.example, PID: 5336 
    java.lang.RuntimeException: Unable to destroy activity {com.example/com.example.MainScreen}: java.lang.IllegalStateException: Task is already complete 
     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4438) 
     at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4456) 
     ... 
    Caused by: java.lang.IllegalStateException: Task is already complete 
     at com.google.android.gms.common.internal.zzbo.zza(Unknown Source:8) 
     at com.google.android.gms.tasks.zzn.zzDH(Unknown Source:8) 
     at com.google.android.gms.tasks.zzn.setException(Unknown Source:9) 
     at com.google.android.gms.tasks.TaskCompletionSource.setException(Unknown Source:2) 
     ... 

回答

1

我假设你按“后退”取消GPS更新请求。该错误是在拨打onDestroy()超级电话时发出的。这似乎表明,Android已经预料到不能进行并已经关闭了。 (这只是一个猜测。)

无论如何,我无法确定一个优雅的方式来关闭与失败侦听器回调的事情,但这是一个稍微不同的方法,仍然使用GoogleApiAvailability。我已经测试过了,它似乎工作。

替换您checkGooglePlayServices()下列要求:

private static final int GPS_REQUEST_CODE = 1; // arbitrary code 

void checkGooglePlayServices() { 
    GoogleApiAvailability api = GoogleApiAvailability.getInstance(); 
    int status = api.isGooglePlayServicesAvailable(this); 
    if (status != ConnectionResult.SUCCESS) { 
     if (api.isUserResolvableError(status)) { 
      // onActivityResult() will be called with GPS_REQUEST_CODE 
      Dialog dialog = api.getErrorDialog(this, status, GPS_REQUEST_CODE, 
        new DialogInterface.OnCancelListener() { 
         @Override 
         public void onCancel(DialogInterface dialog) { 
          // GPS update was cancelled. 
          // Do toast or dialog (probably better to do) here. 
          finish(); 
         } 
        }); 
      dialog.show(); 
     } else { 
      // unrecoverable error 
     } 
    } 
} 

此代码避免了回调,但仍允许您检查GPS的可用性。 Here是文档。

Here是一个示例应用程序中的相同方法。

如果您想继续使用代码,您可以执行以下hack操作,但是我更喜欢上述操作来捕获崩溃并隐藏用户的尴尬。

@Override 
public void onDestroy() { 
    try { 
     super.onDestroy(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } 
} 
+0

感谢这似乎是检查GPS的常用方法。如果有人有关于使用'makeGooglePlayServicesAvailable'的答案,我会留下更长的问题。你还想要检查什么?您链接的文档仅用于检查可用性。 – stardt

+0

如果它可以帮助某人,解决方案获取'E/WindowManager:android.view.WindowLeaked:Activity com.example.MainScreen泄漏了窗口...'是不会在'onCreate'中运行'checkGPS()',尽管[文档](https://firebase.google.com/docs/cloud-messaging/android/client)说:“建议在两个位置执行此操作:在主活动的onCreate()方法和onResume () 方法。” – stardt

+0

@stardt我更新了答案。对于需要检查的其他内容,我只是在考虑检查网络可用性,因为需要更新GPS。不过,我对'makeGooglePlayServicesAvailable'很好奇。它看起来像开始检查GPS的任务。这与我在答案中描述的有何不同? – Cheticamp