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);
