Continues removing the assumption that there is a foreground activity (#309)

diff --git a/packages/battery/android/src/main/java/io/flutter/plugins/battery/BatteryPlugin.java b/packages/battery/android/src/main/java/io/flutter/plugins/battery/BatteryPlugin.java
index 5a83e52..b6d3e79 100644
--- a/packages/battery/android/src/main/java/io/flutter/plugins/battery/BatteryPlugin.java
+++ b/packages/battery/android/src/main/java/io/flutter/plugins/battery/BatteryPlugin.java
@@ -30,16 +30,16 @@
         new MethodChannel(registrar.messenger(), "plugins.flutter.io/battery");
     final EventChannel eventChannel =
         new EventChannel(registrar.messenger(), "plugins.flutter.io/charging");
-    final BatteryPlugin instance = new BatteryPlugin(registrar.context());
+    final BatteryPlugin instance = new BatteryPlugin(registrar);
     eventChannel.setStreamHandler(instance);
     methodChannel.setMethodCallHandler(instance);
   }
 
-  BatteryPlugin(Context context) {
-    this.context = context;
+  BatteryPlugin(PluginRegistry.Registrar registrar) {
+    this.registrar = registrar;
   }
 
-  private final Context context;
+  private final PluginRegistry.Registrar registrar;
   private BroadcastReceiver chargingStateChangeReceiver;
 
   @Override
@@ -60,18 +60,21 @@
   @Override
   public void onListen(Object arguments, EventSink events) {
     chargingStateChangeReceiver = createChargingStateChangeReceiver(events);
-    context.registerReceiver(
-        chargingStateChangeReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+    registrar
+        .context()
+        .registerReceiver(
+            chargingStateChangeReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
   }
 
   @Override
   public void onCancel(Object arguments) {
-    context.unregisterReceiver(chargingStateChangeReceiver);
+    registrar.context().unregisterReceiver(chargingStateChangeReceiver);
     chargingStateChangeReceiver = null;
   }
 
   private int getBatteryLevel() {
     int batteryLevel = -1;
+    Context context = registrar.context();
     if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
       BatteryManager batteryManager =
           (BatteryManager) context.getSystemService(context.BATTERY_SERVICE);
diff --git a/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityPlugin.java b/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityPlugin.java
index f4b3663..dbfbddf 100644
--- a/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityPlugin.java
+++ b/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityPlugin.java
@@ -21,7 +21,7 @@
 
 /** ConnectivityPlugin */
 public class ConnectivityPlugin implements MethodCallHandler, StreamHandler {
-  private final Context context;
+  private final Registrar registrar;
   private final ConnectivityManager manager;
   private BroadcastReceiver receiver;
 
@@ -31,25 +31,28 @@
         new MethodChannel(registrar.messenger(), "plugins.flutter.io/connectivity");
     final EventChannel eventChannel =
         new EventChannel(registrar.messenger(), "plugins.flutter.io/connectivity_status");
-    ConnectivityPlugin instance = new ConnectivityPlugin(registrar.context());
+    ConnectivityPlugin instance = new ConnectivityPlugin(registrar);
     channel.setMethodCallHandler(instance);
     eventChannel.setStreamHandler(instance);
   }
 
-  private ConnectivityPlugin(Context context) {
-    this.context = context;
-    this.manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+  private ConnectivityPlugin(Registrar registrar) {
+    this.registrar = registrar;
+    this.manager =
+        (ConnectivityManager) registrar.context().getSystemService(Context.CONNECTIVITY_SERVICE);
   }
 
   @Override
   public void onListen(Object arguments, EventSink events) {
     receiver = createReceiver(events);
-    context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
+    registrar
+        .context()
+        .registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
   }
 
   @Override
   public void onCancel(Object arguments) {
-    context.unregisterReceiver(receiver);
+    registrar.context().unregisterReceiver(receiver);
     receiver = null;
   }
 
diff --git a/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/FirebaseAdMobPlugin.java b/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/FirebaseAdMobPlugin.java
index 18816c3..6d787c3 100644
--- a/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/FirebaseAdMobPlugin.java
+++ b/packages/firebase_admob/android/src/main/java/io/flutter/plugins/firebaseadmob/FirebaseAdMobPlugin.java
@@ -19,7 +19,7 @@
 public class FirebaseAdMobPlugin implements MethodCallHandler {
   private static final String TAG = "flutter";
 
-  private final Activity activity;
+  private final Registrar registrar;
   private final MethodChannel channel;
 
   private LinearLayout banner;
@@ -28,13 +28,13 @@
   public static void registerWith(Registrar registrar) {
     final MethodChannel channel =
         new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_admob");
-    channel.setMethodCallHandler(new FirebaseAdMobPlugin(registrar.activity(), channel));
+    channel.setMethodCallHandler(new FirebaseAdMobPlugin(registrar, channel));
   }
 
-  private FirebaseAdMobPlugin(Activity activity, MethodChannel channel) {
-    this.activity = activity;
+  private FirebaseAdMobPlugin(Registrar registrar, MethodChannel channel) {
+    this.registrar = registrar;
     this.channel = channel;
-    FirebaseApp.initializeApp(activity);
+    FirebaseApp.initializeApp(registrar.context());
   }
 
   private void callInitialize(MethodCall call, Result result) {
@@ -43,7 +43,7 @@
       result.error("no_app_id", "a non-empty AdMob appId was not provided", null);
       return;
     }
-    MobileAds.initialize(activity, appId);
+    MobileAds.initialize(registrar.context(), appId);
     result.success(Boolean.TRUE);
   }
 
@@ -93,6 +93,12 @@
       return;
     }
 
+    Activity activity = registrar.activity();
+    if (activity == null) {
+      result.error("no_activity", "firebase_admob plugin requires a foreground activity", null);
+      return;
+    }
+
     Integer id = call.argument("id");
     if (id == null) {
       result.error(
diff --git a/packages/firebase_analytics/android/src/main/java/io/flutter/firebaseanalytics/FirebaseAnalyticsPlugin.java b/packages/firebase_analytics/android/src/main/java/io/flutter/firebaseanalytics/FirebaseAnalyticsPlugin.java
index 7123ab4..ea146e3 100755
--- a/packages/firebase_analytics/android/src/main/java/io/flutter/firebaseanalytics/FirebaseAnalyticsPlugin.java
+++ b/packages/firebase_analytics/android/src/main/java/io/flutter/firebaseanalytics/FirebaseAnalyticsPlugin.java
@@ -17,18 +17,18 @@
 
 /** Flutter plugin for Firebase Analytics. */
 public class FirebaseAnalyticsPlugin implements MethodCallHandler {
-  private final Activity activity;
+  private final PluginRegistry.Registrar registrar;
   private final FirebaseAnalytics firebaseAnalytics;
 
   public static void registerWith(PluginRegistry.Registrar registrar) {
     final MethodChannel channel = new MethodChannel(registrar.messenger(), "firebase_analytics");
-    channel.setMethodCallHandler(new FirebaseAnalyticsPlugin(registrar.activity()));
+    channel.setMethodCallHandler(new FirebaseAnalyticsPlugin(registrar));
   }
 
-  private FirebaseAnalyticsPlugin(Activity activity) {
-    this.activity = activity;
-    FirebaseApp.initializeApp(activity);
-    this.firebaseAnalytics = FirebaseAnalytics.getInstance(activity);
+  private FirebaseAnalyticsPlugin(PluginRegistry.Registrar registrar) {
+    this.registrar = registrar;
+    FirebaseApp.initializeApp(registrar.context());
+    this.firebaseAnalytics = FirebaseAnalytics.getInstance(registrar.context());
   }
 
   @Override
@@ -81,6 +81,11 @@
 
   private void handleSetCurrentScreen(MethodCall call, Result result) {
     @SuppressWarnings("unchecked")
+    Activity activity = registrar.activity();
+    if (activity == null) {
+      result.error("no_activity", "handleSetCurrentScreen requires a foreground activity", null);
+      return;
+    }
     Map<String, Object> arguments = (Map<String, Object>) call.arguments;
     final String screenName = (String) arguments.get("screenName");
     final String screenClassOverride = (String) arguments.get("screenClassOverride");
diff --git a/packages/firebase_auth/android/src/main/java/io/flutter/firebaseauth/FirebaseAuthPlugin.java b/packages/firebase_auth/android/src/main/java/io/flutter/firebaseauth/FirebaseAuthPlugin.java
index f86e868..9b073d9 100755
--- a/packages/firebase_auth/android/src/main/java/io/flutter/firebaseauth/FirebaseAuthPlugin.java
+++ b/packages/firebase_auth/android/src/main/java/io/flutter/firebaseauth/FirebaseAuthPlugin.java
@@ -4,7 +4,6 @@
 
 package io.flutter.firebaseauth;
 
-import android.app.Activity;
 import android.support.annotation.NonNull;
 import android.util.SparseArray;
 import com.google.android.gms.tasks.OnCompleteListener;
@@ -30,7 +29,7 @@
 
 /** Flutter plugin for Firebase Auth. */
 public class FirebaseAuthPlugin implements MethodCallHandler {
-  private final Activity activity;
+  private final PluginRegistry.Registrar registrar;
   private final FirebaseAuth firebaseAuth;
   private final SparseArray<FirebaseAuth.AuthStateListener> authStateListeners =
       new SparseArray<>();
@@ -44,13 +43,13 @@
   public static void registerWith(PluginRegistry.Registrar registrar) {
     MethodChannel channel =
         new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_auth");
-    channel.setMethodCallHandler(new FirebaseAuthPlugin(registrar.activity(), channel));
+    channel.setMethodCallHandler(new FirebaseAuthPlugin(registrar, channel));
   }
 
-  private FirebaseAuthPlugin(Activity activity, MethodChannel channel) {
-    this.activity = activity;
+  private FirebaseAuthPlugin(PluginRegistry.Registrar registrar, MethodChannel channel) {
+    this.registrar = registrar;
     this.channel = channel;
-    FirebaseApp.initializeApp(activity);
+    FirebaseApp.initializeApp(registrar.context());
     this.firebaseAuth = FirebaseAuth.getInstance();
   }
 
@@ -112,7 +111,7 @@
     firebaseAuth
         .getCurrentUser()
         .linkWithCredential(credential)
-        .addOnCompleteListener(activity, new SignInCompleteListener(result));
+        .addOnCompleteListener(new SignInCompleteListener(result));
   }
 
   private void handleCurrentUser(MethodCall call, final Result result) {
@@ -131,9 +130,7 @@
   }
 
   private void handleSignInAnonymously(MethodCall call, final Result result) {
-    firebaseAuth
-        .signInAnonymously()
-        .addOnCompleteListener(activity, new SignInCompleteListener(result));
+    firebaseAuth.signInAnonymously().addOnCompleteListener(new SignInCompleteListener(result));
   }
 
   private void handleCreateUserWithEmailAndPassword(MethodCall call, final Result result) {
@@ -144,7 +141,7 @@
 
     firebaseAuth
         .createUserWithEmailAndPassword(email, password)
-        .addOnCompleteListener(activity, new SignInCompleteListener(result));
+        .addOnCompleteListener(new SignInCompleteListener(result));
   }
 
   private void handleSignInWithEmailAndPassword(MethodCall call, final Result result) {
@@ -155,7 +152,7 @@
 
     firebaseAuth
         .signInWithEmailAndPassword(email, password)
-        .addOnCompleteListener(activity, new SignInCompleteListener(result));
+        .addOnCompleteListener(new SignInCompleteListener(result));
   }
 
   private void handleSignInWithGoogle(MethodCall call, final Result result) {
@@ -166,7 +163,7 @@
     AuthCredential credential = GoogleAuthProvider.getCredential(idToken, accessToken);
     firebaseAuth
         .signInWithCredential(credential)
-        .addOnCompleteListener(activity, new SignInCompleteListener(result));
+        .addOnCompleteListener(new SignInCompleteListener(result));
   }
 
   private void handleLinkWithGoogleCredential(MethodCall call, final Result result) {
@@ -178,7 +175,7 @@
     firebaseAuth
         .getCurrentUser()
         .linkWithCredential(credential)
-        .addOnCompleteListener(activity, new SignInCompleteListener(result));
+        .addOnCompleteListener(new SignInCompleteListener(result));
   }
 
   private void handleSignInWithFacebook(MethodCall call, final Result result) {
@@ -188,7 +185,7 @@
     AuthCredential credential = FacebookAuthProvider.getCredential(accessToken);
     firebaseAuth
         .signInWithCredential(credential)
-        .addOnCompleteListener(activity, new SignInCompleteListener(result));
+        .addOnCompleteListener(new SignInCompleteListener(result));
   }
 
   private void handleSignInWithCustomToken(MethodCall call, final Result result) {
@@ -196,7 +193,7 @@
     String token = arguments.get("token");
     firebaseAuth
         .signInWithCustomToken(token)
-        .addOnCompleteListener(activity, new SignInCompleteListener(result));
+        .addOnCompleteListener(new SignInCompleteListener(result));
   }
 
   private void handleSignOut(MethodCall call, final Result result) {
diff --git a/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FirebaseMessagingPlugin.java b/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FirebaseMessagingPlugin.java
index 3a8fc8e..374b2db 100644
--- a/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FirebaseMessagingPlugin.java
+++ b/packages/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FirebaseMessagingPlugin.java
@@ -4,7 +4,6 @@
 
 package io.flutter.plugins.firebasemessaging;
 
-import android.app.Activity;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -26,28 +25,27 @@
 /** FirebaseMessagingPlugin */
 public class FirebaseMessagingPlugin extends BroadcastReceiver
     implements MethodCallHandler, NewIntentListener {
-  private final Activity activity;
+  private final Registrar registrar;
   private final MethodChannel channel;
 
   private static final String CLICK_ACTION_VALUE = "FLUTTER_NOTIFICATION_CLICK";
 
   public static void registerWith(Registrar registrar) {
     final MethodChannel channel = new MethodChannel(registrar.messenger(), "firebase_messaging");
-    final FirebaseMessagingPlugin plugin =
-        new FirebaseMessagingPlugin(registrar.activity(), channel);
+    final FirebaseMessagingPlugin plugin = new FirebaseMessagingPlugin(registrar, channel);
     registrar.addNewIntentListener(plugin);
     channel.setMethodCallHandler(plugin);
   }
 
-  private FirebaseMessagingPlugin(Activity activity, MethodChannel channel) {
-    this.activity = activity;
+  private FirebaseMessagingPlugin(Registrar registrar, MethodChannel channel) {
+    this.registrar = registrar;
     this.channel = channel;
-    FirebaseApp.initializeApp(activity);
+    FirebaseApp.initializeApp(registrar.context());
 
     IntentFilter intentFilter = new IntentFilter();
     intentFilter.addAction(FlutterFirebaseInstanceIDService.ACTION_TOKEN);
     intentFilter.addAction(FlutterFirebaseMessagingService.ACTION_REMOTE_MESSAGE);
-    LocalBroadcastManager manager = LocalBroadcastManager.getInstance(activity);
+    LocalBroadcastManager manager = LocalBroadcastManager.getInstance(registrar.context());
     manager.registerReceiver(this, intentFilter);
   }
 
@@ -68,8 +66,10 @@
   @Override
   public void onMethodCall(MethodCall call, Result result) {
     if ("configure".equals(call.method)) {
-      FlutterFirebaseInstanceIDService.broadcastToken(activity);
-      sendMessageFromIntent("onLaunch", activity.getIntent());
+      FlutterFirebaseInstanceIDService.broadcastToken(registrar.context());
+      if (registrar.activity() != null) {
+        sendMessageFromIntent("onLaunch", registrar.activity().getIntent());
+      }
       result.success(null);
     } else if ("subscribeToTopic".equals(call.method)) {
       String topic = call.arguments();
diff --git a/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FirebaseStoragePlugin.java b/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FirebaseStoragePlugin.java
index b9c7aef..013fb97 100755
--- a/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FirebaseStoragePlugin.java
+++ b/packages/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FirebaseStoragePlugin.java
@@ -4,7 +4,6 @@
 
 package io.flutter.plugins.firebase.storage;
 
-import android.app.Activity;
 import android.net.Uri;
 import android.support.annotation.NonNull;
 import com.google.android.gms.tasks.OnFailureListener;
@@ -29,11 +28,11 @@
 
   public static void registerWith(Registrar registrar) {
     final MethodChannel channel = new MethodChannel(registrar.messenger(), "firebase_storage");
-    channel.setMethodCallHandler(new FirebaseStoragePlugin(registrar.activity()));
+    channel.setMethodCallHandler(new FirebaseStoragePlugin(registrar));
   }
 
-  private FirebaseStoragePlugin(Activity activity) {
-    FirebaseApp.initializeApp(activity);
+  private FirebaseStoragePlugin(Registrar registrar) {
+    FirebaseApp.initializeApp(registrar.context());
     this.firebaseStorage = FirebaseStorage.getInstance();
   }
 
diff --git a/packages/google_sign_in/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java b/packages/google_sign_in/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java
index 6071de5..1cc52a5 100755
--- a/packages/google_sign_in/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java
+++ b/packages/google_sign_in/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java
@@ -121,7 +121,7 @@
 
     private static final String STATE_RESOLVING_ERROR = "resolving_error";
 
-    private final PluginRegistry.Registrar mRegistrar;
+    private final PluginRegistry.Registrar registrar;
     private final Handler handler = new Handler();
     private final BackgroundTaskRunner backgroundTaskRunner = new BackgroundTaskRunner(1);
 
@@ -132,10 +132,10 @@
     private volatile GoogleSignInAccount currentAccount;
 
     public Delegate(PluginRegistry.Registrar registrar) {
-      mRegistrar = registrar;
-      Application application = (Application) mRegistrar.context();
+      this.registrar = registrar;
+      Application application = (Application) registrar.context();
       application.registerActivityLifecycleCallbacks(handler);
-      mRegistrar.addActivityResultListener(handler);
+      registrar.addActivityResultListener(handler);
     }
 
     /** Returns the most recently signed-in account, or null if there was none. */
@@ -168,13 +168,13 @@
         // TODO(jackson): Perhaps we should provide a mechanism to override this
         // behavior.
         int clientIdIdentifier =
-            mRegistrar
+            registrar
                 .context()
                 .getResources()
                 .getIdentifier(
-                    "default_web_client_id", "string", mRegistrar.context().getPackageName());
+                    "default_web_client_id", "string", registrar.context().getPackageName());
         if (clientIdIdentifier != 0) {
-          optionsBuilder.requestIdToken(mRegistrar.context().getString(clientIdIdentifier));
+          optionsBuilder.requestIdToken(registrar.context().getString(clientIdIdentifier));
         }
         for (String scope : requestedScopes) {
           optionsBuilder.requestScopes(new Scope(scope));
@@ -185,7 +185,7 @@
 
         this.requestedScopes = requestedScopes;
         googleApiClient =
-            new GoogleApiClient.Builder(mRegistrar.context())
+            new GoogleApiClient.Builder(registrar.context())
                 .addApi(Auth.GOOGLE_SIGN_IN_API, optionsBuilder.build())
                 .addConnectionCallbacks(handler)
                 .addOnConnectionFailedListener(handler)
@@ -224,13 +224,13 @@
      * were requested.
      */
     public void signIn(Result result) {
-      if (mRegistrar.activity() == null) {
+      if (registrar.activity() == null) {
         throw new IllegalStateException("signIn needs a foreground activity");
       }
       checkAndSetPendingOperation(METHOD_SIGN_IN, result);
 
       Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
-      mRegistrar.activity().startActivityForResult(signInIntent, REQUEST_CODE);
+      registrar.activity().startActivityForResult(signInIntent, REQUEST_CODE);
     }
 
     /**
@@ -251,7 +251,7 @@
             public String call() throws Exception {
               Account account = new Account(email, "com.google");
               String scopesStr = "oauth2:" + Joiner.on(' ').join(requestedScopes);
-              return GoogleAuthUtil.getToken(mRegistrar.context(), account, scopesStr);
+              return GoogleAuthUtil.getToken(registrar.context(), account, scopesStr);
             }
           };
 
@@ -417,14 +417,14 @@
 
       @Override
       public void onActivityStarted(Activity activity) {
-        if (!resolvingError && activity == mRegistrar.activity() && googleApiClient != null) {
+        if (!resolvingError && activity == registrar.activity() && googleApiClient != null) {
           googleApiClient.connect();
         }
       }
 
       @Override
       public void onActivityStopped(Activity activity) {
-        if (activity == mRegistrar.activity() && googleApiClient != null) {
+        if (activity == registrar.activity() && googleApiClient != null) {
           googleApiClient.disconnect();
         }
       }
@@ -452,19 +452,19 @@
         if (resolvingError) {
           // Already attempting to resolve an error.
           return;
-        } else if (result.hasResolution() && mRegistrar.activity() != null) {
+        } else if (result.hasResolution() && registrar.activity() != null) {
           resolvingError = true;
           try {
-            result.startResolutionForResult(mRegistrar.activity(), REQUEST_CODE_RESOLVE_ERROR);
+            result.startResolutionForResult(registrar.activity(), REQUEST_CODE_RESOLVE_ERROR);
           } catch (SendIntentException e) {
             resolvingError = false;
             finishWithError(ERROR_REASON_CONNECTION_FAILED, String.valueOf(result.getErrorCode()));
           }
-        } else if (mRegistrar.activity() != null) {
+        } else if (registrar.activity() != null) {
           resolvingError = true;
           GoogleApiAvailability.getInstance()
               .showErrorDialogFragment(
-                  mRegistrar.activity(),
+                  registrar.activity(),
                   result.getErrorCode(),
                   REQUEST_CODE_RESOLVE_ERROR,
                   new DialogInterface.OnCancelListener() {
diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java
index 784e335..ec6fdf6 100644
--- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java
+++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java
@@ -37,23 +37,23 @@
   private static final int SOURCE_CAMERA = 1;
   private static final int SOURCE_GALLERY = 2;
 
-  private Activity activity;
-
   private static final DefaultCameraModule cameraModule = new DefaultCameraModule();
 
+  private final PluginRegistry.Registrar registrar;
+
   // Pending method call to obtain an image
   private Result pendingResult;
   private MethodCall methodCall;
 
   public static void registerWith(PluginRegistry.Registrar registrar) {
     final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL);
-    final ImagePickerPlugin instance = new ImagePickerPlugin(registrar.activity());
+    final ImagePickerPlugin instance = new ImagePickerPlugin(registrar);
     registrar.addActivityResultListener(instance);
     channel.setMethodCallHandler(instance);
   }
 
-  private ImagePickerPlugin(Activity activity) {
-    this.activity = activity;
+  private ImagePickerPlugin(PluginRegistry.Registrar registrar) {
+    this.registrar = registrar;
   }
 
   @Override
@@ -63,6 +63,12 @@
       return;
     }
 
+    Activity activity = registrar.activity();
+    if (activity == null) {
+      result.error("no_activity", "image_picker plugin requires a foreground activity.", null);
+      return;
+    }
+
     pendingResult = result;
     methodCall = call;
 
@@ -106,7 +112,7 @@
     if (requestCode == REQUEST_CODE_CAMERA) {
       if (resultCode == Activity.RESULT_OK) {
         cameraModule.getImage(
-            activity,
+            registrar.context(),
             data,
             new OnImageReadyListener() {
               @Override
diff --git a/packages/local_auth/android/src/main/java/io/flutter/plugins/localauth/LocalAuthPlugin.java b/packages/local_auth/android/src/main/java/io/flutter/plugins/localauth/LocalAuthPlugin.java
index b37a2bf..f56806c 100644
--- a/packages/local_auth/android/src/main/java/io/flutter/plugins/localauth/LocalAuthPlugin.java
+++ b/packages/local_auth/android/src/main/java/io/flutter/plugins/localauth/LocalAuthPlugin.java
@@ -15,18 +15,18 @@
 
 /** LocalAuthPlugin */
 public class LocalAuthPlugin implements MethodCallHandler {
-  private final Activity activity;
+  private final Registrar registrar;
   private final AtomicBoolean authInProgress = new AtomicBoolean(false);
 
   /** Plugin registration. */
   public static void registerWith(Registrar registrar) {
     final MethodChannel channel =
         new MethodChannel(registrar.messenger(), "plugins.flutter.io/local_auth");
-    channel.setMethodCallHandler(new LocalAuthPlugin(registrar.activity()));
+    channel.setMethodCallHandler(new LocalAuthPlugin(registrar));
   }
 
-  private LocalAuthPlugin(Activity activity) {
-    this.activity = activity;
+  private LocalAuthPlugin(Registrar registrar) {
+    this.registrar = registrar;
   }
 
   @Override
@@ -40,6 +40,11 @@
         result.error("auth_in_progress", "Authentication in progress", null);
         return;
       }
+      Activity activity = registrar.activity();
+      if (activity == null) {
+        result.error("no_activity", "local_auth plugin requires a foreground activity", null);
+        return;
+      }
       AuthenticationHelper authenticationHelper =
           new AuthenticationHelper(
               activity,
diff --git a/packages/package_info/android/src/main/java/io/flutter/plugins/packageinfo/PackageInfoPlugin.java b/packages/package_info/android/src/main/java/io/flutter/plugins/packageinfo/PackageInfoPlugin.java
index 58863a2..4c38019 100644
--- a/packages/package_info/android/src/main/java/io/flutter/plugins/packageinfo/PackageInfoPlugin.java
+++ b/packages/package_info/android/src/main/java/io/flutter/plugins/packageinfo/PackageInfoPlugin.java
@@ -15,22 +15,23 @@
 
 /** PackageInfoPlugin */
 public class PackageInfoPlugin implements MethodCallHandler {
-  private final Context context;
+  private final Registrar mRegistrar;
 
   /** Plugin registration. */
   public static void registerWith(Registrar registrar) {
     final MethodChannel channel =
         new MethodChannel(registrar.messenger(), "plugins.flutter.io/package_info");
-    channel.setMethodCallHandler(new PackageInfoPlugin(registrar.context()));
+    channel.setMethodCallHandler(new PackageInfoPlugin(registrar));
   }
 
-  private PackageInfoPlugin(Context context) {
-    this.context = context;
+  private PackageInfoPlugin(Registrar registrar) {
+    this.mRegistrar = registrar;
   }
 
   @Override
   public void onMethodCall(MethodCall call, Result result) {
     try {
+      Context context = mRegistrar.context();
       PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
       switch (call.method) {
         case "getVersion":
diff --git a/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java b/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java
index 4836569..d56cb2b 100644
--- a/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java
+++ b/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java
@@ -4,7 +4,6 @@
 
 package io.flutter.plugins.pathprovider;
 
-import android.content.Context;
 import android.os.Environment;
 import io.flutter.plugin.common.MethodCall;
 import io.flutter.plugin.common.MethodChannel;
@@ -14,17 +13,17 @@
 import io.flutter.util.PathUtils;
 
 public class PathProviderPlugin implements MethodCallHandler {
-  private final Context context;
+  private final Registrar mRegistrar;
 
   public static void registerWith(Registrar registrar) {
     MethodChannel channel =
         new MethodChannel(registrar.messenger(), "plugins.flutter.io/path_provider");
-    PathProviderPlugin instance = new PathProviderPlugin(registrar.context());
+    PathProviderPlugin instance = new PathProviderPlugin(registrar);
     channel.setMethodCallHandler(instance);
   }
 
-  private PathProviderPlugin(Context context) {
-    this.context = context;
+  private PathProviderPlugin(Registrar registrar) {
+    this.mRegistrar = registrar;
   }
 
   @Override
@@ -45,11 +44,11 @@
   }
 
   private String getPathProviderTemporaryDirectory() {
-    return context.getCacheDir().getPath();
+    return mRegistrar.context().getCacheDir().getPath();
   }
 
   private String getPathProviderApplicationDocumentsDirectory() {
-    return PathUtils.getDataDirectory(context);
+    return PathUtils.getDataDirectory(mRegistrar.context());
   }
 
   private String getPathProviderStorageDirectory() {
diff --git a/packages/quick_actions/android/src/main/java/io/flutter/plugins/quickactions/QuickActionsPlugin.java b/packages/quick_actions/android/src/main/java/io/flutter/plugins/quickactions/QuickActionsPlugin.java
index f2f1fb1..7bc7b70 100644
--- a/packages/quick_actions/android/src/main/java/io/flutter/plugins/quickactions/QuickActionsPlugin.java
+++ b/packages/quick_actions/android/src/main/java/io/flutter/plugins/quickactions/QuickActionsPlugin.java
@@ -25,15 +25,16 @@
 /** QuickActionsPlugin */
 @SuppressWarnings("unchecked")
 public class QuickActionsPlugin implements MethodCallHandler {
-  private final Context context;
+  private final Registrar registrar;
+
   // Channel is a static field because it needs to be accessible to the
   // {@link ShortcutHandlerActivity} which has to be a static class with
   // no-args constructor.
   // It is also mutable because it is derived from {@link Registrar}.
   private static MethodChannel channel;
 
-  private QuickActionsPlugin(Context context) {
-    this.context = context;
+  private QuickActionsPlugin(Registrar registrar) {
+    this.registrar = registrar;
   }
 
   /** Plugin registration. */
@@ -42,7 +43,7 @@
       throw new IllegalStateException("You should not call registerWith more than once.");
     }
     channel = new MethodChannel(registrar.messenger(), "plugins.flutter.io/quick_actions");
-    channel.setMethodCallHandler(new QuickActionsPlugin(registrar.context()));
+    channel.setMethodCallHandler(new QuickActionsPlugin(registrar));
   }
 
   @Override
@@ -54,6 +55,7 @@
       result.success(null);
       return;
     }
+    Context context = registrar.context();
     ShortcutManager shortcutManager =
         (ShortcutManager) context.getSystemService(Context.SHORTCUT_SERVICE);
     switch (call.method) {
@@ -75,6 +77,7 @@
   @SuppressLint("NewApi")
   private List<ShortcutInfo> deserializeShortcuts(List<Map<String, String>> shortcuts) {
     List<ShortcutInfo> shortcutInfos = new ArrayList<>();
+    Context context = registrar.context();
     for (Map<String, String> shortcut : shortcuts) {
       String icon = shortcut.get("icon");
       String type = shortcut.get("type");
diff --git a/packages/video_player/android/src/main/java/io/flutter/videoplayer/VideoPlayerPlugin.java b/packages/video_player/android/src/main/java/io/flutter/videoplayer/VideoPlayerPlugin.java
index 338c042..14de0f8 100644
--- a/packages/video_player/android/src/main/java/io/flutter/videoplayer/VideoPlayerPlugin.java
+++ b/packages/video_player/android/src/main/java/io/flutter/videoplayer/VideoPlayerPlugin.java
@@ -10,7 +10,6 @@
 import android.media.MediaPlayer;
 import android.os.Build;
 import android.view.Surface;
-import io.flutter.plugin.common.BinaryMessenger;
 import io.flutter.plugin.common.EventChannel;
 import io.flutter.plugin.common.MethodCall;
 import io.flutter.plugin.common.MethodChannel;
@@ -172,22 +171,24 @@
   public static void registerWith(Registrar registrar) {
     final MethodChannel channel =
         new MethodChannel(registrar.messenger(), "flutter.io/videoPlayer");
-    channel.setMethodCallHandler(
-        new VideoPlayerPlugin(registrar.messenger(), registrar.textures()));
+    channel.setMethodCallHandler(new VideoPlayerPlugin(registrar));
   }
 
-  private VideoPlayerPlugin(BinaryMessenger messenger, TextureRegistry textures) {
-    this.textures = textures;
+  private VideoPlayerPlugin(Registrar registrar) {
+    this.registrar = registrar;
     this.videoPlayers = new HashMap<>();
-    this.messenger = messenger;
   }
 
   private final Map<Long, VideoPlayer> videoPlayers;
-  private final TextureRegistry textures;
-  private final BinaryMessenger messenger;
+  private final Registrar registrar;
 
   @Override
   public void onMethodCall(MethodCall call, Result result) {
+    TextureRegistry textures = registrar.textures();
+    if (textures == null) {
+      result.error("no_activity", "video_player plugin requires a foreground activity", null);
+      return;
+    }
     if (call.method.equals("init")) {
       for (VideoPlayer player : videoPlayers.values()) {
         player.dispose();
@@ -196,7 +197,8 @@
     } else if (call.method.equals("create")) {
       TextureRegistry.SurfaceTextureEntry handle = textures.createSurfaceTexture();
       EventChannel eventChannel =
-          new EventChannel(messenger, "flutter.io/videoPlayer/videoEvents" + handle.id());
+          new EventChannel(
+              registrar.messenger(), "flutter.io/videoPlayer/videoEvents" + handle.id());
       VideoPlayer player =
           new VideoPlayer(eventChannel, handle, (String) call.argument("dataSource"), result);
       videoPlayers.put(handle.id(), player);