2017-08-06 133 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